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
相关产品推荐
相关产品推荐

