我知道mmap是一个系统调用,但是 glibc 中必须有一些包装器来执行系统调用。然而,当我尝试使用gdb在我的程序中单步执行mmap函数时,gdb会忽略它,因为它找不到任何源文件(注意我从源代码编译了我自己的 glibc)。我可以单步执行其他 glibc 库函数,例如printf和malloc但不是mmap。我还使用标志-fno-builtin以便 gcc 不使用内置函数。对此的任何帮助将不胜感激。
问问题
1436 次
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 回答