2012-05-21 30 views
3

我知道mmap是一个系统调用,但glibc中必须有一些包装器来完成系统调用。然而,当我尝试使用我的程序中的mmap函数时,gdb忽略它,因为它无法找到它的任何源文件(注意我从源编译我自己的glibc)。我可以通过其他glibc库函数,如printfmalloc但不是mmap。我也使用标志-fno-builtin,以便gcc不使用内置函数。任何帮助,将不胜感激。mmap是内置函数吗?

+1

你为什么要*步入* mmap的开始吗?该错误是在其他地方:-) – Jens

+0

Jens我不想步入mmap查看一些错误,但只是为了看看mmap的代码在哪里,所以我可以做一些修改。我计划的是记录每个系统调用的参数,包括mmap。是的,我知道还有其他方法,但我正在写一些特殊的工具。 – pythonic

+0

'strace'在这种情况下可能会有所帮助。同时检查'strace'的源代码,看看它是如何完成同样的工作的。 –

回答

4

我不知道你的问题是什么。它对我来说工作得很好。

使用安装的系统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