以下是我的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文件中转储节标题时,我看到了:
所以VMA和LMA仍然是0x20000000,其中是SIZEOF_HEADERS ???我认为它应该是ELF文件头大小,但似乎是0.为什么?
根据here:
SIZEOF_HEADERS
返回输出文件标题的大小(以字节为单位)。这是出现在输出文件开头的信息。您可以使用 设置第一部分的起始地址时的此数字,如果 你选择,以方便分页。
生成ELF输出文件时,如果链接描述文件使用SIZEOF_HEADERS内置函数,则链接器必须计算 在确定所有节地址之前的程序头 大小。如果链接器稍后发现它需要其他程序 标题,它会报告错误`没有足够的程序空间 报头&#39 ;.要避免此错误,您必须避免使用SIZEOF_HEADERS 函数,或者您必须重新编写链接器脚本以避免强制执行 链接器使用其他程序头,或者您必须定义 使用PHDRS命令自己编程标题(参见PHDRS)。
答案 0 :(得分:0)
到目前为止,我认为>CODE
覆盖 从位置计数器.
计算的VMA。 .startup_bsp
部分附加到CODE
内存区域。
因为它是CODE
区域的第一部分,所以它占据该地区的起始地址。