包含要生成的目标文件未使用的输入可重定位目标文件的函数和数据是一种浪费。这种不需要的材料会使目标文件过大,在运行时使用该目标文件时会导致额外开销。
引用未使用的共享目标文件依赖项也是一种浪费。特别是不存在延迟装入时,这些引用会导致在运行时不必要地装入和处理这些共享目标文件。
在链接编辑期间可以使用链接编辑器的调试选项 -D unused 诊断未使用的节、未使用的可重定位目标文件和未使用的共享目标文件依赖项。
使用 -z guidance 选项时还会诊断未使用的文件和依赖项。
应该从链接编辑中删除未使用的节、未使用的文件和未使用的依赖项。此删除可减少链接编辑的成本,减少使用要生成的目标文件的运行时成本。但是,如果删除这些项会产生问题,则可以使用 -z discard-unused 选项从要生成的目标文件中丢弃未使用的材料。
当三个条件为真时,确定不使用输入可重定位目标文件中的 ELF 节。
节不提供任何全局符号。
该节是某个可分配段的构成部分。
参与链接编辑的任何目标文件中的任何其他已使用的节均不引用该节。
可以使用 -z discard-unused=sections 选项从链接编辑中丢弃未使用的节。
通过定义动态目标文件的外部接口可以改进链接编辑器诊断和丢弃节的功能。请参见第 9 章。通过定义接口,可以将未定义为此接口一部分的全局符号降级为局部符号。此时将未从其他目标文件引用的降级后符号明确标识为供丢弃的目标文件。
如果将单个函数和数据变量指定给其自己的节,则使用链接编辑器可以丢弃这些项。可以使用 -xF 编译器选项完善此节。
如果由可重定位目标文件提供的所有可分配节都未使用,则会将输入可重定位目标文件判定为未使用的。
可以通过 -z guidance 选项诊断未使用的文件,也可以使用 -z discard-unused=files 选项从链接编辑中丢弃未使用的文件。
-z discard-unused 选项提供了对未使用的节和未使用的文件的独立控制以便支持 -z guidance 处理。通过 -z guidance,可以识别哪些文件被判定为未使用的。通常可以很容易地从链接编辑中删除未使用的文件。不过,通过 -z guidance 处理无法识别哪些节被判定为未使用的。未使用的节可能涉及更多分析和删除工作,可能会导致编译器操作超出您的控制。
组合使用 -z discard-unused=sections 选项和 -z guidance 选项,可自动删除未使用的节,同时为您识别未使用的文件以便从链接编辑中删除。
显式的共享目标文件依赖项是指使用路径名或使用 -l 选项(更常用)在命令行定义的依赖项。显式依赖项包含可能由编译器驱动程序提供的依赖项,如 -lc。如果两个条件为真,则会判定显式依赖项是未使用的。
不会从要生成的目标文件中引用依赖项提供的全局符号。
该依赖项不会针对任何隐式依赖项的要求进行补偿。
可以通过 -z guidance 选项诊断未使用的依赖项,并且可以使用 -z discard-unused=dependencies 选项从链接编辑中丢弃未使用的依赖项。
隐式依赖项是显式依赖项的依赖项。可以将隐式依赖项处理为链接编辑的一部分,以完成所有符号解析的关闭。此符号关闭确保要生成的目标文件是自包含的,不保留未引用的符号。
所有动态目标文件都应定义其需要的依赖项。缺省情况下,生成动态可执行文件时强制实现该要求,但仅当使用 -z defs 选项生成共享目标文件时才会强制实现。如果出现共享目标文件未定义目标文件需要的依赖项的不利情况,则有必要代表目标文件提供显式依赖项。此类依赖项称为补偿依赖项。系统性地使用 -z defs 选项可以消除对补偿依赖项的需求,以生成所有动态目标文件。
未定义其依赖项的的动态目标文件应该是正确的。但是,由于这些目标文件可能需要补偿依赖项以创建有效的进程,因此 -z discard-unused=dependencies 选项不会删除未使用的补偿依赖项。
-z ignore 和 -z record 选项是可以与 -z discard-unused=dependencies 选项结合使用的位置选项。这些位置选项针对选定的目标文件有选择地打开和关闭丢弃功能。