是否可以在GCC中编译具有MSB字节顺序的二进制文件?如果是这样,它们在执行时会正常工作吗?
答案 0 :(得分:4)
将评论转换为类似答案的内容。
在某种程度上,它取决于CPU架构。在SPARC或Power上,您可能会发现MSB是默认值。在英特尔,默认情况下肯定是LSB,你可能不会。
在英特尔上。如果我以某种方式将每个ELF头条目更改为小端二进制文件中的MSB,那么它会正确执行吗?
没有;您必须对代码进行许多其他更改才能使其有最轻微的工作机会。基本上,每个数字都必须从小端到大端重新编写。
那会包括指令地址,即时参数等吗?我认为无论ELF标志如何,这些都应该保持小端。
只需进一步思考,我认为英特尔内核很有可能只会拒绝执行MSB ELF可执行文件。它被编译为期望LSB并且知道它不知道如何处理替代方案。要解决这个问题,您必须重建内核和动态加载器ld.so.1
。这可能只是你问题的开始。
总的来说,我认为这是一种无用的练习。在没有相反信息的情况下,我认为您不必担心处理英特尔二进制文件的MSB ELF头文件头;他们在实践中不会存在。
答案 1 :(得分:1)
它不认为在System V ABI中明确说明了AFAIK,ELF文件应该是本机字节序(并且e_ident[EI_DATA]
描述了所使用的字节顺序):
字节
e_ident[EI_DATA]
指定数据的编码 目标文件中特定于处理器的数据。以下编码 目前已定义。
您可能希望处理器特定数据处于处理器字节序中。例如,.got
的内容是特定于处理器的数据,您肯定希望它具有本机字节顺序。
在Intel计算机上,您必须使用ELFDATA2LSB
。
来自System V ABI ~ Intel386 Supplement 4th edition:
用于
e_ident
中的文件识别,即Intel386架构 需要以下值。e_ident[EI_CLASS] = ELFCLASS32 e_ident[EI_DATA] = ELFDATA2LSB
来自System V ABI ~ AMD64 supplement Draft 0.99.6:
用于
e_ident
,AMD64架构中的文件识别 需要以下值。e_ident[EI_CLASS] = ELFCLASS64 e_ident[EI_DATA] = ELFDATA2LSB