为什么" SIZEOF_HEADERS"在ld脚本是0?

时间:2016-07-16 16:00:45

标签: gnu ld elf binutils

以下是我的ld脚本中的一些片段:

输出格式

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...)

据我所知,位置计数器&#34;。&#34;代表VMA。在PLACE 1,VMA应设置为 0x20000000 + SIZEOF_HEADERS

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

enter image description here

所以VMA和LMA仍然是0x20000000,其中是SIZEOF_HEADERS ???我认为它应该是ELF文件头大小,但似乎是0.为什么?

根据here

  

SIZEOF_HEADERS

     

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

     

生成ELF输出文件时,如果链接描述文件使用SIZEOF_HEADERS内置函数,则链接器必须计算   在确定所有节地址之前的程序头   大小。如果链接器稍后发现它需要其他程序   标题,它会报告错误`没有足够的程序空间   报头&#39 ;.要避免此错误,您必须避免使用SIZEOF_HEADERS   函数,或者您必须重新编写链接器脚本以避免强制执行   链接器使用其他程序头,或者您必须定义   使用PHDRS命令自己编程标题(参见PHDRS)。

1 个答案:

答案 0 :(得分:0)

到目前为止,我认为>CODE 覆盖 从位置计数器.计算的VMA。 .startup_bsp部分附加到CODE内存区域。

因为它是CODE区域的第一部分,所以它占据该地区的起始地址。