我在读书,并试图理解符号是如何被Linux中共享库内解决。 因此,这里是什么,我面对的是一个描述。
我使用的应用程序(APP),其可加载用户创建的共享库添加新功能。 我有两个这样的库,LIB_A.so和LIB_B.so执行独立的事情,不依赖于其他工作。 他们是独立编制并基于编译参数( -fPIC
),就会显得它将使符号interposable(从我的课题研究)。 因此,多数符号将被默认出口。
现在,有一个LIB_A和LIB_B使用都被编译并与每个库静态链接的这个共同的代码。 常见的代码不使用任何命名空间或静态函数,所以我假设他们也会被导出。 无论LIB_A和LIB_B负载和工作按预期在APP。
但是,如果有共同的代码中发现了一个错误,但只有LIB_A可以重新编译,因为它需要固定的代码。 我的问题是,当LIB_A重新编译拿起在公共代码这一变化,并在应用程序获取加载时,会不会有(不具有的两个LIB_A(有bug修复)和LIB_B通用代码单独副本bug修复),每个将利用各自的副本或将两者联系和分享的两个常见的代码版本中的一个? 有我的方式来发现使用调试器也许是符号的来源是什么?
刚要出人头地的时间回答问题,我不知道是哪个命令库将被加载,我不能重新编译LIB_B拿起变化,只有LIB_A。 我没有APP的源代码就知道它是如何动态加载的库。
我知道有一个很大的编译器标志,但假设它只是-fPIC
,没有-fvisibility-hidden
, -Wl,-Bsymbolic
, -fno-semantic-interposition
标志设置。 将这些解决这个问题,如果有冲突?
我看着使用nm -D
命令,我看到一些符号是W,这是否意味着如果使用一个静态与库建立了一个之前已经存在,它会使用现有的符号?
我一直在阅读文章和搜索,但是这个事情我不知道我100%确定下来。
编辑欲了解更多信息,我在按需运行时加载这些库。 这会改变使用任何dlopen
与RTLD_LOCAL
VS RTLD_GLOBAL
? 从描述,RTLD_LOCAL似乎以防止全球加载符号,因此不会对库外部冲突或链接到其他的符号?