更好地理解编译

时间:2015-06-23 22:58:16

标签: c assembly compilation

我问这个问题是为了澄清我对编译的正确与否有所了解。我将描述一下我所持有的情况和假设。请告诉我这些假设是否属实,如果不是,为什么。

假设我有一个C程序可以在一个处理器体系结构上编译,但是有两个不同的操作系统,而不需要对代码进行任何更改。这个程序包含部分抽象逻辑,只计算内容和更改内存,然后是一些与操作系统交互的部分。

  1. 我认为这意味着这两个二进制文件在抽象逻辑发生的地方是完全相同的,因为它只是相同的机器指令,只有程序与操作系统交互的地方,比如各种IO和分配内存都不一样。

  2. 我也理解这些差异只是因为<stdio.h>的实现对于这些操作系统而言是不同的。

  3. 它有所不同,因为这些操作系统对设置信号有不同的标准:每个寄存器中要留下什么信息,哪些信号代码意味着什么,等等,这些库需要更正为在每个操作系统上与此格式兼容。

1 个答案:

答案 0 :(得分:1)

  1. 您没有指定是否使用相同版本的相同编译器,并使用相同的优化标记。您也没有指定两个操作系统是使用相同的目标文件格式,还是使用相同的调用约定。如果这些中的任何一个不匹配,那么二进制文件也不会匹配。

  2. 如果两个操作系统都遵循相同的标准,则头文件可能非常接近相同。 (他们不必这样做。)正如其他人所说,在库中会发现差异,特别是在系统调用存根中。 (即使普通调用约定匹配,调用系统调用的约定也不一定。)

  3. 你在这里谈论的是我所总结为&#34;呼叫约定&#34;。这只是差异的一部分。两个操作系统可能在同一架构上具有相同的调用约定 - 以及相同的编译器等 - 并且仍然没有匹配的库。