2016-04-25 8 views
3

Я хотел бы установить LD_PRELOAD, чтобы указать на общую библиотеку, где я могу запустить либо 64-битное, либо 32-битное приложение. Очевидно, что разделяемая библиотека и исполняемый файл должны совпадать в бит-ness.Использование смешанной среды 64 бит/32 бит LD_PRELOAD в Linux

$ LD_PRELOAD=/lib64/lib_init.so ./hello32 
ERROR: ld.so: object '/lib64/lib_init.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored 

где hello32 - это 32-разрядное приложение. Есть несколько страниц в мире, которые говорят, что я должен быть в состоянии сделать:

$ LD_PRELOAD='/$LIB/lib_init.so' ./hello32 
ERROR: ld.so: object '/$LIB/lib_init.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored 

Где $ LIB будет автоматически переключаться между Lib и lib64 в зависимости от того, является ли 32 или 64 приложения. Но, очевидно, это не сработает.

Есть ли какой-нибудь трюк, чтобы сделать эту работу? LD_PRELOAD_32, LD_PRELOAD_64? Спасибо!

+0

Я хотел бы использовать скрипт, который проверяет оберточную разрядность приложения и установить библиотеку соответственно – user3159253

+1

Старайтесь не указывать полный путь. Динамический компоновщик выбирает правильный, например. LD_PRELOAD = lib_init.so – kofemann

+0

@kofemann это именно то, что я искал. Не могли бы вы ответить на этот вопрос, чтобы я мог его одобрить. –

ответ

5

Указав полный путь к библиотеке, вы не позволяете динамическому компоновщику настраивать путь поиска в соответствии с архитектурой двоичных файлов. Определите только имя библиотеки и позвольте компоновщику выбрать нужную вам библиотеку. Например:

$ LD_PRELOAD=lib_init.so ./hello32 

будет искать lib_init.so в/Lib, в то время как

$ LD_PRELOAD=lib_init.so ./hello64 

будет искать в/lib64

2

Оказывается, что вы можете установить использование $ LIB при установке LD_PRELOAD (или установка файла /etc/ld.so.preload). Проблема в том, что значение, которое устанавливается в настройке $ LIB, зависит от вашего дистрибутива Linux. UGH!

В моем ограниченном тестировании я обнаружил, что системы на базе Redhat имеют $ LIB, расширяются до «lib64» для 64-битных приложений и «lib» для 32-битных приложений.

Однако в дистрибутивах на основе debian я обнаружил, что $ LIB расширяется до «lib/x86_64-linux-gnu» для 64-битных приложений и «lib/i386-linux-gnu» для 32-разрядных приложений. Я не смог найти документацию по этому вопросу, но я проверил это.

Это означает, что если у меня есть:

$ LD_PRELOAD='/$LIB/lib_init.so' ./hello64 

и на DEBiAN основе системы, как убунту у меня есть:

/lib/x86_64-linux-gnu/lib_init.so (for 64bit apps) 

и

/lib/i386-linux-gnu/lib_init.so (for 32bit apps) 

Это будет работать нормально (на компьютер, основанный на ubuntu)

В противном случае на основе распределения RedHat вам нужно

/lib64/lib_init.so and /lib/lib_init.so 

для 64 и 32-битных приложений.

Использование LD_PRELOAD = '/ $ LIB/lib_init.so' имеет то преимущество, что вы не зависите от значения $ LD_LIBRARY_PATH.

Только не забудьте одинарные кавычки при установке $ LIB в LD_PRELOAD

 Смежные вопросы

  • Нет связанных вопросов^_^