LD_PRELOAD несколько взаимозависимых библиотек
У меня есть библиотеки с деревом зависимостей, то есть некоторые зависимости имеют другие зависимости, которые я хочу предварительно загрузить. Как я могу это сделать?
LD_PRELOAD \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libicudata.so.60 \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libicuuc.so.60 \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libicui18n.so.60 \
/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5 \
MyApp
LD_PRELOAD
Вызов call содержит сортировку, так что зависимости перечислены перед зависимой библиотекой.
Компоновщик выдает следующую ошибку:
ERROR: ld.so: object '/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Можно ли предварительно загружать библиотеки для выполнения зависимостей в правильном порядке?
1 ответ
Решение
Эта ошибка:
ld.so: object '/opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5' \
from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
означает, что динамический загрузчик попытался открыть библиотеку и потерпел неудачу.
Есть несколько возможных причин этого сбоя:
- Файл не существует (используйте
ls -L /opt/yocto/2.5.1/sysroots/core2-64-poky-linux/usr/lib/libQt5Core.so.5
чтобы подтвердить, что это делает - Файл для неправильной архитектуры (например, 32-битный ELF, когда
MyApp
является 64-битным или наоборот). использованиеfile MyApp
а такжеfile libQt5Core.so.5
чтобы подтвердить, что они совпадают. - Что-то другое. возможно
MyApp
был связан сnewlib
или жеuClibc
, ноlibQt5Core.so.5
был построен с GLIBC (или наоборот).