dlsym 子例程

用途

在使用 dlopen装入的模块中查找符号的位置。

语法

#include <dlfcn.h>
void *dlsym(Handle, Symbol);
void *Handle;
const char *Symbol;

描述

dlsym 子例程查找从先前调用 dlopen 子例程装入的模块导出的指定符号。 dlsym仅找到导出的符号。 请参阅 ld 命令以了解如何从模块导出符号。
描述
HANDLE 指定先前调用 dlopen 或其中一个特殊句柄 RTLD_DEFAULTRTLD_NEXTRTLD_我自己所返回的值。
符号 指定从引用的模块导出的符号的名称,格式为NULL-终止字符串或特殊符号名称 RTLD_ENTRY
注: 应将 C++ 符号名称以漫画格式传递到 dlsym ; dlsym 不会代表调用应用程序执行任何名称演示。

对于特殊句柄 RTLD_DEFAULTdlsym 将从装入的第一个模块开始搜索指定符号。 然后,它将继续执行初始装入模块的列表以及使用 dlopen 获取的任何全局模块的列表,直到找到匹配项为止。 此搜索遵循用于在流程中重定位所有模块的缺省模型。

对于特殊句柄 RTLD_NEXTdlsym 将在执行 dlsym 调用的模块之后装入的模块中搜索指定符号。

对于特殊句柄 RTLD_着dlsym 将在从正在进行 dlsym 调用的模块开始装入的模块中搜索指定符号。

对于特殊符号名称 RTLD_ENTRYdlsym 返回模块的入口点。 入口点 (如果存在) 是标记为入口点的模块装入程序部分符号的值。

对于 RTLD_DEFAULTRTLD_NEXTRTLD_着,如果要搜索的模块已从 dlopen 调用装入,那么 dlsym 仅在调用者是同一 dlopen 依赖关系层次结构的一部分或者该模块具有全局搜索访问权时才会搜索该模块。 有关 RTLD_GLOBAL 方式的讨论,请参阅 dlopen

对指定符号的搜索基于模块及其从属项的宽度优先顺序。 如果模块是使用 -G-brtl 链接程序选项构造的,那么模块的从属项将按原始顺序包含 ld 命令行上指定的所有模块。 未与 -G-brtl 链接程序选项链接的模块的从属项将以未指定的顺序列出。

返回值

如果找到指定的符号,那么将返回其地址。 如果找不到指定的符号,NULL并且 errno 设置为 0。 如果 HandleSymbol 无效,NULL并且 errno 设置为 EINVAL

如果找到的第一个定义是已导入符号的导出,那么此定义将满足搜索。 返回导入的符号的地址。 如果第一个定义是延迟导入,那么将忽略该定义并继续搜索。

如果指定的符号引用了BSS符号 (未初始化的数据结构) ,搜索继续进行,直到找到符号的初始化实例或已搜索模块及其所有从属项。 如果找到已初始化的实例,那么将返回其地址; 否则,将返回第一个未初始化的实例的地址。

错误代码

描述
EINVAL 如果 Handle 参数未引用仍装入的 dlopen 打开的模块,或者如果 Symbol 参数指向无效地址,那么 dlsym 子例程将返回NULL并且 errno 设置为 EINVAL