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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:25:16