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

huangapple go评论154阅读模式
英文:

"unexpected R_X86_64_64 relocation for dynamic symbol" when using Cgo

问题

我正在尝试使用Cgo为一个C库创建绑定。我有一个使用Cgo导入该库并进行一些调用的包。它可以成功编译和安装。但是当我尝试从Go程序中使用该包时,在链接时出现错误“unexpected R_X86_64_64 relocation for dynamic symbol”。

有什么想法吗?

英文:

I am trying to create binding for a C library using Cgo. I have package which uses Cgo to import the library and make some calls to it. It compiles and installs fine. But when trying to use that package from a Go program, I get the the error "unexpected R_X86_64_64 relocation for dynamic symbol" when linking.

Any ideas?

答案1

得分: 1

它出现在6g编译器的汇编生成例程中:

  1. case 256 + R_X86_64_64:
  2. if(targ->dynimpname != nil && !targ->dynexport)
  3. diag("对于动态符号%s,出现了意外的R_X86_64_64重定位",
  4. targ->name);
  5. r->type = D_ADDR;
  6. return;

R_X86_64_64是库中的一种符号类型。有关amd64架构中重定位的更多信息,请参考此处的第70页。

您是否可能将386编译的库与amd64代码混合使用?

编译器应该报告导致问题的确切符号。您可以尝试链接一个包含其他符号的最小库,并尝试找到一个失败的最小示例吗?

您是否成功使用cgo与任何库一起使用?

英文:

It appears in the assembly generation routines in the 6g compiler:

  1. case 256 + R_X86_64_64:
  2. if(targ->dynimpname != nil && !targ->dynexport)
  3. diag("unexpected R_X86_64_64 relocation for dynamic symbol %s",
  4. targ->name);
  5. r->type = D_ADDR;
  6. return;

The R_X86_64_64 is a type of a symbol in the library. For more information about relocation in the amd64 architecture consult page ~70 here.

Is it possible that you mix 386 compiled library with amd64 code?

The compiler should report the exact symbol which caused the problem. Can you try linking with a minimal library containing other symbols, and try to locate a minimal example where it fails?

Did you manage to use cgo with any library at all?

答案2

得分: 0

我同意Elazar的观点,混合使用32位和64位代码似乎是可能的。

你尝试过gccgo吗?

英文:

I agree with Elazar that it seems plausible that mixing of 32-bit and 64-bit code is involved.

Have you tried gccgo?

答案3

得分: 0

运行得很好:

  1. root@Ubuntu-1304-raring-64-minimal:/etc# uname -a
  2. 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

按照以下顺序执行:

  1. cd /usr/local
  2. mkdir /var/go
  3. apt-get install mercurial
  4. hg clone https://code.google.com/p/go/

之后创建一个 /etc/profile.d/go.sh 文件,并将以下内容添加到其中,并使其可执行:

  1. export GOPATH=/var/go
  2. export GOROOT=/usr/local/go
  3. export GOBIN=$GOPATH/bin
  4. export PATH=$PATH:$GOBIN
  5. export GOROOT_FINAL=/var/go
  6. export GOHOSTARCH=amd64
  7. export GOARCH=amd64
  8. export CGO_ENABLED=1

然后重新启动你的shell。注意:source xxx 将无法正常工作 - 请注意!在新的shell中执行以下操作:

  1. cd /usr/local/go/src
  2. ./make.bash

完成后,将所有内容从 /usr/local/go 复制到 /var/go - 或者可以通过符号链接的方式合并两个目录,根据你的喜好选择。之后,在上述go.sh脚本中注释掉GOROOT_FINAL,并再次重新启动你的shell。然后,你就可以使用最新的Go语言了!

  1. root@Ubuntu-1304-raring-64-minimal:/usr/work/golang/go/src# go version
  2. go version devel +35d5bae6aac8 Fri Oct 18 10:45:19 2013 +0400 linux/amd64

请注意:需要两次重新启动shell - 我自己通过艰难的方式发现的。

英文:

Works like a charm :

  1. root@Ubuntu-1304-raring-64-minimal:/etc# uname -a
  2. 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

do this sequence :

  1. cd /usr/local
  2. mkdir /var/go
  3. apt-get install mercurial
  4. hg clone https://code.google.com/p/go/

After that create a /etc/profile.d/go.sh with the follewing contents and make it executable:

  1. export GOPATH=/var/go
  2. export GOROOT=/usr/local/go
  3. export GOBIN=$GOPATH/bin
  4. export PATH=$PATH:$GOBIN
  5. export GOROOT_FINAL=/var/go
  6. export GOHOSTARCH=amd64
  7. export GOARCH=amd64
  8. export CGO_ENABLED=1

And then restart your shell. NO source xxx will be working properly - be warned! In a new shell do this :

  1. cd /usr/local/go/src
  2. ./make.bash

do the thing, and then copy all the things from /usr/local/go to /var/go - or there's a way to merge both directories by symlink, whatever you prefer. After that comment GOROOT_FINAL in go.sh script above AND restart your shell again. And you're ok with latest working Go language!

  1. root@Ubuntu-1304-raring-64-minimal:/usr/work/golang/go/src# go version
  2. go version devel +35d5bae6aac8 Fri Oct 18 10:45:19 2013 +0400 linux/amd64

Note bene : Two shell restarts are required - found it myself in a hard way.

huangapple
  • 本文由 发表于 2011年5月29日 01:05:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/6163096.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定