概述
有些系统调用在GLIBC里是找不到相应的函数的. 这一类函数会按照 sysdeps/unix/syscall-template.S 里的参数要求在 sysdeps/unix/syscall.S里定义每一个系统调用. 编译的时候,sysdev/unix/make-syscalls.sh 会根据上面的文件生成每个函数的汇编代码到 glibc库里面.
比如, 如果查看 mmap 的反汇编)(MIPS),你会看到:
(gdb) disass mmap
Dump of assembler code for function mmap:
0x77f3107c <+0>: lui gp,0xa
0x77f31080 <+4>: addiu gp,gp,-29292
0x77f31084 <+8>: addu gp,gp,t9
0x77f31088 <+12>: li v0,4090
0x77f3108c <+16>: syscall
0x77f31090 <+20>: bnez a3,0x77f31070
0x77f31094 <+24>: nop
0x77f31098 <+28>: jr ra
0x77f3109c <+32>: nop
0x77f310a0 <+36>: nop
查看 mmap的源码:
(gdb) list mmap
76 #else
77
78 /* This is a "normal" system call stub: if there is an error,
79 it returns -1 and sets errno. */
80
81 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
82 ret
83 T_PSEUDO_END (SYSCALL_SYMBOL)
84
85 #endif
../sysdeps/unix/syscall-template.S:82
其中, T_PSEUDO定义为:
# define PSEUDO(name, syscall_name, args)
.align 2;
99: la t9,__syscall_error;
jr t9;
ENTRY (name)
.set noreorder;
.cpload t9;
.set reorder;
SINGLE_THREAD_P(t0);
bne zero, t0, L(pseudo_cancel);
.set noreorder;
li v0, SYS_ify(syscall_name);
syscall;
.set reorder;
bne a3, zero, SYSCALL_ERROR_LABEL;
ret;
基本上和前面的反汇编代码是一致的.
最后
以上就是动人咖啡为你收集整理的在GLIBC里查找系统调用的全部内容,希望文章能够帮你解决在GLIBC里查找系统调用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复