Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

运行时链接编程接口

在应用程序的链接编辑期间指定的依赖项,由运行时链接程序在进程初始化过程中处理。除了此机制以外,应用程序还可在执行期间通过绑定到其他目标文件来扩展其地址空间。应用程序将有效地使用处理应用程序标准依赖项所用的相同运行时链接程序服务。

延迟目标文件绑定有以下几个优点。

  • 通过在需要目标文件时而不是在应用程序初始化期间处理目标文件,可以极大地缩短启动时间。如果在应用程序的特定运行期间不需要某目标文件提供的服务,则表示不需要该目标文件。用于提供帮助或调试信息的目标文件可能会出现此情况。

  • 根据所需的确切服务(如用于网络协议),应用程序可在若干不同目标文件间进行选择。

  • 在执行期间添加到进程地址空间的所有目标文件都可在使用后释放。

应用程序可使用下列典型方案来访问其他共享目标文件。

  • 使用 dlopen(3C) 来查找共享目标文件并将其添加到运行的应用程序的地址空间。同时查找并添加此共享目标文件的所有依赖项。

  • 重定位添加的共享目标文件及其依赖项。调用这些目标文件中的所有初始化节。

  • 应用程序使用 dlsym(3C) 来查找已添加目标文件中的符号。然后,应用程序可引用该数据或调用这些新符号定义的函数。

  • 在应用程序处理完这些目标文件后,可使用 dlclose(3C) 来释放地址空间。此时将调用要释放的目标文件中的所有终止节。

  • 可使用 dlerror(3C) 来显示由于使用运行时链接程序接口例程而导致的所有错误状态。

运行时链接程序的服务将在头文件 dlfcn.h 中进行定义,并且通过共享目标文件 libc.so.1 使该服务可用于应用程序。在以下示例中,文件 main.c 可以引用任何 dlopen(3C) 系列例程,并且应用程序 prog 可在运行时绑定到这些例程。

$ cc -o prog main.c

注 - 在以前的 Oracle Solaris OS 发行版中,共享目标文件 libdl.so.1 提供了动态链接接口。libdl.so.1 仍然可用于支持所有现有依赖项。但是,libdl.so.1 提供的动态链接接口现在可从 libc.so.1 获取。不再需要使用 -ldl 进行链接。