Linux 在libc源代码中,open()从何处链接?

Linux 在libc源代码中,open()从何处链接?,linux,gcc,linker,system-calls,libc,Linux,Gcc,Linker,System Calls,Libc,我基本上需要为自己定制一些linux系统调用接口(比如sys_open)。我非常了解GNU链接器ld--wrap=symbol选项,并使用该逻辑更改open()libc包装器。尽管这样做可以达到目的,但我真的想知道在libc源代码中,实际实现在哪里发挥作用 以下两个地方是我的主要怀疑点(注意fcntrl.h只有声明) GLIBC_DIR/io/open.c GLIBC_DIR/ports/sysdeps/unix/sysv/linux/generic/open.c 示例驱动程序: #incl

我基本上需要为自己定制一些linux系统调用接口(比如sys_open)。我非常了解GNU链接器ld--wrap=symbol选项,并使用该逻辑更改open()libc包装器。尽管这样做可以达到目的,但我真的想知道在libc源代码中,实际实现在哪里发挥作用

以下两个地方是我的主要怀疑点(注意fcntrl.h只有声明)

  • GLIBC_DIR/io/open.c
  • GLIBC_DIR/ports/sysdeps/unix/sysv/linux/generic/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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int-fd;
如果((fd=open(“sample.c”,orduonly))=-1){
fprintf(stderr,“未找到文件”\n);
出口(1);
}
返回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 
main:
401dd1:bf 44 90 48 00 mov$0x489044,%edi
401dd6:b8 00 mov$0x0,%eax
401ddb:e8 10 03 03 00 callq 4320f0
......
......
__图书馆开放:
4320f0:83 3d 69 8e 28 00 cmpl$0x0,0x288e69(%rip)
4320f7:75 14 jne 43210d
__打开/取消:
4320f9:b8 02 00 mov$0x2,%eax
4320fe:0f 05系统调用
为了简单起见,我已经静态地准备了所有libc源代码可执行文件。还非常小心地让GCC正确地选择自定义libc.a。我尝试添加一个puts语句,但是上面提到的两个源代码根本没有被调用。查看[如上所示]可执行文件的程序集,sys_open调用(0x2 in uu open_nocancel)以某种方式放置在可执行文件中

因此,我的问题如下:

  • 在libc中,与open()相关的代码逻辑从何而来
  • 当libc源代码树中没有显式命名为open的函数时,链接器如何能够成功地钩住open()函数
在libc中,与open()相关的代码逻辑从何而来

In来自
sysdeps/unix/syscall template.S

当libc源代码树中没有显式命名为open的函数时,链接器如何能够成功地钩住open()函数


如果您使用正确的
-DSYSCALL\u SYMBOL=…
对上述源代码进行预处理,您会发现源代码中提到了
open

谢谢您的指针。目前,我只是想在调用实际的open()之前放置一个puts()语句。关于如何/在源代码中放置此项的任何指针(ld wrap选项除外)?我知道原始libc源代码中有一些宏,可以归结为上述文件中的内联程序集syscall。sysdeps/unix/sysv/linux/wordsize-64/open64.c文件是空的,因此我们可以访问syscall模板。您认为在这里添加逻辑(就像xstat64.c)会执行新逻辑并导致实际系统打开吗