【发布时间】:2022-01-08 21:45:03
【问题描述】:
我在 Linux 上工作。当我的应用程序链接到共享库(不隐藏符号)时,该库中的所有符号都是可见的。共享库也可以在运行时使用dlopen 加载。是否可以使用dlopen 模式参数来控制符号的可见性,或者我总是必须使用dlsym 来获取所需的符号?
【问题讨论】:
标签: linux shared-libraries dynamic-linking dlopen
我在 Linux 上工作。当我的应用程序链接到共享库(不隐藏符号)时,该库中的所有符号都是可见的。共享库也可以在运行时使用dlopen 加载。是否可以使用dlopen 模式参数来控制符号的可见性,或者我总是必须使用dlsym 来获取所需的符号?
【问题讨论】:
标签: linux shared-libraries dynamic-linking dlopen
你的问题非常不清楚。
如果您dlopen 库,那么获取任何其符号的唯一方法是通过dlsym。
但是,如果您 dlopen 一个带有 RTLD_GLOBAL 的库,那么它的符号将可用于随后使用 dlsym 加载的库没有。
例如,如果libfoo.so 定义符号foo,并且如果您dlopen("libfoo.so", RTLD_GLOBAL|...); 和以后的dlopen("libbar.so", ...) 使用 foo,那将起作用 -- libbar.so 将是能够使用来自libfoo.so 的foo 而无需进行任何dlsym 调用。
【讨论】: