【发布时间】:2011-05-28 17:05:50
【问题描述】:
我正在尝试使用 Cgo 为 C 库创建绑定。我有一个包,它使用 Cgo 导入库并对其进行一些调用。它编译和安装很好。但是,当尝试从 Go 程序中使用该包时,链接时出现错误“unexpected R_X86_64_64 relocation for dynamic symbol”。
有什么想法吗?
【问题讨论】:
-
您找到解决方案了吗?我的一个库遇到了完全相同的错误。
标签: go
我正在尝试使用 Cgo 为 C 库创建绑定。我有一个包,它使用 Cgo 导入库并对其进行一些调用。它编译和安装很好。但是,当尝试从 Go 程序中使用该包时,链接时出现错误“unexpected R_X86_64_64 relocation for dynamic symbol”。
有什么想法吗?
【问题讨论】:
标签: go
它出现在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 与任何库一起使用?
【讨论】:
sym#512: ignoring _ZN8exmpl4doISbIwSt11char_traitsIwESaIwEEED5Ev in section 1 (type 0) 之类的错误。
extern "C" {} 添加包装你的函数吗?
我同意 Elazar 的观点,认为混合 32 位和 64 位代码似乎是合理的。
你试过 gccgo 吗?
【讨论】:
像魅力一样工作:
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/go 复制到 /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 - 自己发现很难。
【讨论】: