Binary 与格式无关的二进制对象?

Binary 与格式无关的二进制对象?,binary,compiler-construction,operating-system,llvm,system,Binary,Compiler Construction,Operating System,Llvm,System,通常,编译器输出的对象文件是特定格式的,例如Linux上的ELF等,macOS上的mach-O,Windows上的COFF/PE 现在,假设源代码跨平台兼容。是否存在格式独立的“对象文件”形式?从这个意义上说,这种“格式独立格式”的二进制文件可以在以后“转换”或“降低”为任何格式(ELF/mach-O/)的真实对象文件 LLVMIR的二进制形式就是一个很好的例子,因为它可以简化为机器代码。然而,LLVM IR是独立于ISA的,因此它还不够“低级别”。假设给定了ISA(例如x86_64),我可以从

通常,编译器输出的对象文件是特定格式的,例如Linux上的ELF等,macOS上的mach-O,Windows上的COFF/PE

现在,假设源代码跨平台兼容。是否存在格式独立的“对象文件”形式?从这个意义上说,这种“格式独立格式”的二进制文件可以在以后“转换”或“降低”为任何格式(ELF/mach-O/)的真实对象文件


LLVMIR的二进制形式就是一个很好的例子,因为它可以简化为机器代码。然而,LLVM IR是独立于ISA的,因此它还不够“低级别”。假设给定了ISA(例如x86_64),我可以从独立于ISA降低到独立于格式吗?

我很确定没有这种格式,至少主要编译器不支持这种格式。 (即使有这样的格式,如果没有编译器支持,它实际上也是无用的。)

但是,借助它可以在对象文件格式之间进行转换,您可以实现所描述的功能。 只需选择一种现有格式作为“独立”格式,然后使用
objconv
转换为“特定”格式(ELF/Mach-O/COFF)


虽然某些特定于平台的数据(如调试信息)在转换过程中没有保留,但它工作得相当好。

我非常确定没有这种格式,至少主要编译器不支持这种格式。 (即使有这样的格式,如果没有编译器支持,它实际上也是无用的。)

但是,借助它可以在对象文件格式之间进行转换,您可以实现所描述的功能。 只需选择一种现有格式作为“独立”格式,然后使用
objconv
转换为“特定”格式(ELF/Mach-O/COFF)


它工作得很好,尽管一些特定于平台的数据(如调试信息)在转换过程中不会被保留。

请。。不要问我“你为什么要这样做”,这在这里被问了很多。我只是好奇。是的,我知道我可能只是重新编译源代码,是的,我知道Java字节码实现了类似的目标(但它在运行时需要Java VM),提前谢谢!目标代码主要是机器代码,在链接时为其固定了各种“松散端”。没有可移植的
目标代码
,考虑到目标代码对操作系统、外部库、ABI和芯片功能有大量的假设,将一种形式转换为另一种形式的努力将非常重要。所以第一个问题的答案是“不”。因此,第二个问题的答案也是“否”。程序是特定于目标的,windows printf hello world程序预计不会产生与linux程序相同的程序。现在在对象层…也许吧,但是由于二进制文件构造中操作系统的系统调用和规则在任何方面都不兼容,所以必须询问您正在尝试做什么。但正如所回答的,有一些工具可以做到这一点,binutils有一个内置的。C语言的全部要点和跨平台兼容的错觉是因为二进制文件不是。源下面有一层,兼容性停止。特别是使用相同的isa但不同的目标操作系统。。不要问我“你为什么要这样做”,这在这里被问了很多。我只是好奇。是的,我知道我可能只是重新编译源代码,是的,我知道Java字节码实现了类似的目标(但它在运行时需要Java VM),提前谢谢!目标代码主要是机器代码,在链接时为其固定了各种“松散端”。没有可移植的
目标代码
,考虑到目标代码对操作系统、外部库、ABI和芯片功能有大量的假设,将一种形式转换为另一种形式的努力将非常重要。所以第一个问题的答案是“不”。因此,第二个问题的答案也是“否”。程序是特定于目标的,windows printf hello world程序预计不会产生与linux程序相同的程序。现在在对象层…也许吧,但是由于二进制文件构造中操作系统的系统调用和规则在任何方面都不兼容,所以必须询问您正在尝试做什么。但正如所回答的,有一些工具可以做到这一点,binutils有一个内置的。C语言的全部要点和跨平台兼容的错觉是因为二进制文件不是。源下面有一层,兼容性停止。尤其是使用相同的isa但不同的目标操作系统