从libc源代码的哪里开始()获取链接?

我基本上需要定制一些Linux系统调用接口(比如sys_open )来达到我的目的。 我非常了解GNU Linker ld –wrap = symbol选项,并使用该逻辑来改变open()libc包装器。 虽然这样做的目的,我真的想知道在libc源代码在哪里,实际的实施起到了作用。

以下两个地方是我的主要嫌疑人(请注意, fcntrl.h只是声明)

  • GLIBC_DIR / IO / open.c
  • GLIBC_DIR /端口/ sysdeps / UNIX / SYSV / Linux的/通用/ open.c

样车司机:

#include <stdio.h> #include <stdlib.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd; if ((fd = open("sample.c", O_RDONLY)) == -1) { fprintf(stderr, "file not found\n"); exit(1); } return 0; } 

有关片段:

 main: 401dd1: bf 44 90 48 00 mov $0x489044,%edi 401dd6: b8 00 00 00 00 mov $0x0,%eax 401ddb: e8 10 03 03 00 callq 4320f0 <__libc_open> ...... ...... __libc_open: 4320f0: 83 3d 69 8e 28 00 00 cmpl $0x0,0x288e69(%rip) 4320f7: 75 14 jne 43210d <__open_nocancel+0x14> __open_nocancel: 4320f9: b8 02 00 00 00 mov $0x2,%eax 4320fe: 0f 05 syscall 

为了简单起见,我准备了所有可执行的libc源代码。 也很小心,使GCC正确地select自定义libc.a. 我尝试添加一个puts语句,但提到的两个源代码根本没有被调用。 看一下上面显示的可执行程序集合, sys_open调用( __open_nocancel中的 0x2)已被放置在可执行文件中。

所以我的问题是以下几点:

  • 在libc中, open()相关的代码逻辑神奇地来了吗?
  • 当没有在libc源代码树中显式命名为open的函数时,链接器如何成功挂接open()函数?

从libc中,open()相关的代码逻辑神奇地来了?

来自sysdeps/unix/syscall-template.S

当没有在libc源代码树中显式命名为open的函数时,链接器如何成功挂接open()函数?

如果您使用正确的-DSYSCALL_SYMBOL=...预处理了上面的源代码,则会发现源代码中提到了open