计算机之间的C对象文件兼容性

时间:2013-01-13 02:21:01

标签: c assembly compiler-construction linker compatibility

首先,我想说明这个问题与学校/家庭作业有关。

假设计算机CP1和CP2共享相同的操作系统和机器语言。如果在CP1上编译C程序,为了将其移动到CP2,是否需要传输源代码并在CP2上重新编译,或者只是传输目标文件。

我的直觉回答是目标文件应该足够了。 C代码由编译器转换为汇编代码,并由汇编程序汇编为机器代码。因为架构共享相同的机器代码和操作系统,所以我没有看到问题。

但是我想的越多,我就会越困惑。

我的问题是:

a)由于它引用了目标文件而不是可执行文件,我假设没有链接。在CP2上链接时会出现任何问题吗?

b)如果代码在CP1上使用C11标准,但CP2上唯一的编译器是C99,这是否重要?我假设一旦编译/汇编代码,这是无关紧要的。

c)问题没有指定共享/动态链接库。所以只有当程序没有.dll / .so / .dylib文件的依赖时才会真正起作用,否则CP2上也需要这些。

我觉得有这么多陷阱,考虑到问题是多么模糊,我现在觉得简单地重新编译会更安全。

HALP!

3 个答案:

答案 0 :(得分:3)

答案是,这取决于。当您编译C程序并将目标文件移动到另一台计算机上的链接时,它应该可以工作。但由于endiannessname mangling等因素,您的程序可能无法正常运行,甚至可能在您尝试运行时崩溃。

C11编译器不支持

C99,但是如果源代码已经编译和汇编则无关紧要。

只要在一台计算机上使用库编译源代码,就不需要这些库链接或运行另一台计算机上的文件(仅限静态库,动态库必须在您运行应用程序的计算机上)。这就是说,你应该使程序独立,这样你就不会遇到程序无法正常工作或崩溃的问题。

您可以获得支持EABI的编译器,这样您就不会遇到这些问题。支持EABI的编译器创建与其他此类编译器生成的代码兼容的目标代码,从而允许开发人员将使用一个编译器生成的库与使用不同编译器生成的目标代码链接。

我之前尝试过这样做,但不是很多,而不是最近。因此,我的信息可能不是100%准确。

答案 1 :(得分:1)

a)我已经听过“对象文件”一词用来指代链接的二进制文件 - 即使它有点不准确。所以也许他们的意思是“二进制”。我会说如果它有不同的编译器,在不同的机器上链接可能会有问题 - 除非目标文件格式是标准化的,我不确定。

b)使用不同的标准甚至编译器对二进制代码无关紧要 - 如果它是静态链接的。如果它依赖于动态库中的函数,则可能存在问题。哪个答案c)以及:是的,这将是一个问题。如果程序没有正确版本中的所有必需动态库,则程序将无法启动。取决于链接模式(静态与动态),再次。

答案 2 :(得分:0)

问:假设计算机CP1和CP2共享相同的操作系统和机器语言。

答:然后你可以在两台计算机上运行相同的.exe文件

问:如果在CP1上编译了C程序,为了将其移动到CP2,是否需要传输源代码

答:不可以。如果要重新编译,只需要源代码。如果它是一个不同的,不兼容的CPU和/或操作系统,则只需要重新编译。

程序执行通常根本不需要“对象文件”:

  

http://en.wikipedia.org/wiki/Object_files

     

目标文件是包含可重定位格式的机器代码的文件   通常不能直接执行。对象文件由。生成   汇编程序,编译器或其他语言翻译器,用作   输入到链接器。

“可执行程序”可能需要一个或多个“共享库”(又名.dll)。在这种情况下,相同的限制适用:共享库(如果尚未驻留)必须与.exe一起复制,并且还必须与CPU和OS兼容。

最后,需要重新编译 not 的“脚本”。您可以将脚本从计算机自由复制到计算机。但是每台计算机都必须有一个“解释器”来运行脚本:Perl脚本需要Perl解释器,Python脚本需要python解释器,等等。