2010-07-13 2 views
0

У меня есть программа на языке C, которая динамически загружает файл .so во время выполнения, чтобы подключиться к базе данных MySQL. На x86 (32bit) ядро ​​это работает отлично, но когда я перекомпилировать программу на ядре x86_64 (64 бит) я получаю ошибки во время выполнения, как это:динамически загруженный объект, загруженный в программу C, дает неопределенные ошибки символов на x86_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 
+0

Вы пробовали использовать nm [1] для опроса библиотеки, чтобы узнать, действительно ли она содержит эту функцию? Возможно, требуемая функция находится в другой библиотеке или иным образом включена в 32-битную сборку, но не в 64-разрядную версию. Используйте nm на 32-битной версии и проверьте различия. [1] http://www.freebsd.org/cgi/man.cgi?query=nm&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html –

+0

нм на x86: 00000a30 Т _plugin_tweak_products 000035f0 T _plugin_shutdown нм на x86_64: 00000000000036f0 T plugin_tweak_products 00000000000031f0 T plugin_shutdown –

ответ

0

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

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