可执行文件都是链接器生成的,它总是使用链接器脚本,描述了如何把输入文件即各种对象文件中的section映射到生成文件中,并控制输出文件的存储布局。如果链接器没有指定链接器脚本,则使用默认的链接器脚本。看一段ecos中链接器输出脚本:
- MEMORY
- {
- sram : ORIGIN = 0x20000000, LENGTH = 0x00010000-CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
- flash : ORIGIN = 0x08000000, LENGTH = 0x00080000
- rom : ORIGIN = 0x64000000, LENGTH = 0x01000000
- ram : ORIGIN = 0x68000000, LENGTH = 0x00100000
- }
- SECTIONS
- {
- SECTIONS_BEGIN
- SECTION_rom_vectors (flash, 0x08000000, LMA_EQ_VMA)
- SECTION_RELOCS (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_text (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_fini (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_rodata (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_rodata1 (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_fixup (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_gcc_except_table (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_eh_frame (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_got (flash, ALIGN (0x8), LMA_EQ_VMA)
- SECTION_sram (sram, 0x20000400, FOLLOWING (.got))
- SECTION_data (ram, 0x68000000, FOLLOWING (.sram))
- SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA)
- CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
- SECTIONS_END
- }
上述的脚本中定义了生成文件中各个section的地址空间。
需要注意的是,链接器脚本中的section名称与目标架构有关。更多的知识还是搜索下吧
|