C++ 对象文件是否独立于平台?

C++ 对象文件是否独立于平台?,c++,c,operating-system,C++,C,Operating System,有可能在一个平台上编译程序并与另一个平台链接吗?对象文件包含什么?我们可以将可执行文件断开链接以生成对象文件吗 有可能在一个平台上编译程序并与另一个平台链接吗 一般来说,没有。对象文件是特定于编译器的。一些编译器会吐出,其他编译器会吐出,等等。除此之外,您还需要担心调用约定、系统调用等。这取决于平台 对象文件包含什么 符号表、代码、重新定位、链接和调试信息 如果您追求的是可移植性,那么就编写可移植C/C++并让平台特定的兼容编译器来完成这项工作 它们依赖于平台。例如,“文件”命令打印出以下内容:

有可能在一个平台上编译程序并与另一个平台链接吗?对象文件包含什么?我们可以将可执行文件断开链接以生成对象文件吗

有可能在一个平台上编译程序并与另一个平台链接吗

一般来说,没有。对象文件是特定于编译器的。一些编译器会吐出,其他编译器会吐出,等等。除此之外,您还需要担心调用约定、系统调用等。这取决于平台

对象文件包含什么

符号表、代码、重新定位、链接和调试信息


如果您追求的是可移植性,那么就编写可移植C/C++并让平台特定的兼容编译器来完成这项工作

它们依赖于平台。例如,“文件”命令打印出以下内容:

$ file foo.o
foo.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

实际上,没有。有几件事情必须是相同的: -操作系统接口(相同的系统调用) -数据的内存布局(endianness、结构填充等) -呼叫约定 -对象文件格式(例如,ELF在Linux上非常标准)


查阅ABI了解更多信息。

否。在一般情况下,目标文件格式可能相同,例如ELF,但目标文件的内容因系统而异

对象文件包含以下内容:

Object code that implements the desired functionality
A symbol table that can be used to resolve references
Relocation information to allow the linker to locate the object code in memory
Debugging information
目标代码通常不仅是特定于处理器的,而且是特定于操作系统的,例如,如果它包含系统调用。
编辑:


当然。如果使用交叉编译器。此编译器专门针对一个平台,并生成与目标平台兼容的目标文件(和程序)。因此,您可以使用X86 Linux系统,例如,使用适当的交叉编译器为基于powerpc或ARM的系统制作程序。我做到了

不用再说了:C/C++对象文件是不可移植的

另一方面,ANSIC是最可移植的语言之一。您可能无法提取目标文件,但如果坚持ANSI C标准,则重新编译源代码可能会起作用。这也可能是C++的真实用法。
我不知道通用的GNU C++是如何的,但是如果你可以在一台计算机上编译GCC,那么你可以去安装其他的GCC。几乎你能想到的每台机器都有一个C编译器。这就是可移植性。

不。它们不是独立于平台的。以生成ELF二进制文件的GNUC编译器(gcc)为例。Windows编译器(Borland、Microsoft、Open Watcom)可以生成Windows二进制PE(可移植可执行文件)格式。Novell二进制文件是NLM(Netware可加载模块)格式

以上这些不同输出的示例依赖于编译器,Windows平台上的链接器不可能了解ELF格式或NLM格式,因此不可能组合不同格式以生成可在任何平台上运行的可执行文件

以苹果的Mac OSX为例(在英特尔芯片投入使用之前),它们是在PowerPC平台上运行的,即使它有GNU C编译器,二进制文件是专为PowerPC平台设计的,如果你将二进制文件复制到Linux平台上,由于平台微处理器(即PowerPC)指令的差异,它不会运行

同样,同样的原则也适用于OS/390大型机系统,一个为该平台生成二进制文件的GNU C编译器不会在英特尔之前的苹果Mac OSX上运行

编辑:为了进一步阐明ELF格式的外观,请参见下文,这是通过在Linux下运行
objdump-s main.o
获得的

main.o: file format elf32-i386 Contents of section .text: 0000 8d4c2404 83e4f0ff 71fc5589 e55183ec .L$.....q.U..Q.. 0010 14894df4 a1000000 00a30000 0000a100 ..M............. 0020 000000a3 00000000 8b45f483 38010f8e .........E..8... 0030 9c000000 8b55f48b 420483c0 048b0083 .....U..B....... 0040 ec086800 00000050 e8fcffff ff83c410 ..h....P........ 0050 a3000000 00a10000 000085c0 7520a100 ............u .. 0060 00000050 6a1f6a01 68040000 00e8fcff ...Pj.j.h....... 0070 ffff83c4 10c745f8 01000000 eb5a8b45 ......E......Z.E 0080 f4833802 7e218b55 f48b4204 83c0088b ..8.~!.U..B..... 0090 0083ec08 68240000 0050e8fc ffffff83 ....h$...P...... 00a0 c410a300 000000a1 00000000 85c07520 ..............u 00b0 a1000000 00506a20 6a016828 000000e8 .....Pj j.h(.... 00c0 fcffffff 83c410c7 45f80100 0000eb08 ........E....... 00d0 e8fcffff ff8945f8 8b45f88b 4dfcc98d ......E..E..M... 00e0 61fcc3 a.. Contents of section .rodata: 0000 72000000 4552524f 52202d20 63616e6e r...ERROR - cann 0010 6f74206f 70656e20 696e7075 74206669 ot open input fi 0020 6c650a00 77000000 4552524f 52202d20 le..w...ERROR - 0030 63616e6e 6f74206f 70656e20 6f757470 cannot open outp 0040 75742066 696c650a 00 ut file.. Contents of section .comment: 0000 00474343 3a202847 4e552920 342e322e .GCC: (GNU) 4.2. 0010 3400 4. main.o:文件格式elf32-i386 第节内容。正文: 0000 8d4c2404 83e4f0ff 71fc5589 e55183ec.L$…q.U..q。。 0010 14894df4 A100000000A30000 0000a100..M。。。。。。。。。。。。。 002000000 A3 00000000 8b45f483 38010f8e…E…8。。。 0030 9c000000 8b55f48b 420483c0 048B00083……美国。。。。。。。 0040 EC0868000 00000050 e8fcffff ff83c410..h..P。。。。。。。。 0050 a3000000 00a10000 000085c0 7520a100…………u。。 0060 000000 50 6a1f6a01 68040000 00e8fcff…Pj.j.h。。。。。。。 0070 ffff83c4 10c745f8 01000000 eb5a8b45……E……Z.E 0080 f4833802 7e218b55 f48b4204 83c0088b..8.~!。U..B。。。。。 0090 0083ec08 68240000 0050e8fc FFFFFF 83….h$…P。。。。。。 00a0 C410A3000000 A1 00000000 85c07520………u 00b0 A100000000506A20 6a016828 000000 E8…..Pj.h(。。。。 00c0 fcffffff 83c410c7 45f80100 0000eb08…….E。。。。。。。 00d0 e8fcffff ff8945f8 8b45f88b 4dfcc98d…E..E..M。。。 00e0 61fcc3 a。。 第节的内容。rodata: 0000 720000004552524F 52202d20 63616e6e r…错误-cann 0010 6f74206f 70656e20 696e7075 74206669 ot开路输入fi 0020 6c650a00 770000004552524F 52202d20 le..w…错误- 0030 63616e6e 6f74206f 70656e20 6f757470无法打开输出 0040 75742066 696c650a 00 ut文件。。 第节内容。评论: 0000 0047433A202847 4e552920 342e322e.GCC:(GNU)4.2。 0010 3400 4. 现在将其与简单DLL的PE格式进行比较

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>dumpbin /summary "C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll" Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll File Type: DLL Summary 1000 .data 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>dumpbin/summary“C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll” Microsoft(R)COFF/PE转储程序版本9.00.30729.01 版权所有(C)微软公司。保留所有权利。 转储文件C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll 文件类型:DLL 总结 1000.数据 1000.rdata 1000.重新调整 1000.rsrc 1000.文本 请注意ELF下各部分的差异,其中有
.bss
.text
.rodata
.comment
,是i386处理器的ELF格式

希望这有帮助, 顺致敬意,
Tom.

C++还有一个额外的细节,即它放入对象文件的名称通常会“损坏”到交易类型 C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>dumpbin /summary "C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll" Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll File Type: DLL Summary 1000 .data 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text