The LD手册 http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html#SEC2没有解释什么KEEP
命令执行。下面是第三方链接描述文件的一个片段,其特点是KEEP
。什么是KEEP
命令执行ld
?
SECTIONS
{
.text :
{
. = ALIGN(4);
_text = .;
PROVIDE(stext = .);
KEEP(*(.isr_vector))
KEEP(*(.init))
*(.text .text.*)
*(.rodata .rodata.*)
*(.gnu.linkonce.t.*)
*(.glue_7)
*(.glue_7t)
*(.gcc_except_table)
*(.gnu.linkonce.r.*)
. = ALIGN(4);
_etext = .;
_sidata = _etext;
PROVIDE(etext = .);
_fini = . ;
*(.fini)
} >flash
Afaik LD 会将符号保留在该部分中,即使未引用符号也是如此。 (--gc-sections)。
通常用于二进制启动过程中具有某些特殊含义的部分,或多或少地标记依赖树的根。
(以下为 Sabuncu)
依赖树:
如果消除未使用的代码,则可以分析代码并标记所有可到达的部分(代码+全局变量+常量)。
因此,您选择一个部分,将其标记为“已使用”,然后查看它引用的其他(未使用)部分,然后将这些部分标记为“已使用”,并检查它们引用的内容等。
没有标记为“已使用”的部分是多余的,可以被删除。
由于一个部分可以引用多个其他部分(例如,一个过程调用三个不同的其他部分),因此如果您绘制结果,您会得到一棵树。
Roots:
然而,上述原则给我们带来了一个问题:始终使用的“第一”部分是什么?可以这么说,树的第一个节点(根)?这就是“keep()”的作用,它告诉链接器哪些部分(如果可用)是首先要查看的部分。因此,这些总是相互关联的。
通常,这些部分是从程序加载器调用的,以执行与动态链接(可以是可选的,并且取决于操作系统/文件格式)以及程序的入口点相关的任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)