确保GCC汇编代码始终位于第一部分的最佳实践?

时间:2015-08-14 08:14:44

标签: gcc assembly makefile linker arm

我有一些可用的代码,包含一个startup_code.s文件和 几个.c文件。由于startup_code.o需要在偏移量0x000000处 rom / flash我把对象放在makefile中:

OBJ_FILE = \
    $(OBJECT_DIR)/startup_code.o \   <- Assembler startup
    $(OBJECT_DIR)/loader.o \
    $(OBJECT_DIR)/display.o \
.
.

到目前为止这是有效的,但我现在想确保rom中startup_code.o的位置不依赖于makefile中的顺序。

我的第一个方法是更改​​.s文件:

.section .startup
Vector_Table:
   LDR      PC,=Reset_Handler
   .
   .
   .

和链接器的memory.def文件:

SECTIONS
{
    . = 0xE0000000;
    .startup : { *(.startup) }
    .text : { *(.text) }
    .data : { *(.data) }
    .bss  : { *(.bss)  }
}

这不起作用,因为在二进制输出中省略了startup_code.o! (奇怪的是,汇编程序列表首先正确显示了startup_code!)

我还尝试直接命名汇编程序obj文件:

SECTIONS
{
    . = 0xE0000000;
    .text : { startup_code.o(.text) }
    .text : { *(.text) }
    .data : { *(.data) }
    .bss  : { *(.bss)  }
}

问题:链接器抱怨它无法找到 startup_code.o - 虽然它存在。

最后我成功使用了这个def文件:

SECTIONS
{
    . = 0xE0000000;
    .text : { *(.startup) }
    .text : { *(.text) }
    .data : { *(.data) }
    .bss  : { *(.bss)  }
}

但是,我不确定这是否是一种值得推荐的方法,并且想知道问题(在开始时找到启动代码)是如何解决的,并且#34;正确的方式&#34;如果我必须照顾链接器不要抛出未引用的代码?

1 个答案:

答案 0 :(得分:-2)

类似

.section .startup
Vector_Table:
   LDR      PC,=Reset_Handler
   ....
MEMORY
{
    rom (rx) : ORIGIN = 0xE0000000, LENGTH = 32K
}

SECTIONS
{
    .text : {
        *(.startup) /* Startup code */
        *(.text*)   /* remaining code */
    } >rom
    .....
}

作为一个例子,您可以引用libopencm3来查找您所看到的内容 Memory information linker script
Generic linker script
Vector handler

注意:我从中看到的是,它描述了内存布局(因为有多个目标)和一个通用文件来统一代码。 (虽然这与此无关,但您可以将两个内容保存在一个文件中)

以这种方式保持内存信息和布局信息分开。 并且更容易理解和管理。