Установка моей библиотеки для LD_PRELOAD заставляет некоторые процессы вызывать ошибки загрузчика - PullRequest
10 голосов
/ 08 декабря 2010

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

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

Это после того, как я установил LD_PRELOAD переменную окружения на /home/dumindara/random/sotest/a.out.

a.out имеет тестовую malloc функцию и вызывает dlsym внутри.

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

Ответы [ 2 ]

24 голосов
/ 24 октября 2012

Я не могу прокомментировать принятый ответ, однако стоит упомянуть, что здесь может возникнуть проблема с неправильной связью libdl.so.2, когда -ldl используется перед командой компиляции (при условии, что связывание и компиляция выполняется той же командой, это возможно, поскольку библиотеки LD_PRELOAD обычно основаны на одном исходном файле).

Итак, назовите gcc с -ldl в конце:

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

В моем случае наличие -ldl спереди привело к ошибке, такой же, как в вопросе:

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

15 голосов
/ 08 декабря 2010

Я предполагаю, что ваш файл a.out является общим объектом, а не исполняемым файлом, и продолжаем ...

dlsym() - это функция из библиотеки libdl, которая обычно находится в libdl.so.2 общий объект в современных системах Linux.

Я рискну предположить, что ваш общий объект a.out не связан с libdl.Это означает, что когда вы предварительно загружаете простой двоичный файл, такой как uname, который не загружает много других библиотек, libdl.so.2 может не быть загружен, и вы получите неопределенную ошибку символа.

If, onс другой стороны, вы предварительно загружаете его в двоичный файл, который связан с libdl.so.2 и, наконец, извлекаете его, ваш общий объект работает нормально.

Я бы проверил с помощью ldd, является ли ваш собственный общий объектсвязаны с libdl, как и должно, а также с тем, какие библиотеки прямо или косвенно извлекаются при запуске uname и ls.

EDIT:

Я только что подтвердил это.Способ исправить эту ошибку - связать ваш общий объект с libdl.Добавление -ldl к его LDFLAGS должно помочь.

...