8

私は自分で修正した glibc を使用しています。コンパイルされたコードで、コンパイラが glibc にリンクしたときに、glibc の多くの標準ライブラリ関数を使用していないことがわかりました。次に-fno-builtinフラグを立てます。状況は改善され、glibc から取得されなかった多くの関数が 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 マクロから取得されます。このマクロは、通常の関数呼び出しをシステム呼び出しに変えるために使用される「魔法の接着剤」です。

fooglibc のビルド プロセスの一部として、そのアーキテクチャの特別な例外のリストにない定義済みのシステム コールごとに、1 つのマクロ呼び出し __fooだけを含む関数が生成されます。x86_64 の例外リスト (sysdeps/unix/sysv/linux/x86_64/syscalls.list 内) に含まれていないため、一般的な処理が行われます。INLINE_SYSCALLmmap

于 2012-05-21T16:46:37.227 に答える
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は、OS およびアーキテクチャに依存します。たとえば、i386 Linux の場合はsysdeps/unix/sysv/linux/i386/mmap.S(そうです、アセンブリで記述されています)。

于 2012-05-21T15:08:32.360 に答える