【问题标题】:"unexpected R_X86_64_64 relocation for dynamic symbol" when using Cgo使用 Cgo 时出现“意外的 R_X86_64_64 动态符号重定位”
【发布时间】:2011-05-28 17:05:50
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 您找到解决方案了吗?我的一个库遇到了完全相同的错误。

标签: go


【解决方案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 与任何库一起使用?

【讨论】:

  • 我在最新的 Go 版本中遇到了完全相同的问题。我在 amd64 上运行 linux,该库是我自己的,只是编译它并从其他语言中使用它。我可以毫无问题地将 cgo 与其他库一起使用。此外,我收到sym#512: ignoring _ZN8exmpl4doISbIwSt11char_traitsIwESaIwEEED5Ev in section 1 (type 0) 之类的错误。
  • @snøreven 它看起来像一个错位的 C++ 名称,你能用 extern "C" {} 添加包装你的函数吗?
【解决方案2】:

我同意 Elazar 的观点,认为混合 32 位和 64 位代码似乎是合理的。

你试过 gccgo 吗?

【讨论】:

    【解决方案3】:

    像魅力一样工作:

    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 - 自己发现很难。

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2012-10-14
      • 2020-02-21
      • 2019-04-23
      • 2019-11-17
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多