3
我知道mmap是一個系統調用,但glibc中必須有一些包裝器來完成系統調用。然而,當我嘗試使用我的程序中的mmap函數時,gdb忽略它,因爲它無法找到它的任何源文件(注意我從源編譯我自己的glibc)。我可以通過其他glibc庫函數,如printf和malloc但不是mmap。我也使用標誌-fno-builtin,以便gcc不使用內置函數。任何幫助,將不勝感激。mmap是內置函數嗎?
我知道mmap是一個系統調用,但glibc中必須有一些包裝器來完成系統調用。然而,當我嘗試使用我的程序中的mmap函數時,gdb忽略它,因爲它無法找到它的任何源文件(注意我從源編譯我自己的glibc)。我可以通過其他glibc庫函數,如printf和malloc但不是mmap。我也使用標誌-fno-builtin,以便gcc不使用內置函數。任何幫助,將不勝感激。mmap是內置函數嗎?
我不知道你的問題是什麼。它對我來說工作得很好。
使用安裝的系統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
你爲什麼要*步入* mmap的開始嗎?該錯誤是在其他地方:-) – Jens
Jens我不想步入mmap查看一些錯誤,但只是爲了看看mmap的代碼在哪裏,所以我可以做一些修改。我計劃的是記錄每個系統調用的參數,包括mmap。是的,我知道還有其他方法,但我正在寫一些特殊的工具。 – pythonic
'strace'在這種情況下可能會有所幫助。同時檢查'strace'的源代碼,看看它是如何完成同樣的工作的。 –