更好地理解编译

Understanding compilation better

我问这个问题是为了澄清我对编译的某些理解是否正确。我将描述一种情况和我对它的假设。请告诉我这些假设是否正确,如果不正确,原因。

假设我有一个 C 程序,它在一个处理器架构上编译,但在两个不同的操作系统上编译,没有对代码进行任何更改。这个程序有部分抽象逻辑,只是计算东西和改变内存,然后是一些与操作系统交互的部分。

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

  2. 我也明白这些差异的出现只是因为这些操作系统的实现,比如说,<stdio.h>是不同的。

  3. 而且不一样是因为这些操作系统对信号的设置标准不同:每个寄存器要留下什么信息,哪些信号代码代表什么等等,这些库需要更正到在每个 OS.

  4. 上与此格式兼容
  1. 您没有指定您是否使用相同版本的相同编译器,是否具有相同的优化标志。您也没有指定两个操作系统是否使用相同的目标文件格式,甚至没有指定相同的调用约定。如果其中任何一个不匹配,二进制文件也不匹配。

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

  3. 你说的就是我总结的"calling conventions"。这只是区别的一部分。两个操作系统可能在同一体系结构上具有相同的调用约定——以及相同的编译器等——但仍然没有匹配的库。