4

在 Linux 机器上,我使用带有 PTRACE_SINGLESTEP 参数的 ptrace 来计算程序的机器指令数。我关注了这篇文章:http ://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html 。

然而,结果对我来说似乎很奇怪。对于一个非常简单的程序,计算了超过 95000 条机器指令。测试程序是

int main(void) { return 23; }

这里发生了什么?文章中的代码是错误的吗?(我看不出它有什么问题。)如果没有,是什么原因导致如此简单的程序需要> 95000条指令?

4

2 回答 2

5

您正在编译的 C 程序链接到 C 库。它包含_start程序执行开始的符号。此时,C 库初始化自身并最终调用main. 返回后main,控制流回_start,还有一堆其他指令执行并返回程序返回值。请注意,PTRACE_SINGLESTEP连续使用不计算已编译指令的数量。它计算执行指令的数量。main这意味着在进入之前、执行时main和退出之后执行了 95k 条指令main

于 2009-09-03T21:09:28.400 回答
1

这是由于所谓的“软件膨胀”。您必须初始化和完成 std​​io,甚至可能是一些渗入标准 C 运行时的线程代码。如果您进一步阅读并对其进行分析,您可能会确切地知道是什么。或者你可以只阅读源代码。

更新:实际上,我后来意识到你可能一直在跟踪动态链接器的操作,这有很多工作要做。我看到有人发表了这样的评论,所以我赞成评论。如果您没有静态链接程序,那么我们的两个原始答案基本上都是错误的。

于 2009-09-03T21:04:27.227 回答