假设以下简单的C
代码:
file1.c
#include <stdio.h>
char* gets(char* i){
return i;
}
正在重新定义libC本机函数gets
。
使用gcc file1.c
可以正常编译。
我的问题是,链接器如何抱怨duplicate symbols
,因为此函数也在libC本身中定义?
答案 0 :(得分:1)
由于您可以覆盖C语言中标准库中的函数,因此请选中this
答案 1 :(得分:1)
添加选项-完整存档,如下所示:
gcc -c -ofile1.o file1.c
gcc -ofile1 -Wl,--whole-archive -lc file1.o -Wl,--no-whole-archive
结果:
file1.o: In function `gets':
file1.c:(.text+0x0): multiple definition of `gets'
file1.o: In function `main':
file1.c:(.text+0x18): undefined reference to `gets@@GLIBC_2.2.5'
collect2: error: ld returned 1 exit status
答案 2 :(得分:0)
您遇到未定义的行为,请参见N1570 6.9(p5) External definition
:
如果在外部链接中使用了通过外部链接声明的标识符 表达式(不作为
sizeof
或_Alignof
操作数的一部分 运算符,其结果是一个整数常量),在整个位置上 程序中应该只有一个外部定义 标识符否则,不得超过one.161)
可以看出。该标准允许2种可能性:
此 可能 取决于libc
的链接,该链接本身是系统相关的。如果您静态链接libc
,则链接器将发出投诉。在动态链接的情况下,没有理由抱怨。
如果您查看objdump
,则会发现plt
部分,如
898: e8 b3 fe ff ff callq 750 <gets@plt>
无论如何,行为是不确定的。