«Ошибка поиска символа» при доступе к функциональности libmysqlclient.so в C - PullRequest
0 голосов
/ 06 октября 2010

Контекст: Я не уверен, является ли это моей проблемой или проблемой сервера, на котором он работает. Я пытаюсь скомпилировать и запустить небольшую утилиту, чтобы стать заданием cron, использующим библиотеки mysql. Программа успешно компилируется с помощью следующей команды, без ошибок и предупреждений:

gcc my_program.c -o my_program -I /usr/include/mysql/ -L/usr/include/mysql -lmysqlclient -lglib-2.0 -Wall

Я добавил -lglib-2.0, потому что ...

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

./my_program: symbol lookup error: /usr/lib/libmysqlclient.so.15: undefined symbol: strcpy, version GLIBC_2.0

Ошибка возникает во время выполнения в следующей строке:

conn = mysql_init(conn);

conn объявлен как MYSQL *conn;, это первый раз, когда я использую что-либо из mysql.h (кроме объявлений), и strcpy отлично работает, если я использую его в my_program.c.

Библиотеки, связанные с libmysqlclient.so.15:

ldd /usr/lib/libmysqlclient.so.15
    linux-gate.so.1 =>  (0xb7ef6000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7cf4000)
    libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7cc2000)
    libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7ca9000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c84000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7c6f000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b20000)
    /lib/ld-linux.so.2 (0xb7ef7000)

Могу ли я что-нибудь сделать в своем коде, в моей компиляции или компоновке параметров что-то отсутствует, или есть проблема с динамическим компоновкой библиотеки libmysqlclient.so.15, которая находится внутри самой библиотеки? Если последнее (что я не думаю, учитывая, что библиотека mysql используется в других местах на сервере AFAIK), что может сделать администратор сервера, чтобы решить проблему?

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Мои извинения, я нашел проблему. На самом деле это была не ошибка поиска символа, а ошибка сегментации. Поскольку я вызвал mysql_init с неинициализированным conn вместо NULL для инициализации, libmysqlclient должен был выйти из строя и по причинам, не зависящим от моих ограниченных знаний о C, выдать неправильное сообщение об ошибке.

Отладка в другой системе с другой сборкой той же ОС вызвала правильную ошибку, которую было намного легче отладить.

1 голос
/ 12 октября 2010

Попробуйте передать флаг -rdynamic на gcc.

Так как я не должен заливать раздел комментариев:

GLIBC_2.0 - это макрос, определенный в libc.so.6. Так что в вашей системе libc.so.6 - это реализация библиотеки GNU для C.

Если вы все еще сталкиваетесь с проблемами, вполне возможно, что libmysqlclient.so.15 был построен на другой версии libc.so.6 и ожидает другие символы. В этом случае вам, возможно, придется пересобрать libmysqlclient.so из исходного кода, чтобы связать его с библиотеками системы, или посмотреть, доступна ли обновленная версия для вашей платформы.

...