【问题标题】:Link function to specific address链接功能到特定地址
【发布时间】: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


【解决方案1】:

ENTRY() 设置执行时的 PC 起点,STARTUP() .text 中的第一个链接对象

顺便说一句,对于裸大脑皮层 ARM gnu-arm-none-eabiENTRY() 通常设置为 Reset_Handler 向量,.text 必须以中断向量表开头。

我一直看到它是手动设置的。但也许可以使用STARTUP()

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多