Для демонстрации я сделал 2 папки с 2-мя версиями libgcc_s.so.1 И я искал библиотеку выбора в соответствии с LDD:
> file {A,B}/libgcc_s.so.1
A/libgcc_s.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped
B/libgcc_s.so.1: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped
> LD_LIBRARY_PATH=A:B ldd MyProgram | grep libgcc_s.so.1
libgcc_s.so.1 => B/libgcc_s.so.1
Почему MyProgram не использует A/libgcc_s.so.1? Я понимаю, что это вопрос архитектуры, но как A/libgcc_s.so.1 считается недействительным и как я могу его проверить вручную?
Хорошо, но как определить, совместима ли библиотека с текущей архитектурой? Я могу получить 18-19-е байты ELF, но я не знаю, как определить, соответствует ли этот код моей реальной архитектуре. Выполнение [[$ (readelf -h | grep $ (Machine :)) == \ * $ (uname -i) \ *]] безопасно? – Alcolo47
Какова фактическая цель, которую вы пытаетесь достичь на более высоком уровне? –
У меня есть общие папки на разных платформах, содержащих разные библиотеки для разных архитектур. В моем фактическом LD_LIBRARY_PATH есть все. Я хочу уменьшить его только с полезной папкой в соответствии с архитектурой без использования соглашения об именах. – Alcolo47