是否可以在Linux中编译带有MSB标志的ELF文件

时间:2015-09-01 06:01:36

标签: linux gcc elf

是否可以在GCC中编译具有MSB字节顺序的二进制文件?如果是这样,它们在执行时会正常工作吗?

2 个答案:

答案 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