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
调用。
我在 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
调用。