bin/ld.bfd: warning: creating a DT_TEXTREL in a shared object解决办法

本文介绍在Android平台上使用特定版本的NDK编译动态库时遇到的警告信息及解决方案。建议使用ndk-r10e来避免创建DT_TEXTREL的问题。
AI助手已提取文章相关产品:

您可能感兴趣的与本文相关内容

arm-seev300-linux-uclibcgnueabihf-g++ -fPIC -Wall -O2 -Drgn_private -g -I./ -I../../include -I../../include/common -I../../inc_drv -I../../inc_lib -fPIC -Wall -O2 -Drgn_private -g -I./ -I../../include -I../../include/common -I../../inc_drv -I../../inc_lib ./common.o ./FilterFunction.o ./HVM_MPI_IMG_Set+GetConnectMode.o ./HVM_MPI_IMG_Set+GetDdrMode.o ./HVM_MPI_VGP_CreatePipeTest.o ./main.o -L../../lib -L../../lib/gtest_lib -lvb -lpthread -lvmm -lbase -lm -losal -lgdma -limg -lvic -lcxm -lbind -lprint -lisp -lvdp -lhvm2a -lpqt -lhvm188 -lhvm187 -lge -lrgn -lvencrgn -lvenc -lvgp -lime -losal -lgtest -o run_img_test -Xlinker "-(" -L../../lib -L../../lib/gtest_lib -lvb -lpthread -lvmm -lbase -lm -losal -lgdma -limg -lvic -lcxm -lbind -lprint -lisp -lvdp -lhvm2a -lpqt -lhvm188 -lhvm187 -lge -lrgn -lvencrgn -lvenc -lvgp -lime -losal -Xlinker "-)" /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libimg.a(hvm_mpi_img.o): in function `_GLOBAL__sub_I_65535_0_hvm_mpi_img.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/img/lib/mpi/hvm_mpi_img.c:141: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libimg.a(hvm_mpi_img.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libimg.a(pil_func_img.o): in function `_GLOBAL__sub_I_65535_0_pil_func_img.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/img/lib/pil/pil_func_img.c:797: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libimg.a(pil_func_img.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvic.a(hvm_mpi_vic.o): in function `_GLOBAL__sub_I_65535_0_hvm_mpi_vic.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vic/lib/mpi/hvm_mpi_vic.c:642: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvic.a(hvm_mpi_vic.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvic.a(pil_vic_sys.o): in function `_GLOBAL__sub_I_65535_0_pil_vic_sys.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vic/lib/pil/pil_vic_sys.c:1994: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvic.a(pil_vic_sys.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libisp.a(pil_base_isp.o): in function `_GLOBAL__sub_I_65535_0_pil_base_isp.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/isp/lib/pil/pil_base_isp.c:1283: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libisp.a(pil_base_isp.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libisp.a(pil_imp_isp.o): in function `_GLOBAL__sub_I_65535_0_pil_imp_isp.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/isp/lib/pil/pil_imp_isp.c:2742: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libisp.a(pil_imp_isp.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libisp.a(pil_func_isp.o): in function `_GLOBAL__sub_I_65535_0_pil_func_isp.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/isp/lib/pil/pil_func_isp.c:1655: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libisp.a(pil_func_isp.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(hvm_mpi_vgp.o): in function `_GLOBAL__sub_I_65535_0_hvm_mpi_vgp.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vgp/lib/mpi/hvm_mpi_vgp.c:2416: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(hvm_mpi_vgp.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_dfx.o): in function `_GLOBAL__sub_I_65535_0_pil_vgp_dfx.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vgp/lib/pil/pil_vgp_dfx.c:79: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_dfx.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_algo.o): in function `_GLOBAL__sub_I_65535_0_pil_vgp_algo.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vgp/lib/pil/pil_vgp_algo.c:1931: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_algo.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_func.o): in function `_GLOBAL__sub_I_65535_0_pil_vgp_func.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vgp/lib/pil/pil_vgp_func.c:2595: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_func.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_sys.o): in function `_GLOBAL__sub_I_65535_0_pil_vgp_sys.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/vgp/lib/pil/pil_vgp_sys.c:1653: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libvgp.a(pil_vgp_sys.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libcxm.a(hvm_mpi_cxm.o): in function `_GLOBAL__sub_I_65535_0_hvm_mpi_cxm.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/cxm/lib/hvm_mpi_cxm.c:199: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libcxm.a(hvm_mpi_cxm.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libcxm.a(pil_flow_cxm.o): in function `_GLOBAL__sub_I_65535_0_pil_flow_cxm.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/cxm/lib/pil_flow_cxm.c:332: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libcxm.a(pil_flow_cxm.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libcxm.a(pil_func_cxm.o): in function `_GLOBAL__sub_I_65535_0_pil_func_cxm.c': /share/users/fanjiahe/svn/mars/btk_img/g2s/branches_v0.5/api/cxm/lib/pil_func_cxm.c:303: undefined reference to `__gcov_init' /share/eda/toolchains/arm-seev300-linux-uclibcgnueabihf/bin/../lib/gcc/arm-seev300-linux-uclibcgnueabihf/6.5.0/../../../../arm-seev300-linux-uclibcgnueabihf/bin/ld.bfd: ../../lib/libcxm.a(pil_func_cxm.o):(.data.rel+0x10): undefined reference to `__gcov_merge_add' collect2: error: ld returned 1 exit status
最新发布
08-12
<think>我们正在解决一个特定的链接错误:使用arm-seev300-linux-uclibcgnueabihf-g++编译C++程序时,出现未定义的引用`__gcov_init`和`__gcov_merge_add`。这些符号与GCC的代码覆盖率(gcov)相关。 问题分析: 当我们在编译时使用了覆盖率检测选项(如`-fprofile-arcs`、`-ftest-coverage`等),编译器会在目标文件中插入一些额外的代码,并需要链接到gcov库(通常是libgcov.a或libgcov.so)。如果链接器找不到这些符号,通常是因为没有正确链接gcov库。 解决方案: 1. 确认是否确实需要覆盖率检测:如果项目不需要覆盖率测试,那么可以移除覆盖率相关的编译选项(如`-fprofile-arcs`、`-ftest-coverage`、`--coverage`等)。 2. 如果需要覆盖率检测,则需要确保在链接时添加了gcov库。 具体步骤: 步骤1:检查编译选项 查看你的编译命令,是否包含了覆盖率选项。例如,常见的选项有: -fprofile-arcs -ftest-coverage 或者 --coverage(它相当于同时指定-fprofile-arcs -ftest-coverage,并且在链接时自动包含libgcov) 步骤2:在链接时添加gcov库 如果你明确需要覆盖率检测,那么在链接阶段需要确保链接了gcov库。通常,GCC会自动链接libgcov,但在交叉编译环境下,可能需要显式指定。 尝试在链接命令中添加`-lgcov`,例如: arm-seev300-linux-uclibcgnueabihf-g++ ... -lgcov ... 步骤3:如果步骤2无效,可能需要指定gcov库的路径 交叉编译工具链可能将库放在特定目录下。你可以使用`-L`选项指定库路径,例如: arm-seev300-linux-uclibcgnueabihf-g++ ... -L<path_to_gcov_lib> -lgcov ... 步骤4:检查工具链中是否存在gcov库 在交叉编译工具链的目录中查找`libgcov.a`或`libgcov.so`文件。例如,可以在工具链的库目录下搜索: find /path/to/toolchain -name "libgcov.*" 步骤5:如果工具链中确实没有gcov库,可能需要重新配置工具链以包含gcov支持,或者安装额外的包。 步骤6:使用`--coverage`选项 在编译和链接时都使用`--coverage`选项,这个选项会自动处理所需的标志和链接库。例如: arm-seev300-linux-uclibcgnueabihf-g++ --coverage -o your_program your_source.cpp 注意:在交叉编译环境中,确保工具链支持gcov,并且已经为交叉编译构建了相应的gcov库。 步骤7:如果以上步骤都无效,可以考虑使用静态链接gcov库 如果动态链接库有问题,可以尝试静态链接。找到`libgcov.a`,然后在链接时直接指定该库的完整路径,例如: arm-seev300-linux-uclibcgnueabihf-g++ ... /path/to/libgcov.a ... 示例命令: 假设我们有一个源文件`main.cpp`,编译链接命令如下: arm-seev300-linux-uclibcgnueabihf-g++ --coverage -o main main.cpp 如果自动链接不起作用,可以尝试: arm-seev300-linux-uclibcgnueabihf-g++ -fprofile-arcs -ftest-coverage -o main main.cpp -lgcov 总结: 这个问题的根本原因是链接阶段缺少gcov库。解决方法主要是确保在链接时正确链接了gcov库(通过`-lgcov`),并且确保工具链中确实提供了这个库。 如果问题仍然存在,可能需要检查工具链的配置,或者联系工具链供应商以确认gcov支持情况。 相关问题: 1. 如何在交叉编译环境中使用gcov进行代码覆盖率测试? 2. 如何为交叉编译工具链添加gcov支持? 3. 如何解决其他未定义的符号引用问题?</think>针对 `arm-seev300-linux-uclibcgnueabihf-g++` 链接时出现的 `undefined reference to __gcov_init` 和 `__gcov_merge_add` 错误,以下是完整的解决方案: --- ### 问题原因 这些符号属于 GCC 的代码覆盖率检测工具(gcov),当编译时启用了覆盖率选项(如 `-fprofile-arcs` 或 `--coverage`),但链接时未正确链接 gcov 库会导致此错误[^1]。 --- ### 解决方法 #### 1. **添加 gcov 链接库** 在链接命令中显式添加 `-lgcov` 或 `--coverage` 选项: ```bash arm-seev300-linux-uclibcgnueabihf-g++ your_file.cpp -o output -lgcov # 或 arm-seev300-linux-uclibcgnueabihf-g++ your_file.cpp -o output --coverage ``` #### 2. **检查工具链的 gcov 支持** 确认工具链是否包含 gcov 库: ```bash # 查找 libgcov.a 或 libgcov.so find /path/to/toolchain -name "libgcov*" ``` 若不存在,需重新安装带 gcov 支持的交叉编译工具链。 #### 3. **静态链接 gcov 库** 若动态链接失败,尝试直接指定库路径: ```bash arm-seev300-linux-uclibcgnueabihf-g++ your_file.cpp -o output \ /path/to/toolchain/lib/libgcov.a ``` #### 4. **检查编译选项一致性** 确保 **所有目标文件** 使用相同的覆盖率选项: - 编译和链接阶段均需添加 `-fprofile-arcs` 或 `--coverage` - 错误示例:编译时带 `--coverage` 但链接时未添加 #### 5. **清理构建环境** 若曾切换编译选项,执行彻底清理: ```bash make clean # 或删除所有 .o 和 .gcno 文件 rm -f *.gcda *.gcno ``` #### 6. **验证工具链兼容性** 检查工具链是否支持 gcov: ```bash arm-seev300-linux-uclibcgnueabihf-g++ -v --help 2>&1 | grep -i "coverage" ``` 若无输出,可能需要升级或更换工具链。 --- ### 完整操作示例 ```bash # 清理旧构建 make clean # 编译+链接(启用覆盖率) arm-seev300-linux-uclibcgnueabihf-g++ -c --coverage main.cpp -o main.o arm-seev300-linux-uclibcgnueabihf-g++ -c --coverage utils.cpp -o utils.o arm-seev300-linux-uclibcgnueabihf-g++ main.o utils.o -o app --coverage # 运行测试生成覆盖率数据 ./app # 查看覆盖率报告 gcov main.cpp ``` --- ### 关键点总结 | 步骤 | 操作 | 检查点 | |------|------|--------| | 1 | 添加 `-lgcov` | 链接命令包含覆盖率库 | | 2 | 统一编译选项 | 所有文件使用 `--coverage` | | 3 | 验证库存在 | `libgcov.a` 在工具链路径 | | 4 | 清理构建 | 删除旧的 `.gcno` 文件 | | 5 | 工具链验证 | 确认 gcov 支持 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值