3

mmapがシステム コールであることは知っていますが、glibc にはシステム コールを実行するラッパーが必要です。しかし、gdbを使用してプログラムのmmap関数をステップ実行しようとすると、 gdbはそのソース ファイルを見つけることができないため、それを無視します (ソースから独自の glibc をコンパイルすることに注意してください)。printfmallocなどの他の glibc ライブラリ関数をステップ実行できますが、 mmapは実行できません。また、フラグ-fno-builtinを使用して、gcc が組み込み関数を使用しないようにします。これに関するヘルプは大歓迎です。

4

1 に答える 1

4

あなたの問題が何であるかわかりません。それは私にとって完全にうまく機能します。

system を使用libc.so.6して、デバッグ シンボルをインストールします。

// mmap.c
#include <sys/mman.h>

int main()
{
  void *p = mmap(0, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  return 0;
}

gcc -g mmap.c


$ gdb -q a.out
Reading symbols from /tmp/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x40052c: file mmap.c, line 5.

Temporary breakpoint 1, main () at mmap.c:5
5         void *p = mmap(0, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
(gdb) step
mmap64 () at ../sysdeps/unix/syscall-template.S:82
82      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) 
mmap64 () at ../sysdeps/unix/syscall-template.S:83
83      in ../sysdeps/unix/syscall-template.S
(gdb) 
main () at mmap.c:6
6         return 0;
(gdb) q

独自の glibc ビルドを使用:

gdb -q a.out
Reading symbols from /tmp/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x40056c: file mmap.c, line 5.
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?

Temporary breakpoint 1, main () at mmap.c:5
5         void *p = mmap(0, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
(gdb) step
mmap64 () at ../sysdeps/unix/syscall-template.S:81
81      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) 
mmap64 () at ../sysdeps/unix/syscall-template.S:82
82              ret
(gdb) 
main () at mmap.c:6
6         return 0;
(gdb) q
于 2012-05-21T19:20:40.327 に答える