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'的源代码,看看它是如何完成同样的工作的。 –