【发布时间】: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)。
【问题讨论】: