MySQL UDF возвращает «Код ошибки: 1127. Не удается найти символ« xx »в библиотеке» - PullRequest
3 голосов
/ 27 февраля 2020

У меня есть MySQL UDF, записанный в Go, который работал нормально, но если я сейчас скомпилирую, он больше не работает, с сообщением об ошибке

Код ошибки: 1127. Не удается найти символ 'get_url_param' в библиотеке

UDF находится на GitHub здесь: https://github.com/StirlingMarketingGroup/mysql-get-url-param

Если я проверяю экспорт из старой скомпилированной файл, подобный этому

$ nm get_url_param.old.so | grep get_url_param
00000000000f21f0 T _cgoexp_38fa52dfc07b_get_url_param
00000000000f20c0 T _cgoexp_38fa52dfc07b_get_url_param_deinit
00000000000f2130 T _cgoexp_38fa52dfc07b_get_url_param_init
00000000000f2af0 T get_url_param
00000000000f2a00 T get_url_param_deinit
00000000000f2a70 T get_url_param_init
00000000000f2250 t main._cgoexpwrap_38fa52dfc07b_get_url_param
00000000000f2690 t main._cgoexpwrap_38fa52dfc07b_get_url_param.func1
00000000000f2120 t main._cgoexpwrap_38fa52dfc07b_get_url_param_deinit
00000000000f2190 t main._cgoexpwrap_38fa52dfc07b_get_url_param_init
00000000000f24f0 t main.get_url_param
00000000000f2460 t main.get_url_param_init

, и этот файл прекрасно работает при запуске

create function`get_url_param`returns string soname'get_url_param.so';

, но затем, когда я компилирую тот же точный код с той же командой

go build -buildmode=c-shared -o get_url_param.so

А затем проверьте экспорт таким же образом

$ nm get_url_param.so | grep get_url_param
0000000000109360 T _cgoexp_d994eb9c9c89_get_url_param
0000000000109230 T _cgoexp_d994eb9c9c89_get_url_param_deinit
00000000001092a0 T _cgoexp_d994eb9c9c89_get_url_param_init
0000000000109a50 T get_url_param
0000000000109960 T get_url_param_deinit
00000000001099d0 T get_url_param_init
00000000001093c0 t main._cgoexpwrap_d994eb9c9c89_get_url_param
0000000000109820 t main._cgoexpwrap_d994eb9c9c89_get_url_param.func1
0000000000357cb0 d main._cgoexpwrap_d994eb9c9c89_get_url_param.stkobj
0000000000109290 t main._cgoexpwrap_d994eb9c9c89_get_url_param_deinit
0000000000109300 t main._cgoexpwrap_d994eb9c9c89_get_url_param_init
0000000000109680 t main.get_url_param
0000000000357cd0 d main.get_url_param.stkobj
00000000001095f0 t main.get_url_param_init

Все выглядит правильно. И я могу сказать, что проверяю нужный файл, так как все адреса разные (плюс есть новая строка для того, что main.get_url_param.stkobj есть). Но попытка добавить его на этот раз дает мне ошибку о том, что MySQL не может найти символ в библиотеке.

Я уверен, что команды компиляции остались прежними, и я не думаю, что он имеет какое-то отношение к Go версиям, поскольку я тестировал обратно до Go 1.9, и он делает то же самое, все еще не работая.

Я загрузил оба бинарных файла, а также выпуски с старый, который работает , и новый, который не работает . Оба файла .so копируются одинаково в мою директорию плагинов, так что я не думаю, что это что-то с разрешениями. Кроме того, это определенно не имеет ничего общего с именем Go fun c в нижнем регистре, поскольку поведение точно такое же, даже если я переименую свою функцию в GetURLParam, и я могу видеть экспорт с помощью nm.

Я уверен, что что-то упустил, возможно, с помощью команды компиляции, или, может быть, некоторые cgo флаги, но я просто не представляю, что это будет.

1 Ответ

1 голос
/ 09 марта 2020

В прошлом у меня была такая же проблема, и (только) перезапуск сервера помог. Если я правильно помню, что-то было кэшировано, и даже полностью перекомпилированный / замененный файл библиотеки не был перезагружен правильно.

Итак:

  1. перекомпилируйте плагин
  2. test on другая машина, использующая ту же ОС / MySQL версия
  3. копирование на производственную машину
  4. перезагрузка производственной машины
  5. оценка
...