Xin*_*nus 24 c c++ operating-system
是否可以在一个平台上编译程序并与其他平台链接?对象文件包含什么?我们可以将可执行文件脱钩以生成目标文件吗?
Ric*_*ton 22
不可以.一般来说,目标文件格式可能相同,例如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
Run Code Online (Sandbox Code Playgroud)
目标代码通常不仅是处理器特定的,而且例如,如果它包含系统调用,则还特定于OS.
Is it possible to compile program on one platform and link with other ?
Run Code Online (Sandbox Code Playgroud)
绝对.如果使用交叉编译器.此编译器专门针对平台并生成与目标平台兼容的目标文件(和程序).因此,您可以使用X86 Linux系统,例如,使用适当的交叉编译器为基于powerpc或ARM的系统制作程序.我这样做是在这里.
jas*_*son 17
是否可以在一个平台上编译程序并与其他平台链接?
一般来说,没有.目标文件特定于编译器.一些编译器吐出COFF,其他编译器吐出ELF等.最重要的是,你必须担心调用约定,系统调用等.这是依赖于平台的.
对象文件包含什么?
符号表,代码,重定位,链接和调试信息.
如果您所追求的是可移植性,那么编写可移植的C/C++并让特定于平台的兼容编译器完成工作.
在实践中,没有.有几件事必须是相同的: - OS接口(相同的系统调用) - 数据的内存布局(字节序,结构填充等) - 调用约定 - 目标文件格式(例如ELF在Linux上非常标准)
查找ABI以获取更多信息.
无需再说一遍:C/C++ 对象文件不可移植。
另一方面,ANSI C 是最便携的语言之一。您可能无法获取目标文件,但如果您坚持 ANSI C 标准,则重新编译源代码可能会奏效。这也可能适用于 C++。
我不知道 GNU C++ 的通用性如何,但是如果您可以在一台计算机上使用 gcc 进行编译,那么您就可以在任何其他安装了 gcc 的机器上继续使用。几乎你能想到的每台机器都有一个 C 编译器。 这就是便携性。
不,它们不是独立于平台的。以生成 ELF 二进制文件的 GNU C 编译器 (gcc) 为例。Windows 编译器(Borland、Microsoft、Open Watcom)可以生成 Windows 二进制 PE(便携式可执行文件)格式。Novell 二进制文件是 NLM(Netware Loadabable Module)格式。
上面这些依赖于编译器的不同输出的例子,Windows 平台上的链接器不可能知道关于 ELF 格式或 NLM 格式的任何信息,因此不可能组合不同的格式来生成可以运行的可执行文件任何平台。
以 Apple 的 Mac OSX(在安装 Intel 芯片之前)为例,它们运行在 PowerPC 平台上,即使它有 GNU C 编译器,二进制文件也是专门用于 PowerPC 平台的,如果您要使用该二进制文件并复制它在Linux 平台上运行,由于平台微处理器即PowerPC 的指令不同,它不会运行。
同样,同样的原则也适用于 OS/390 大型机系统,为该平台生成二进制文件的 GNU C 编译器不会在英特尔之前的 Apple Mac OSX 上运行。
编辑:为了进一步阐明 ELF 格式的外观,请参见下文,这是通过objdump -s main.o在 Linux 下运行获得的。
main.o:文件格式 elf32-i386 .text 部分的内容: 0000 8d4c2404 83e4f0ff 71fc5589 e55183ec .L$.....qU.Q.. 0010 14894df4 a1000000 00a30000 0000a100 ..... 0020 000000a3 00000000 8b45f483 38010f8e ...........8... 0030 9c000000 8b55f48b 420483c0 048b0083 ......U..B...... 0040 ec086800 00000050 e8fcffff ff83c410 ..h...P ...... 0050 a3000000 00a10000 000085c0 7520a100 ..... 0060 00000050 6a1f6a01 68040000 00e8fcff ...Pj.jh...... 0070 ffff83c4 10c745f8 01000000 eb5a8b45 ......E......ZE 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 jh(.... 00c0 fcffffff 83c410c7 45f80100 0000eb08 ..... 00d0 e8fcffff ff8945f8 8b45f88b 4dfcc98d ......E..E..M... 00e0 61fcc3 a.. .rodata 部分的内容: 0000 72000000 4552524f 52202d20 63616e6e r...错误 - 罐头 0010 6f74206f 70656e20 696e7075 74206669 ot 打开输入 fi 0020 6c650a00 77000000 4552524f 52202d20 le..w...错误 - 0030 63616e6e 6f74206f 70656e20 6f757470 无法打开输出 0040 75742066 696c650a 00 ut 文件.. .comment 部分的内容: 0000 00474343 3a202847 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 版本 9.00.30729.01
版权所有 (C) 微软公司。版权所有。
转储文件 C:\Documents and Settings\Tom\My Documents\Visual Studio 2008\Projects\SimpleLib\Release\SimpleLib.dll
文件类型:DLL
概括
1000 .data
1000 .rdata
1000 .reloc
1000 .rsrc
1000 .text
注意ELF下的部分的差异,有.bss,.text,.rodata和.comment,并且是用于I386处理器的ELF格式。
希望这会有所帮助,最好的问候,汤姆。