链接器脚本:将特定文件放在以后的位置

时间:2014-01-28 22:49:09

标签: c linker embedded ld bare-metal

我想编写一个类似于此的链接描述文件:

SECTIONS {
  . = 0x0;
  .startup . : { startup.o(.text) }
  .text : { *(.text) }
  .data : { *(.data) }
  .bss : { *(.bss COMMON) }
  . = 0x4000;
  other.text : { other.o(.text) }
  other.data : { other.o(.data) }
  other.bss : { other.o(.bss) }
}

我的意图是按顺序:

  • 来自.text
  • startup.o的部分
  • .text.data.bss包含除other.o以外的所有其他输入文件
  • .text
  • 中的.data.bssother.o部分

当然,我给出的脚本存在问题:other.o包含在之前使用的*通配符中,因此它不会被放入输出部分{{1} }。

除了手动列出所有输入对象文件栏other代替other.o之外,有没有办法可以达到我想要的效果?

3 个答案:

答案 0 :(得分:3)

您可以使用部分属性来解决此问题。假设在声明该文件(或任何其他文件)中的函数时添加以下属性:

void foo() __attribute__ ((section(".specialmem")));

链接描述文件中的类似部分定义:

.specialmem:
{
    *(.specialmem)
}

您也可以使用data / bss(全局变量)执行相同的操作。 假设您希望某些文件/函数最终位于特定的内存位置,最好在链接器文件中定义这些内存块,然后将它们放在那里:

.specialmem:
{
    *(.specialmem)
} >specialMemBlock

答案 1 :(得分:1)

您可能想尝试EXCLUDE_FILE

这样的事情: *(EXCLUDE_FILE( other.o).text .text。

答案 2 :(得分:0)

部分解决方案:*通配符是完全成熟的文件通配符。如果你很幸运other.o与其他输入文件位于不同的目录中,这将有效:

SECTIONS {
  . = 0x0;
  .startup . : { foo/startup.o(.text) }
  .text : { foo/*(.text) }
  .data : { foo/*(.data) }
  .bss : { foo/*(.bss COMMON) }
  . = 0x4000;
  other.text : { bar/other.o(.text) }
  other.data : { bar/other.o(.data) }
  other.bss : { bar/other.o(.bss) }
}