如何告诉gcc停止使用内置函数?

Met*_*est 6 c linux x86 gcc glibc

我正在使用自己修改过的glibc.我在编译的代码中看到,当我与glibc链接时,编译器没有使用我的glibc中的许多标准库函数.然后我把-fno-builtin旗帜.事情变得更好了,我可以看到许多未从glibc中获取的函数现在从那里获取,例如malloc.

但是,对于许多函数,例如mmap,编译器正在使用一些内置代码.现在,我如何要求编译器专门使用glibc中的代码而不是使用其内置函数?

在我的x86-64函数中,如果我对已编译的glibc执行objdump,则以下是生成的mmap函数.我在glibc源代码中找不到相应的代码.

0000000000000000 <__mmap>:
   0:   49 89 ca                mov    %rcx,%r10
   3:   b8 09 00 00 00          mov    $0x9,%eax
   8:   0f 05                   syscall 
   a:   48 3d 01 f0 ff ff       cmp    $0xfffffffffffff001,%rax
  10:   0f 83 00 00 00 00       jae    16 <__mmap+0x16>
  16:   c3                      retq  
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 5

上面反汇编的包装器来自sysdeps/unix/sysv/linux/x86_64/sysdep.h中的INLINE_SYSCALL宏.这个宏是用于将正常函数调用转换为系统调用的"魔术胶".

作为glibc构建过程的一部分,对于每个定义的系统调用foo,它不在该体系结构的特殊异常列表中,它生成一个__foo只包含一个INLINE_SYSCALL宏调用的函数. mmap不在x86_64的异常列表中(在sysdeps/unix/sysv/linux/x86_64/syscalls.list中),因此它获得了通用处理.


n. *_* m. 0

mmap这是我的系统上对编译的调用:

movl    $1048837, 20(%esp)
movl    $1048836, 16(%esp)
movl    $1048835, 12(%esp)
movl    $1048834, 8(%esp)
movl    $1048833, 4(%esp)
movl    $1048832, (%esp)
call    mmap
Run Code Online (Sandbox Code Playgroud)

我使用了一些常量,例如 0x100100 (1048832) 作为mmap参数,以便能够更轻松地在程序集中找到相应的指令。

这看起来像是对一个非常普通的库函数的非常普通的调用,而不是内置函数。

实际代码取决于mmap操作系统和体系结构。例如,对于 i386 Linux,它是sysdeps/unix/sysv/linux/i386/mmap.S(是的,它是用汇编语言编写的)。