MySQL UDF returns "Error Code: 1127. Can't find symbol 'xx' in library"

MySQL UDF returns "Error Code: 1127. Can't find symbol 'xx' in library"

我有一个用 Go 编写的 MySQL UDF,它曾经工作得很好,但如果我现在编译它就不再起作用,并显示错误消息

Error Code: 1127. Can't find symbol 'get_url_param' in library

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 并且它做了同样的事情,仍然无法正常工作。

我已经用 old one that works, and the new one that doesn't work 上传了二进制文件和发行版。两个 .so 文件都以相同的方式复制到我的插件目录,所以我认为这与权限无关。此外,这绝对与小写的 Go func 名称无关,因为即使我将函数重命名为 GetURLParam,行为也完全相同,并且我可以看到带有 nm 的导出。

我确定我遗漏了什么,可能是编译命令,或者一些 cgo 标志,但我不知道那是什么。

过去我遇到过同样的问题,(仅)重启服务器有帮助。如果我没记错的话,缓存了一些东西,甚至没有正确重新加载完整的 recompiled/replaced 库文件。

所以:

  1. 重新编译插件
  2. 使用相同 OS / MySQL 版本在不同机器上测试
  3. 复制到生产机器
  4. 重启生产机器
  5. 评估