Yocto构建Golang包遇test-dev无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

