【发布时间】:2016-06-01 03:07:42
【问题描述】:
我对 GCC 链接描述文件中的 ENTRY 和 STARTUP 命令有点困惑。
如此处所述:http://wiki.osdev.org/Linker_Scripts
ENTRY() 将任何符号链接为 .text 部分中的第一项。 另一方面,STARTUP() 使整个编译文件作为第一项放置在 .text 部分中。
但在我的项目中,它的行为很奇怪。
我正在使用 gnu-arm-none-eabi 工具链,并且在我的链接器脚本命令 ENTRY(asm_start) 中不起作用。链接描述文件:
ENTRY(asm_start)
MEMORY
{
RAM : ORIGIN = 0x10000, LENGTH = 0x1000000
PIC_BUFF : ORIGIN = 0x10000 + LENGTH(RAM), LENGTH = 200M
}
SECTIONS
{
.text : {*(.text)} > RAM
.data : {*(.data)} > PIC_BUFF
// etc.
组装函数:
.text
.global asm_start
.global exc_stack
.global supervisor_sp
asm_start:
# initialize Stack pointer for exception modes
mrs r4, cpsr
bic r4, r4, #0x1f
#FIQ Mode
orr r3, r4, #0x11
msr cpsr_c, r3
ldr sp, =exc_stack
#IRQ Mode
orr r3, r4, #0x12
msr cpsr_c, r3
// etc.
asm_start 在内存中的某个随机位置结束。
另一方面,STARTUP() 函数工作正常,所需文件在 .text 部分的适当位置结束。
能否解释一下在这种情况下到底发生了什么?
【问题讨论】:
-
我对此不是 100% 确定,但看起来 ENTRY() 设置了执行时的 PC 起点,而 STARTUP() 是 .text 中的第一个链接对象
-
哦,原来如此。 “成为加载程序的第一个字节(或 ELF 和 PE 二进制文件中 .text 部分的第一个字节)。”但我的程序既不是 ELF 也不是 PE 二进制文件。非常感谢。把它作为答案,我会接受的。
标签: linker