2012-05-21 34 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