【问题标题】:Is compiling ELF files with MSB flag possible in Linux是否可以在 Linux 中编译带有 MSB 标志的 ELF 文件
【发布时间】:2015-09-01 06:01:35
【问题描述】:

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

【问题讨论】:

  • 在哪个架构上?在 SPARC 或 Power 上,您可能会发现 MSB 是默认设置。在 Intel 上,可能你不能。
  • 在英特尔上。如果我以某种方式将每个 ELF 标头条目更改为 little-endian 二进制文件中的 MSB,那会正确执行吗?
  • 否;您必须对代码进行许多其他更改才能使其有最小的工作机会。基本上,每个数字都必须从 little-endian 改写为 big-endian。
  • 我想你是时候去尝试一下了。我不确定,我也不愿意花太多精力去思考它——在我看来,这似乎是一种徒劳的练习。稍加思考,我认为英特尔的内核很有可能会简单地拒绝执行 MSB ELF 可执行文件。它被编译为期望 LSB,并且知道它不知道如何处理替代方案。要解决这个问题,您必须重建内核和动态加载程序ld.so.1。给你最好的英国人。
  • 您必须使用跨工具链才能在小端主机上生成大端代码。因为代码中还有其他地方处理字节序,网络htons和朋友等函数在编译代码中无法轻松修复。

标签: linux gcc elf


【解决方案1】:

将 cmets 转换成类似答案的东西。

在某种程度上,它取决于 CPU 架构。在 SPARC 或 Power 上,您可能会发现 MSB 是默认设置。在默认情况下绝对是 LSB 的 Intel 上,您可能不能。

在英特尔上。如果我以某种方式将每个 ELF 标头条目更改为 little-endian 二进制文件中的 MSB,那会正确执行吗?

没有;您必须对代码进行许多其他更改才能使其有最小的工作机会。基本上,每个数字都必须从 little-endian 改写为 big-endian。

会包括指令地址、立即参数等吗?我会假设不管 ELF 标志是什么,这些都应该保持 little-endian。

只要稍加思考,我认为英特尔的内核很有可能会简单地拒绝执行 MSB ELF 可执行文件。它被编译为期望 LSB,并且知道它不知道如何处理替代方案。要解决这个问题,您必须重建内核和动态加载程序ld.so.1。这可能只是你问题的开始。

总的来说,我认为这是徒劳的。在没有相反信息的情况下,我认为您无需担心处理英特尔二进制文件的 MSB ELF 标头的标头;它们在实践中不会存在。

【讨论】:

    【解决方案2】:

    它不认为它在System V ABI 中明确说明,但 AFAIK,ELF 文件预计将采用本机字节序(e_ident[EI_DATA] 描述了使用的字节序):

    Byte 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多