【发布时间】:2012-05-28 01:36:35
【问题描述】:
我正在使用我自己修改过的 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
【问题讨论】:
-
gcc 中没有内置 mmap()。您可能想要使用 -O0 并禁用内联。
-
它使用
syscall指令调用内核。它不是内置函数。 -
Maxim:我知道它是一个系统调用,但在用户空间的某个地方必须有一个包装器。没有?
-
"必须有一个包装器" --- 这 是 包装器。将系统调用号加载到%eax,调用系统调用指令。不必多此一举。