通常,编译器输出的目标文件采用特定格式,例如在Linux等上使用ELF,在macOS上使用mach-O,在Windows上使用COFF / PE。
现在,假设源代码跨平台兼容。有没有格式独立的“目标文件”形式?从某种意义上讲,此“格式独立格式”的二进制文件以后可以“转换”或“降低”为任何格式(ELF / mach-O / ..)的真实对象文件。
LLVM IR的二进制格式是一个很好的例子,因为它可以简化为机器代码。但是,LLVM IR与ISA独立,因此不够“低级”。假设已提供ISA(例如x86_64),我可以从与ISA独立到更低与格式无关的地方了吗?
答案 0 :(得分:3)
我很确定没有这种格式,至少没有主流编译器支持的格式。 (即使有这种格式,没有编译器支持也几乎没有用。)
但是,借助objconv
utility(可以在目标文件格式之间进行转换),您可以实现您所描述的内容。
只需选择一种现有格式作为“独立”格式,然后使用objconv
转换为“特定”格式(ELF / Mach-O / COFF)。
它工作得很好,尽管在转换过程中未保留某些平台特定的数据(例如调试信息)。