【问题标题】:How to tell gcc to stop using built-in functions?如何告诉 gcc 停止使用内置函数?
【发布时间】: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,调用系统调用指令。不必多此一举。

标签: c linux gcc x86 glibc


【解决方案1】:

this 回答中所述,将“-ffreestanding”传递给 gcc 怎么样?

【讨论】:

    【解决方案2】:

    你上面反汇编的包装器来自于 INLINE_SYSCALL 宏 sysdeps/unix/sysv/linux/x86_64/sysdep.h。该宏是用于将普通函数调用转换为系统调用的“魔术粘合剂”。

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

    【讨论】:

      【解决方案3】:

      这是对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 中(是的,它是用汇编语言编写的)。

      【讨论】:

      • 我使用的是 x86-64 系统。找不到任何相应的代码。编辑问题以显示生成的 mmap。
      • 您显示的内容看起来确实像mmap 的代码。你的sysdeps/unix/sysv/linux/i386/mmap.S 说什么?
      • 不,不是那个代码。当然 i386 不用于 x86-64 代码。
      • 建议你重新编译sysdeps/unix/sysv/linux目录,自己看看是哪个源文件负责mmap.o
      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2015-07-14
      相关资源
      最近更新 更多