【发布时间】:2018-06-23 11:08:47
【问题描述】:
我编写了一个非常简单的程序,调用time() 来说明strace 的用法,但是我遇到了问题; time() 调用似乎并没有真正产生系统调用!
我最终踏入了 GDB 中的time() 函数,现在我比以往任何时候都更加困惑。来自time()函数的反汇编:
0x7ffff7ffad90 <time>: push rbp
0x7ffff7ffad91 <time+1>: test rdi,rdi
0x7ffff7ffad94 <time+4>: mov rax,QWORD PTR [rip+0xffffffffffffd30d] # 0x7ffff7ff80a8
0x7ffff7ffad9b <time+11>: mov rbp,rsp
0x7ffff7ffad9e <time+14>: je 0x7ffff7ffada3 <time+19>
0x7ffff7ffada0 <time+16>: mov QWORD PTR [rdi],rax
0x7ffff7ffada3 <time+19>: pop rbp
0x7ffff7ffada4 <time+20>: ret
如果这个函数不调用内核,它实际上是如何获取当前时间的?它的流程是:
- 序幕
- 从
(0x7ffff7ffad94 + 0xffffffffffffd30d)(0x7ffff7ff80a8) 中获取一些值并将其放入 rax(待返回) - 检查 rdi(第一个参数)是否为空
- 如果不将值放入 rax(返回值)中也有
- 结语
这对于time() 的功能是有意义的;如果参数为空,它只返回值,但如果不是,它也将它放在参数中。我的问题是,它从哪里获得时间价值?地址0x7ffff7ff80a8 有什么神奇之处,它是如何在没有系统调用的情况下做到这一点的?
我正在使用 GCC 6.3.0 和 Ubuntu GLIBC 2.24-9ubuntu2.2。
【问题讨论】:
标签: linux gcc assembly x86-64 glibc