You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yocto构建Golang包遇test-dev无GNU_HASH错误求解决

解决Golang配方do_package_qa阶段GNU_HASH错误的思路

针对你遇到的test-dev doesn't have GNU_HASH (didn't pass LDFLAGS?)错误,结合你已尝试的方法,提供以下针对性解决思路:

  • 定位触发错误的具体文件
    执行bitbake test -c package_qa -D查看详细日志,明确test-dev包中哪一个文件触发了GNU_HASH检查失败。静态库(.a文件)不需要GNU_HASH,只有动态库(.so)或可执行文件需要,先确认目标文件类型,避免无效操作。

  • 修正CGO_LDFLAGS的配置
    不要硬编码-Wl,--hash-style=gnu,直接复用OpenEmbedded提供的${LDFLAGS}变量(其中已包含GNU_HASH相关参数),确保所有必要的链接参数都被传递:

    do_compile() {
        export CGO_CFLAGS="-I${STAGING_INCDIR}"
        export CGO_LDFLAGS="${LDFLAGS}"
    
        cd ${S}/src/${GO_IMPORT}
        go build
    }
    
  • 强制使用系统链接器(针对纯Go项目)
    如果你的Go包是纯Go实现,Go默认的内置链接器不支持生成GNU_HASH段,需要强制使用系统gcc链接器。在配方中添加:

    GO_LDFLAGS="-linkmode=external ${GO_LDFLAGS}"
    

    这样Go会调用系统链接器,从而应用${LDFLAGS}中的GNU_HASH参数。

  • 修正TARGET_CC_ARCH的错误用法
    移除配方中的TARGET_CC_ARCH += "${LDFLAGS}",TARGET_CC_ARCH是传递给编译器的架构参数,不应混入链接器参数,这会导致编译器参数污染,反而影响构建流程。

  • 针对性跳过dev包的检查(仅当文件不需要GNU_HASH时)
    如果test-dev包中只有头文件或静态库,确实不需要GNU_HASH,可以仅跳过dev包的ldflags检查,而不是整个主包:

    INSANE_SKIP_${PN}-dev = "ldflags"
    
  • 手动验证文件的GNU_HASH段
    构建完成后,找到test-dev包对应的文件(通常在tmp/work/.../test/.../packages-split/test-dev/路径下),执行readelf -d <文件路径> | grep GNU_HASH命令检查是否存在GNU_HASH段,确认链接参数是否生效。

内容的提问来源于stack exchange,提问作者Kyle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:25:15