使用Cgo时“动态符号的意外R_X86_64_64重定位”

时间:2011-05-28 17:05:50

标签: go

我正在尝试使用Cgo为C库创建绑定。我有一个包使用Cgo导入库并进行一些调用。它编译和安装很好。但是当尝试从Go程序中使用该包时,我在链接时得到错误“动态符号的意外R_X86_64_64重定位”。

有什么想法吗?

3 个答案:

答案 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 - 我自己很难找到它。