系统调用__open中EAX寄存器值与预期不符的技术疑问
问题解答
- 首先纠正你的误解:
0x101不是内存地址,它是x86_64架构Linux下openat系统调用的编号(十进制257)。 - 你看到的现象源于两个核心要点:
- glibc的封装逻辑:标准库的
fopen函数底层不会直接触发open系统调用,而是调用glibc内部的__open封装函数。这个函数会完成参数预处理(比如默认权限设置、路径解析),最终调用更安全的openat系统调用,而非传统的open。 - 系统调用号的架构差异:你记忆中
open对应EAX值0x02是32位x86架构的系统调用号;在x86_64架构下,open的系统调用号确实也是0x02,但openat的编号是0x101,这就是你反汇编时看到的数值。
- glibc的封装逻辑:标准库的
- 额外说明:
openat相比open的核心优势是支持基于文件描述符的相对路径解析,能规避部分文件系统竞态条件,这也是现代glibc优先选用它的原因。
内容的提问来源于stack exchange,提问作者Monowar Anjum
相关产品推荐
相关产品推荐

