2014-09-22 2 views
0

Для демонстрации я сделал 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 считается недействительным и как я могу его проверить вручную?

ответ

0

Третье поле является «машиной», которое имеет значение 62 для amd64 (x86_64) и 3 для i386 (80386). Конечно, загрузчик проверит это поле, чтобы определить, может ли он использовать данную библиотеку, и если он не будет продолжать следующий путь в своем списке поиска.

+0

Хорошо, но как определить, совместима ли библиотека с текущей архитектурой? Я могу получить 18-19-е байты ELF, но я не знаю, как определить, соответствует ли этот код моей реальной архитектуре. Выполнение [[$ (readelf -h | grep $ (Machine :)) == \ * $ (uname -i) \ *]] безопасно? – Alcolo47

+0

Какова фактическая цель, которую вы пытаетесь достичь на более высоком уровне? –

+0

У меня есть общие папки на разных платформах, содержащих разные библиотеки для разных архитектур. В моем фактическом LD_LIBRARY_PATH есть все. Я хочу уменьшить его только с полезной папкой в ​​соответствии с архитектурой без использования соглашения об именах. – Alcolo47