用于处理未指定部分的链接器脚本表示法

问题描述 投票:0回答:1

我有一个目标文件,其中有一堆我不关心的编译器生成的部分。当我使用链接器脚本将平面二进制文件链接在一起时,我有时可以看到这些部分放置在二进制文件的开头或结尾。例如,如果我有链接器脚本:

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 = ;.
}

或者以某种方式让编译器根本不发出该部分,但我不想为我不知道的每个部分手动执行此操作。 有没有一种方法可以“通配”我在二进制文件末尾未指定的所有部分?

ld static-linking linker-scripts
1个回答
0
投票

语法

/DISCARD/ { *(*) }
会丢弃所有其他未命名的部分,例如:

SECTIONS {
    section1 { liba.o(section1a, section1b) }
    section2 { lib*.o(section2*) }
    /DISCARD/ { *(*) }
}

一般来说,节放置表达式的基本语法是

fileglob[(sectionglob, [sectionglobs...])]
,其中特殊节名称
/DISCARD/
将删除列出的节。

请注意顺序很重要 - 将

/DISCARD/ { *(*) }
放在链接器脚本的开头将丢弃所有输入文件的所有部分,即使它们是在后面的部分中指定的。

© www.soinside.com 2019 - 2024. All rights reserved.