在Linux机器上,我使用带有PTRACE_SINGLESTEP参数的ptrace来计算程序的机器指令数。我遵循了这篇文章:http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html。
然而,结果对我来说似乎很奇怪。对于一个非常简单的程序,计算超过95000台机器指令。测试程序是
int main(void) { return 23; }
这里发生了什么?该文章的代码是错误的吗? (我看不出它有什么问题。) 如果没有,是什么导致这样一个简单的程序需要> 95000指令?
答案 0 :(得分:5)
您正在编译的C程序已链接到C库。它包含程序执行开始的_start
符号。此时,C库初始化自己并最终调用main
。在main
返回后,控件返回_start
并且还有许多其他指令要执行并返回程序返回值。请注意,连续使用PTRACE_SINGLESTEP
不会计算编译指令的数量。它会计算已执行指令的数量。这意味着在执行main
之前,执行main
之后以及退出main
之后,将执行95k指令。
答案 1 :(得分:1)
这是由于所谓的“软件臃肿”。您必须初始化并最终确定stdio,甚至可能是一些流入标准C运行时的线程代码。如果你进一步阅读并描述它,你可能会发现究竟是什么。或者你可以阅读消息来源。
更新:实际上,后来我意识到你可能正在追踪动态链接器的操作,这需要做很多工作。我看到有人留下了这样的评论,所以我赞成了评论。如果你没有静态链接程序,那么我们原来的答案基本上都是错误的。