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

GNU ld报错:已定义的xmemdup符号仍未被识别

链接时xmemdup符号未定义问题的排查与解决

问题现象

链接程序时意外生成了对xmemdup符号的引用,已将编译好的xmemdup.o与rsh.o一同传入链接器,但GNU ld仍报错:

/usr/bin/ld: symbol lookup error: /usr/bin/ld: undefined symbol: xmemdup
collect2: error: ld returned 127 exit status

已完成的操作

  • 成功编译rsh.o,执行命令:
    $ gcc -Wall -g -O2 -pipe -DBINDIR="/usr/bin"   -c -o rsh.o rsh.c
    
  • 确认两个目标文件均存在:
    $ ll rsh.o ../publib-0.40/alloc/xmemdup.o
    -rw-r--r-- 1 perryh perryh  2344 Dec 29 22:25 ../publib-0.40/alloc/xmemdup.o
    -rw-r--r-- 1 perryh perryh 68656 Dec 30 00:47 rsh.o
    
  • 执行链接命令:
    $ gcc -Wall -g -O2 -pipe -DBINDIR="/usr/bin" -o rsh rsh.o ../publib-0.40/alloc/xmemdup.o
    

排查方向及解决方法

  • 检查符号的可见性与匹配性:
    用nm命令查看两个目标文件中的符号信息,确认xmemdup的定义状态:

    nm rsh.o | grep xmemdup
    nm ../publib-0.40/alloc/xmemdup.o | grep xmemdup
    
    • 若xmemdup.o中的符号为小写t(如t xmemdup),说明该函数被static修饰,仅在本文件可见,需修改xmemdup.c移除static关键字;
    • 注意符号大小写,C语言符号严格区分大小写,确认引用的符号名与定义完全一致。
  • 验证编译选项一致性:
    确保xmemdup.o与rsh.o使用了相同的ABI、字长相关编译选项(如-m32/-m64),不同位数的目标文件无法正常链接。用file命令检查文件格式:

    file rsh.o ../publib-0.40/alloc/xmemdup.o
    
  • 查看链接器实际执行命令:
    给gcc添加-v参数,查看其调用ld的完整命令,确认xmemdup.o确实被传入链接器:

    gcc -v -Wall -g -O2 -pipe -DBINDIR="/usr/bin" -o rsh rsh.o ../publib-0.40/alloc/xmemdup.o
    
  • 确认xmemdup的定义完整性:
    检查xmemdup.c文件,确保存在xmemdup的全局函数定义,而非仅头文件中的声明。例如:

    void *xmemdup(const void *src, size_t size) {
        // 函数实现代码
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:00:57