Linux 和共享库,链接与 dlopen - 符号可见性

Linux and shared libraries, linking vs dlopen - symbol visibility

我在 Linux 上工作。当我的应用程序链接到共享库(不隐藏符号)时,该库中的所有符号都是可见的。也可以使用 dlopen 在运行时加载共享库。是否可以使用 dlopen 模式参数来控制符号的可见性,或者我总是必须使用 dlsym 来获得想要的符号?

你的问题非常不清楚。

如果您 dlopen 图书馆,那么获得 任何 其符号的唯一方法是通过 dlsym.

但是,如果您 dlopen 带有 RTLD_GLOBAL 的库,则其符号可用于 随后 加载的库 而没有 使用 dlsym.

例如,如果 libfoo.so 定义符号 foo,并且如果您 dlopen("libfoo.so", RTLD_GLOBAL|...); 和以后的 dlopen("libbar.so", ...) 使用 foo,那会起作用——libbar.so 将能够使用 libfoo.so 中的 foo,而无需进行任何 dlsym 调用。