02-动态加载库
42.1 动态加载库
当一个可执行文件开始运行之后,动态链接器会加载程序的动态依赖列表中的所有共享库,但有些时候延迟加载库是比较有用的,如只在需要的时候再加载一个插件。动态链接器的这项功能是通过一组API来实现的。这组API通常被称为dlopen API,它源自Solaris,现在其中大部分内容都在SUSv3中进行了规定。
dlopen API使得程序能够在运行时打开一个共享库,根据名字在库中搜索一个函数,然后调用这个函数。在运行时采用这种方式加载的共享库通常被称为动态加载的库,它的创建方式与其他共享库的创建方式完全一样。
核心dlopen API由下列函数(所有这些函数都在SUSv3进行了规定)构成。
- dlopen()函数打开一个共享库,返回一个供后续调用使用的句柄。
- dlsym()函数在库中搜索一个符号(一个包含函数或变量的字符串)并返回其地址。
- dlclose()函数关闭之前由dlopen()打开的库。
- dlerror()函数返回一个错误消息字符串,在调用上述函数中的某个函数发生错误时可以使用这个函数来获取错误消息。
glibc实现还包含了一组相关的函数,其中一些将会在后面予以介绍。
要在Linux上使用dlopen API构建程序必须要指定–ldl选项以便与libdl库链接起来。