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

问题描述 投票:3回答:1

我有一个用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并执行相同的操作,但仍然无法正常工作。

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

[我确定我可能丢失了一些内容,可能与编译命令有关,或者与某些cgo标志有关,但我只是不知道那是什么。

我有一个用Go编写的MySQL UDF,以前可以正常工作,但是如果我现在进行编译,它将不再起作用,并显示错误消息错误代码:1127。在库The ...中找不到符号'get_url_param'...

mysql go cgo shared-objects mysql-udf
1个回答
0
投票

我已经在Ubuntu 18.04.04 LTS中尝试了1.0.1Alpha版本,并且编译成功。如何重新编译mysql而不是作为插件安装?

© www.soinside.com 2019 - 2024. All rights reserved.