Я предполагаю, что ваш файл 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 должно помочь.