1

我想编写一个看起来像这样的链接器脚本:

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) }
}

我的意图是按以下顺序:

  • 带有.textfrom的部分startup.o
  • .text,.data.bss包含来自所有其他输入文件的那些部分,除了other.o
  • ,.text.data部分.bss来自other.o

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

除了手动列出所有输入目标文件栏other.o代替*s 之外,还有什么方法可以在这里实现我想要的吗?

4

3 回答 3

3

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

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

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

.specialmem:
{
    *(.specialmem)
}

你也可以对 data/bss(全局变量)做同样的事情。假设您希望某些文件/函数最终位于特定的内存位置,最好在链接器文件中定义这些内存块,然后将它们放在那里,如下所示:

.specialmem:
{
    *(.specialmem)
} >specialMemBlock
于 2014-01-29T10:29:27.583 回答
2

您可能想尝试 EXCLUDE_FILE

像这样:*(EXCLUDE_FILE ( other.o) .text .text. )

于 2016-06-04T01:30:50.623 回答
1

部分解决方案:*通配符是成熟的文件通配符。如果你足够幸运,它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) }
}
于 2014-01-29T00:33:31.550 回答