链接程序和库指南

插入

缺省情况下,运行时链接程序首先在动态可执行文件中搜索符号,然后在每个依赖项中进行搜索。使用此模型时,第一次出现的所需符号满足搜索要求。因此,如果同一符号存在多个实例,则会在所有其他实例中插入第一个实例。

简单解析中概述了插入如何影响符号解析。缩减符号范围中提供了有关更改符号可见性,从而减少意外插入几率的机制。

如果目标文件被显式标识为插入项,则可以对每个目标文件强制执行插入。使用环境变量 LD_PRELOAD 装入或通过链接编辑器的 -z interpose 选项创建的任何目标文件都会标识为插入项。运行时链接程序搜索符号时,将在应用程序之后、任何其他依赖项之前搜索标识为插入项的任何目标文件。

仅当在进行任何进程重定位之前装入了插入项的情况下,才能保证可以使用插入项提供的所有接口。在重定位处理开始之前,将装入使用环境变量 LD_PRELOAD 提供的插入项,或作为应用程序的非延迟装入依赖项建立的插入项。启动重定位之后,引入进程中的插入项会降级为正常依赖项。如果插入项是延迟装入的,或者是由于使用 dlopen(3C) 而装入的,则插入项可能会降级。可使用 ldd(1) 来检测前一种类别。


% ldd -Lr prog

        libc.so.1 =>     /lib/libc.so.1

        foo.so.2 =>      ./foo.so.2

        libmapmalloc.so.1 =>     /usr/lib/libmapmalloc.so.1

        loading after relocation has started: interposition request \

                (DF_1_INTERPOSE) ignored: /usr/lib/libmapmalloc.so.1

注 –

如果链接编辑器在处理延迟装入的依赖项时遇到显式定义的插入项,则插入项将被记录为非延迟可装入依赖项。