重新定义函数lin libC

时间:2019-03-20 01:54:18

标签: c libc

假设以下简单的C代码:

file1.c

#include <stdio.h>

char* gets(char* i){
  return i;
}

正在重新定义libC本机函数gets

使用gcc file1.c可以正常编译。

我的问题是,链接器如何抱怨duplicate symbols,因为此函数也在libC本身中定义?

3 个答案:

答案 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种可能性:

  1. 恰好一个定义
  2. 不超过一个定义。

可能 取决于libc的链接,该链接本身是系统相关的。如果您静态链接libc,则链接器将发出投诉。在动态链接的情况下,没有理由抱怨。

如果您查看objdump,则会发现plt部分,如

898:   e8 b3 fe ff ff          callq  750 <gets@plt>

无论如何,行为是不确定的。