2015-06-23 153 views
0

我在问这个问题,以澄清我理解编译正确与否的某些事情。我将描述一个我持有的情况和假设。请告诉我这些假设是否属实,如果不是,为什么。更好地理解编译

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

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

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

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

+0

我可以用不同的形式写出这个问题,例如,“程序只是在IO部件中以不同的方式编译?”,但我只是希望我的问题的上下文和意图清楚。 –

+1

如果你想让你的问题清楚,你可能需要考虑重写你的标题。目前标题非常广泛(不是说你的问题是)。 – ace

+1

这与编译有关吗?实际上翻译同样如此。对于一个操作系统,甚至是简单的驱动程序,整体也是如此:它们为底层硬件提供抽象。您在软件中到处都有横向分层。 – Olaf

回答

1
  1. 不指定您是否使用相同的版本相同的编译器中,完成同样的优化标志。您也不会指定两个操作系统是使用相同的目标文件格式,还是使用相同的调用约定。如果其中任何一个不匹配,二进制文件也不会。

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

  3. 你在这里讨论的是我总结的“调用约定”。这只是差异的一部分。两个操作系统可能在同一个体系结构上具有相同的调用约定 - 同样的编译器等等 - 但仍然没有匹配的库。

+0

谢谢!这正是我所期待的。结合对原始答案的评论,我对现在应该深入研究的内容有非常深刻的理解。 –