我有一个用Go编写的MySQL UDF,它过去工作得很好,但如果我现在编译,它就不再工作了,并显示错误消息
错误代码: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函数的名称小写肯定与此无关,因为即使我将函数重命名为GetURLParam
,行为也完全相同,并且我可以看到nm
的导出。
我确信我遗漏了一些东西,可能是编译命令,也可能是一些cgo标志,但我不知道那会是什么。
过去我也遇到过同样的问题,(只是(重新启动服务器有帮助。如果我记忆正确,就会缓存一些内容,甚至完全重新编译/替换的库文件也不会正确重新加载。
因此:
- 重新编译插件
- 使用相同的OS/MySQL版本在不同的机器上测试
- 复制到生产机器
- 重新启动生产机器
- 评估