我想编写一个类似于此的链接描述文件:
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
,.bss
和other.o
部分
当然,我给出的脚本存在问题:other.o
包含在之前使用的*
通配符中,因此它不会被放入输出部分{{1} }。
除了手动列出所有输入对象文件栏other
代替other.o
之外,有没有办法可以达到我想要的效果?
答案 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) }
}