我正在尝试使用Cgo为C库创建绑定。我有一个包使用Cgo导入库并进行一些调用。它编译和安装很好。但是当尝试从Go程序中使用该包时,我在链接时得到错误“动态符号的意外R_X86_64_64重定位”。
有什么想法吗?
答案 0 :(得分:1)
它出现在6g
编译器的assembly generation例程中:
case 256 + R_X86_64_64:
if(targ->dynimpname != nil && !targ->dynexport)
diag("unexpected R_X86_64_64 relocation for dynamic symbol %s",
targ->name);
r->type = D_ADDR;
return;
R_X86_64_64
是库中符号的一种类型。有关amd64
架构咨询页面~70 here。
是否可以将386
已编译的库与amd64
代码混合使用?
编译器应报告导致问题的确切符号。您是否可以尝试使用包含其他符号的最小库进行链接,并尝试找到失败的最小示例?
您是否设法将cgo
用于任何图书馆?
答案 1 :(得分:0)
我同意Elazar的观点,认为混合使用32位和64位代码似乎是合理的。
你试过gccgo吗?
答案 2 :(得分:0)
像魅力一样:
root@Ubuntu-1304-raring-64-minimal:/etc# uname -a
Linux Ubuntu-1304-raring-64-minimal 3.8.13.4 #2 SMP Mon Jul 8 23:59:05 CEST 2013 x86_64 x86_64 x86_64 GNU/Linux
执行此序列:
cd /usr/local
mkdir /var/go
apt-get install mercurial
hg clone https://code.google.com/p/go/
之后使用以下内容创建/etc/profile.d/go.sh并使其可执行:
export GOPATH=/var/go
export GOROOT=/usr/local/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
export GOROOT_FINAL=/var/go
export GOHOSTARCH=amd64
export GOARCH=amd64
export CGO_ENABLED=1
然后重启你的shell。没有源xxx将正常工作 - 被警告!在新shell中执行此操作:
cd /usr/local/go/src
./make.bash
执行该操作,然后将所有内容从/ usr / local /复制到/ var / go - 或者有一种方法可以通过符号链接合并两个目录,无论您喜欢什么。在上面的go.sh脚本中注释GOROOT_FINAL之后再次重新启动shell。你可以使用最新的Go语言了!
root@Ubuntu-1304-raring-64-minimal:/usr/work/golang/go/src# go version
go version devel +35d5bae6aac8 Fri Oct 18 10:45:19 2013 +0400 linux/amd64
注意事项:需要重新启动两个shell - 我自己很难找到它。