为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL UDF 返回“错误代码:1127。在库中找不到符号 'xx'”

MySQL UDF 返回“错误代码:1127。在库中找不到符号 'xx'”

Go
RISEBY 2022-05-18 15:29:11
我有一个用 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_param00000000000f21f0 T _cgoexp_38fa52dfc07b_get_url_param00000000000f20c0 T _cgoexp_38fa52dfc07b_get_url_param_deinit00000000000f2130 T _cgoexp_38fa52dfc07b_get_url_param_init00000000000f2af0 T get_url_param00000000000f2a00 T get_url_param_deinit00000000000f2a70 T get_url_param_init00000000000f2250 t main._cgoexpwrap_38fa52dfc07b_get_url_param00000000000f2690 t main._cgoexpwrap_38fa52dfc07b_get_url_param.func100000000000f2120 t main._cgoexpwrap_38fa52dfc07b_get_url_param_deinit00000000000f2190 t main._cgoexpwrap_38fa52dfc07b_get_url_param_init00000000000f24f0 t main.get_url_param00000000000f2460 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_param0000000000109360 T _cgoexp_d994eb9c9c89_get_url_param0000000000109230 T _cgoexp_d994eb9c9c89_get_url_param_deinit00000000001092a0 T _cgoexp_d994eb9c9c89_get_url_param_init0000000000109a50 T get_url_param0000000000109960 T get_url_param_deinit00000000001099d0 T get_url_param_init00000000001093c0 t main._cgoexpwrap_d994eb9c9c89_get_url_param0000000000109820 t main._cgoexpwrap_d994eb9c9c89_get_url_param.func1一切看起来都不错。而且我可以告诉我我正在检查正确的文件,因为所有地址都不同(另外还有一个新行main.get_url_param.stkobj)。但是这次尝试添加它给了我关于 MySQL 如何在库中找不到符号的错误。我非常确定编译命令保持不变,并且我认为它与 Go 版本没有任何关系,因为我测试回 Go 1.9 并且它做同样的事情,但仍然无法正常工作。我已经上传了二进制文件和版本,旧版本可以运行,新版本不可用。两个 .so 文件都以相同的方式复制到我的插件目录,所以我认为这与权限无关。此外,Go func 名称为小写肯定与此无关,因为即使我将函数重命名为 ,行为也是完全相同的GetURLParam,并且我可以看到导出为nm.我确定我错过了一些东西,可能是编译命令,或者可能是一些 cgo 标志,但我不知道那会是什么。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

在过去,我遇到了同样的问题,并且(仅)重新启动服务器有帮助。如果我正确地记住了,一些东西被缓存了,甚至一个完全重新编译/替换的库文件也没有正确重新加载。

所以:

  1. 重新编译插件

  2. 使用相同的 OS / MySQL 版本在不同的机器上测试

  3. 复制到生产机器

  4. 重启生产机器

  5. 评估


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信