динамически загружаемый объект, загруженный в программу на C, дает неопределенные ошибки символов в x86_64 - PullRequest
0 голосов
/ 14 июля 2010

У меня есть программа на C, которая динамически загружает файл .so во время выполнения для подключения к базе данных MySQL. На x86 (32-битном) ядре это работает нормально, но когда я перекомпилирую свою программу на x86_64 (64-битном) ядре, я получаю ошибки времени выполнения, такие как:

dlerror:   mysql-1.932-x86_64-freebsd7.2.so::plugin_tweak_products: Undefined symbol "plugin_filter_cart"
dlerror:   mysql-1.932-x86_64-freebsd7.2.so::plugin_shutdown: Undefined symbol "plugin_post_action"

Из приведенного выше сообщения об ошибке видно, что эта программа работает на компьютере с FreeBSD 7.2 x86_64. И программа C, и файл .so скомпилированы для 64-битной системы.

Я передаю RTLD_LAZY в dlopen () при загрузке .so файла. Я думаю, что проблема в том, что по какой-то причине на x86_64 он не загружает части библиотеки динамически, а на 32-битном x86. Есть ли какой-нибудь флаг, который я могу вставить в свой Makefile.am, чтобы он работал на x86_64? Есть другие идеи?

Вот, что перечисляет команда файла для моей программы на C

ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), for FreeBSD 7.2, dynamically linked (uses shared libs), FreeBSD-style, not stripped

и для .so файла

ELF 64-bit LSB shared object, x86-64, version 1 (FreeBSD), not stripped

Ответы [ 2 ]

0 голосов
/ 01 сентября 2010

Похоже, это было вызвано той же проблемой, что и

dlerror: неопределенный символ "_nss_cache_cycle_prevention_function" в FreeBSD 7.2

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

0 голосов
/ 14 июля 2010

Просто дикая догадка.Префикс plugin, кажется, указывает на то, что могут быть некоторые обратные вызовы с указателями функций.Также, вероятно, ваши версии компилятора не одинаковы для 32 и 64 бит?Используете ли вы функцию C99 или gcc inline?

Такие вещи могут произойти, если один вариант вашего компилятора может встроить какую-то функцию (static или inline), а другой - нет.Тогда внешний символ может быть произведен или нет.Это зависит от версии вашего компилятора, у gcc были разные стратегии для обработки таких ситуаций с течением времени.Попробуйте обеспечить реализацию функции хотя бы в одном из ваших объектов.И, как указывает roguenut, проверьте с помощью nm недостающие символы.

...