【问题标题】:Why the "SIZEOF_HEADERS" in ld script is 0?为什么 ld 脚本中的“SIZEOF_HEADERS”为 0?
【发布时间】:2016-11-19 15:45:15
【问题描述】:

以下是我的 ld 脚本中的一些 sn-p:

输出格式

OUTPUT_FORMAT("elf32-i386", "elf32-i386",
          "elf32-i386")
OUTPUT_ARCH(i386)

内存布局

MEMORY
{
  CFLASH             (xri)    : ORIGIN = 0x20000000, LENGTH = 0x1000
  (...omitted...)
}

REGION_ALIAS("CODE",    CFLASH)

部分布局

SECTIONS
{
  PROVIDE (__executable_start = SEGMENT_START("text-segment", ORIGIN(CODE))); 
  . = SEGMENT_START("text-segment", ORIGIN(CODE)) + SIZEOF_HEADERS;  <=== PLACE 1
  
  (...omitted...)

  .startup_bsp        :
  {
    KEEP (*(.startup_bsp))
    . = ALIGN (., 0x4);
  } >CODE =0xF4F4F4F4

  (...omitted...)

据我了解,位置计数器“。”代表VMA。在PLACE 1,VMA 应该设置为 0x20000000 + SIZEOF_HEADERS

但是当我从生成的 ELF 文件中转储节标题时,我看到了:

所以VMA和LMA还是0x20000000,SIZEOF_HEADERS在哪里???我认为它应该是 ELF 文件头大小,但它似乎是 0。为什么?

根据here

SIZEOF_HEADERS

返回输出文件头的字节大小。这是出现在输出文件开头的信息。您可以使用 这个数字在设置第一节的起始地址时,如果 您选择,方便分页。

在生成 ELF 输出文件时,如果链接描述文件使用 SIZEOF_HEADERS 内置函数,则链接程序必须计算 在确定所有节地址之前的程序头和 尺寸。如果链接器后来发现它需要额外的程序 headers,会报错`not enough room for program 标头”。为避免此错误,您必须避免使用 SIZEOF_HEADERS 函数,或者您必须重新编写链接描述文件以避免强制 链接器使用额外的程序头,或者你必须定义 使用 PHDRS 命令自己编写程序标头(请参阅 PHDRS)。

【问题讨论】:

    标签: gnu ld elf binutils


    【解决方案1】:

    到目前为止,我猜是&gt;CODE覆盖从位置计数器. 计算出的VMA。 .startup_bsp 部分附加到CODE 内存区域。

    由于它是CODE 区域的第一部分,它占据了该区域的起始地址。

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 2016-08-03
      • 2011-06-08
      • 2022-11-30
      • 2017-07-12
      • 2012-11-12
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多