Golang中遇到错误信息:relocation target类型缺少section怎么解决

Golang中遇到错误信息:relocation target类型缺少section怎么解决 我使用Yocto项目构建Consul。 在Go 1.11环境下工作正常,但在Go 1.12环境下编译失败。 我使用相同的构建脚本来进行两次编译。

但在Go 1.12环境下,如果我移除-linkshared参数,编译也能成功。

错误信息如下:

# github.com/hashicorp/consul/connect/certgen
type…eUfRrckI: missing section for relocation target type…FEeY9FdU
type…eUfRrckI: reloc 8 (R_CALL) to non-elf symbol type…FEeY9FdU (outer=type…FEeY9FdU) 49 (SABIALIAS)
# github.com/hashicorp/consul
type…eUfRrckI: missing section for relocation target type…FEeY9FdU
type…K6Uq9NPs: missing section for relocation target type…tBBUxeDj

以上提示信息来自/usr/lib/go-1.12/src/cmd/link/internal/ld/data.go

脚本中的主要命令如下图所示: 在第130行(-linkshared)处失败:

Screenshot%20from%202019-03-12%2019-37-39

有人能给我一些修复或定位这个问题的思路吗? 谢谢。


更多关于Golang中遇到错误信息:relocation target类型缺少section怎么解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中遇到错误信息:relocation target类型缺少section怎么解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误通常与 Go 1.12 中链接器对共享库的处理方式变化有关。错误信息表明在重定位过程中无法找到目标符号的 section,特别是在使用 -linkshared 参数时。以下是具体解决方案:

问题分析:

  • Go 1.12 对动态链接(shared library)的支持进行了调整,可能导致旧代码或依赖不兼容。
  • 错误中的 R_CALL 重定位类型和 SABIALIAS 符号表明链接器在处理共享库符号时遇到内部类型定义问题。
  • 移除 -linkshared 后编译成功,确认问题与该参数直接相关。

解决方案:

  1. 更新依赖库:确保 hashicorp/consul 及其子模块(如 connect/certgen)支持 Go 1.12。运行以下命令更新依赖:

    go get -u github.com/hashicorp/consul/...
    

    如果使用 Go modules,检查 go.mod 中是否指定了兼容版本。

  2. 检查共享库构建:在 Go 1.12 中,共享库需使用 -buildmode=shared 编译依赖包。确保构建脚本中所有相关包已正确编译为共享库。例如:

    go install -buildmode=shared -linkshared std
    

    然后重新构建 Consul。

  3. 降级或调整构建模式:如果时间紧迫,暂时移除 -linkshared 参数,改用静态链接。这不会影响 Consul 的核心功能,但可能增加二进制大小。

  4. 验证 Go 环境:确保 Go 1.12 安装完整,无损坏。运行:

    go version
    go env GOROOT GOPATH
    

示例构建脚本调整: 如果原脚本类似:

go build -linkshared -o consul .

改为:

go build -o consul .

或显式禁用动态链接:

go build -ldflags="-linkshared=false" -o consul .

如果问题持续,检查 Yocto 项目中的 Go 交叉编译配置,确保与主机环境一致。此错误属于工具链问题,通常通过更新依赖或调整构建参数解决。

回到顶部