У меня есть программа на языке 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
Вы пробовали использовать 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 –
нм на x86: 00000a30 Т _plugin_tweak_products 000035f0 T _plugin_shutdown нм на x86_64: 00000000000036f0 T plugin_tweak_products 00000000000031f0 T plugin_shutdown –