2015-07-11 82 views
3

基本上,我需要一些定制的Linux 系统调用接口(比如SYS_OPEN)我的目的。我非常清楚GNU连接器ld --wrap = 符号选项,并使用该逻辑改变的open()libc的包装。虽然这样做的目的,我真的想知道在libc源代码中的位置,实际的实现起作用。从libc源代码中,open()被链接到哪里?

以下两个地方是我的主要犯罪嫌疑人(注意: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     jned <__open_nocancel+0x14> 

__open_nocancel: 
    4320f9:  b8 02 00 00 00   mov $0x2,%eax 
    4320fe:  0f 05     syscall 

为简单起见,我准备了所有可执行静态 libc中的来源。也很小心地让GCC正确地选择自定义libc.a.我尝试添加一个puts语句,但提到的两个源代码根本没有被调用。考虑看看可执行的组件[如上所示],则SYS_OPEN呼叫(0X2在__open_nocancel)已被以某种方式放置在可执行文件。

所以我的问题是:

  • 从哪儿libc中的的open() - 相关代码逻辑神奇来吗?
  • 是怎样的链接能够成功挂钩时,有没有功能明确命名了libc中的源代码树打开open()函数?

回答

3

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

在来自sysdeps/unix/syscall-template.S

链接能够成功勾open()函数时,有没有功能明确命名了libc中的源代码树开放是怎样的?

如果上面进行预处理以正确的-DSYSCALL_SYMBOL=...源,你会发现,有open源一提。

+0

谢谢您的指针。此刻,我只是试图在实际调用open()之前放置puts()语句。任何指针(除了ld wrap选项)关于如何/在哪里把它放在源代码中?我知道原始的libc源代码有一些宏,它们归结为提到的文件中的内联程序集系统调用。由于我们到达系统调用模板 –

+0

文件sysdeps/UNIX/SYSV/LINUX /字长-64/open64.c是空的。你认为在这里添加逻辑(就像xstat64.c)将执行新的逻辑并导致实际的sys_open –