ld.so.preload не отличается x86_32 и x86_64

[12149] или, может быть быстрее [12150]
1
14.09.2014, 07:39
2 ответа

В вашем ld.so.preload вы хотите указать «$ LIB» в своем пути, а не явные «lib» или «lib64». Таким образом, в дистрибутиве в стиле Redhat "/usr/alternates/$LIB/libfoo.so" становится "/usr/alternates/lib/libfoo.so" для 32-битного процесса и "/ usr / alternates / lib64 /". libfoo.so "для 64-битного процесса. В дистрибутиве в стиле Debian "/usr/alternates/$LIB/libfoo.so" становится "/usr/alternates/lib/i386-linux-gnu/libfoo.so" и "/ usr / alternates / x86_64-linux-" gnu / libfoo.so "соответственно. Затем ваше дерево необходимо заполнить библиотеками для обеих архитектур.

См. «Расширение токена rpath» на ld.so (8) странице руководства для получения дополнительной информации.

Обратите внимание, что вместо предварительной загрузки библиотеки, если вы компилируете двоичные файлы, загрузку которых вы пытаетесь изменить, вам может быть лучше изменить пути, установив DT_RUNPATH в строке ссылки (используя те же пути в стиле "$ LIB", тем самым настраивая двоичный файл так, чтобы он предпочитал расположение вашей библиотеки системным значениям по умолчанию.

В качестве альтернативы, как отмечали другие, вы можете отредактировать файл ELF, чтобы установить DT_RUNPATH для двоичных файлов, которые вы не компилируется.

В системе x86_64 Centos 6.5 у меня работает следующее:

cd /tmp
mkdir lib lib64
wget http://carrera.databits.net/~ksb/msrc/local/lib/snoopy/snoopy.h
wget http://carrera.databits.net/~ksb/msrc/local/lib/snoopy/snoopy.c
gcc -m64 -shared -fPIC -ldl snoopy.c -o /tmp/lib64/snoopy.so
gcc -m32 -shared -fPIC -ldl snoopy.c -o /tmp/lib/snoopy.so
cat > true.c <<EOF
int main(void)
{ return 0; }
EOF
gcc -m64 true.c -o true64
gcc -m32 true.c -o true32
sudo bash -c "echo '/tmp/\$LIB/snoopy.so' > /etc/ld.so.preload"
strace -fo /tmp/strace64.out /tmp/true64
strace -fo /tmp/strace32.out /tmp/true32
sudo rm /etc/ld.so.preload"

В выводе strace strace64.out содержит:

open("/tmp/lib64/snoopy.so", O_RDONLY) = 3

, а strace32.out:

open("/tmp/lib/snoopy.so", O_RDONLY) = 3

Это с ld.so .preload содержимое:

/tmp/$LIB/snoopy.so
5
27.01.2020, 23:20

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

Предполагается, что немногие люди, которым требуется предварительная загрузка при запуске программ с несколькими архивами, не заботятся о безобидных сообщениях об ошибках.

В качестве альтернативы, если ваши программы, в свою очередь, не запускают другие программы с другой архитектурой, вы можете лучше использовать LD_PRELOAD только для программ с неправильными разделами библиотеки.

Но на самом деле вам лучше исправить библиотеки, перечисленные в файле ELF, желательно на этапе компиляции, но есть инструменты для редактирования файлов ELF позже.

(Примечание: сначала я подумал, что ваш вопрос будет о x64_32, который совершенно другой и содержит несколько интересных ошибок)

-1
27.01.2020, 23:20

Теги

Похожие вопросы