使用GCC -flto时出现未定义引用错误的技术求助
LTO构建触发大量未定义引用错误
问题现象
启用链接时优化(LTO)后,链接可执行文件阶段出现大量未定义引用错误,示例报错信息如下:
{path}/bin/ld: <artificial>:(.text.startup+0x136): undefined reference to `some_function`
这些报错的函数没有特殊特性,仅通过宏引用并获取其地址。
环境信息
- 操作系统:RHEL 7.6
- 编译工具链:自行编译的GCC 5.3、binutils 2.34(具体配置未知)
构建模式差异对比
- 非LTO构建:通过
nm命令可查看到其中一个目标函数位于只读段,且该符号在对应的.o目标文件及.a归档文件中均存在 - LTO构建:使用
objdump -D命令仅能看到类似.gnu.lto_{missing function}.7c974f7d7bc920e2的LTO相关信息,无法找到目标符号
补充代码场景
部分甚至全部缺失符号位于函数指针的.rodata数组中,这些数组通过复杂C宏在多个文件中生成,代码示例如下:
file1.c
#include "param1_def.h" #include "pfn_table.c"
file2.c
#include "param2_def.h" #include "pfn_table.c"
pfn_table.c
function_type const MAKE_NAME(NAME, _functions) = { MAKE_NAME(NAME, _write_file), MAKE_NAME(NAME, _read_file), // 其他函数指针项 }
其中NAME是paramX_def.h头文件中定义的宏(每个引用文件中的NAME取值不同),MAKE_NAME是用于拼接最终符号名称的宏。
初步怀疑方向
怀疑是*ODR(单一定义规则)*违例导致,但非LTO构建模式下未触发该问题。
内容的提问来源于stack exchange,提问作者Paul Floyd
相关产品推荐
相关产品推荐

