链接程序和库指南

直接绑定

使用直接绑定的目标文件维护符号引用与提供定义的依赖项之间的关系。运行时链接程序使用此信息直接搜索关联目标文件中的符号,而不执行缺省符号搜索模型。只能对使用链接编辑指定的依赖项建立直接绑定信息。因此,建议使用 -z defs 选项。

可使用下列机制之一建立符号引用与符号定义的直接绑定。

直接绑定可以大大降低由于包含许多符号重定位与依赖项的动态进程而导致的符号查找开销。此模型还允许在已直接绑定到的不同目标文件中查找同名的多个符号。


注 –

通过将环境变量 LD_NODIRECT 设置为非空值,可在运行时禁用直接绑定。


缺省符号搜索模型允许将符号的所有引用绑定到某个定义。由于直接绑定忽略缺省搜索模型,因此直接绑定禁用隐式插入符号。但是,在搜索提供符号定义的目标文件之前,会先搜索任何显式标识为插入项的目标文件。显式插入项包括使用环境变量 LD_PRELOAD 装入的目标文件,或使用链接编辑器的 -z interpose 选项创建的目标文件。 请参见插入

某些接口可为缺省技术提供替代实现。这些接口期望其实现成为该技术在进程内的唯一实例。例如 malloc(3C) 系列。malloc() 系列实现有多种,并且每个系列都期望成为进程中使用的唯一实现。应该避免直接绑定到此类系列中的接口,否则同一进程可能会引用该技术的多个实例。例如,进程中的一个依赖项可针对 libc.so.1 直接绑定,而另一个依赖项可针对 libmapmalloc.so.1 直接绑定。对 malloc()free() 的两种不同实现的不一致使用很可能会产生错误。

提供期望成为进程中的单一实例的接口的目标文件应该避免直接绑定到其接口。为防止任何调用方直接绑定到某接口,可以使用下列机制之一标记该接口。

非直接标记禁止任何符号引用直接绑定到实现。用于满足引用要求的符号搜索将使用缺省符号搜索模型。在生成随 Solaris 提供的各种 malloc() 系列实现时,使用了非直接标记。


注 –

NODIRECT mapfile 指令可与命令行选项 -B direct-z direct 组合使用。未显式定义 NODIRECT 的符号位于该命令行指令之后。同样,DIRECT mapfile 指令也可与命令行选项 -B nodirect 组合使用。未显式定义 DIRECT 的符号位于该命令行指令之后。