8

我正在使用我自己修改过的 glibc。我在编译的代码中看到,当我链接它时,编译器没有使用我的 glibc 中的许多标准库函数。然后我放了-fno-builtinflag。事情变得更好了,我可以看到许多不是从 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  
4

3 回答 3

6

您在上面反汇编的包装器来自 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 中),因此它得到了通用处理。

于 2012-05-21T16:46:37.227 回答
1

如this answer中所述,如何将“-ffreestanding”传递给gcc ?

于 2021-12-01T01:25:47.427 回答
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

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

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

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

于 2012-05-21T15:08:32.360 回答