链接程序和库指南

目标文件分层结构

如果初始目标文件是从 dlopen(3C) 获取的,并且使用 dlopen() 打开第二个目标文件,则这两个目标文件都会被指定给一个唯一的组。这种情况可以防止一个目标文件在另一个目标文件中查找符号。

在某些实现中,初始目标文件必须导出符号以便重定位第二个目标文件。通过以下两种机制之一,可以满足此要求:

如果初始目标文件是第二个目标文件的显式依赖项,则会将该初始目标文件指定给第二个目标文件所在的组。因此,初始目标文件可以为第二个目标文件的重定位提供符号。

如果许多目标文件可使用 dlopen(3C) 打开第二个目标文件,并且每个初始目标文件必须导出相同符号以满足第二个目标文件重定位的需要,则不能对第二个目标文件指定显式依赖项。在此情况下,可使用 RTLD_PARENT 标志扩充第二个目标文件的 dlopen(3C) 模式。此标志将导致第二个目标文件所在的组以显式依赖项的方式传播至初始目标文件。

这两种方法之间有一点区别。如果指定显式依赖项,则依赖项本身将成为第二个目标文件的 dlopen(3C) 依赖项树的一部分,从而可用于使用 dlsym(3C) 的符号查找。如果使用 RTLD_PARENT 获取第二个目标文件,则使用 dlsym(3C) 的符号查找不能使用初始目标文件。

如果第二个目标文件是通过 dlopen(3C) 从具有全局符号可见性的初始目标文件获取的,则 RTLD_PARENT 模式既是冗余的,也是无害的。从应用程序或应用程序的依赖项之一调用 dlopen(3C) 时,通常会发生这种情况。