我有一个目标文件,其中有一堆我不关心的编译器生成的部分。当我使用链接器脚本将平面二进制文件链接在一起时,我有时可以看到这些部分放置在二进制文件的开头或结尾。例如,如果我有链接器脚本:
SECTIONS {
__START = .;
.text : { *(.text) } /* I want all .text to go at the very start. */
.data : { *(.data) } /* Followed by .data. */
/* Every other section can go somewhere here. */
__END = ;.
}
然后,当我真正希望
.interp
位于开头时,可以将像 .note.gnu.build-id
或 .text
这样的部分放置在二进制文件的开头。我可以通过将这些部分放在最后来解决这个问题:
SECTIONS {
__START = .;
.text : { *(.text) } /* I want all .text to go at the very start. */
.data : { *(.data) } /* Followed by .data. */
/* Every other section can go somewhere here. */
.interp : { *(.interp) }
__END = ;.
}
或者以某种方式让编译器根本不发出该部分,但我不想为我不知道的每个部分手动执行此操作。 有没有一种方法可以“通配”我在二进制文件末尾未指定的所有部分?
语法
/DISCARD/ { *(*) }
会丢弃所有其他未命名的部分,例如:
SECTIONS {
section1 { liba.o(section1a, section1b) }
section2 { lib*.o(section2*) }
/DISCARD/ { *(*) }
}
一般来说,节放置表达式的基本语法是
fileglob[(sectionglob, [sectionglobs...])]
,其中特殊节名称 /DISCARD/
将删除列出的节。
请注意顺序很重要 - 将
/DISCARD/ { *(*) }
放在链接器脚本的开头将丢弃所有输入文件的所有部分,即使它们是在后面的部分中指定的。