C 动态链接库能否覆盖静态库?
C 动态链接库能否覆盖静态库?,c,ruby,shared-libraries,static-linking,dynamic-linking,C,Ruby,Shared Libraries,Static Linking,Dynamic Linking,nokogorigem自带了自己版本的libxml2。此外,它还涉及到libxml2。因此在需要之前加载不同版本的: 如果已编译\u解析器\u版本!=已加载\u解析器\u版本 [“Nokogiri是根据LibXML版本#{compiled#u parser_version}构建的,但动态加载了#{loaded#u parser_version}”] 它基本上是宏观和全局变量: rb_const_集(mNokogiri, rb_实习生(“LIBXML_版本”), NOKOGIRI_STR_NEW
nokogori
gem自带了自己版本的libxml2
。此外,它还涉及到libxml2。因此在需要之前加载不同版本的:
如果已编译\u解析器\u版本!=已加载\u解析器\u版本
[“Nokogiri是根据LibXML版本#{compiled#u parser_version}构建的,但动态加载了#{loaded#u parser_version}”]
它基本上是宏观和全局变量:
rb_const_集(mNokogiri,
rb_实习生(“LIBXML_版本”),
NOKOGIRI_STR_NEW2(LIBXML_dottered_版本)
);
rb_const_set(mNokogiri,
rb_实习生(“LIBXML_解析器_版本”),
NOKOGIRI_STR_NEW2(xmlParserVersion)
);
我正在亲身体验。如果在nokogiri
之前需要rmagick
(它动态链接到libxml2.so
,ldd
确认),后者会抱怨
从我所看到的nokogiri
静态链接到libxml2
。首先是(假定的)。当不需要rmagick
时,我无法在/proc/PID/maps
中看到libxml2.so
。我也看不到另一个版本的libxml2.so
ldd
没有将libxml2.so
列为nokogiri.so
的依赖项objdump
将(和朋友)列为nokogori.so
的符号(可能是静态链接的符号)
那么为什么nokogiri可以访问libxml2.So的变量呢?这是否意味着加载libxml2.so
会覆盖任何静态链接的版本?代码执行过程中会发生这种情况吗?
那么为什么nokogiri可以访问libxml2.So的变量呢
这是经过设计的(并且是由于nokogiri
的构建不正确)
UNIX共享库旨在模拟归档库。这意味着导出给定符号的第一个ELF图像将获胜(对于与-Bstatic
标志链接的库,存在一些复杂情况,但我们现在将忽略它们)
这是否意味着加载libxml2.so会覆盖任何静态链接的版本
是的,如果静态链接版本也被导出并通过PLT调用它
这能发生在代码执行的中间吗?
使用惰性符号解析(默认情况下,除了<>代码> LDyBbIdNo.或Z现在),它总是在代码执行的中间发生。
现在的问题是,如果nokogiri
链接到libxml.a
的静态副本中,它应该通过在自身内部本地化该副本而不导出其任何符号来隐藏该事实。这将避免最终用户必须处理符号冲突
您最好的选择是构建自己的nokogiri
编译并链接到同一版本的libxml,或者联系nokogiri
维护人员并要求他们修复其构建。我认为您可能混淆了静态链接。任何提到的.都意味着你在看一个动态链接的库,而不是静态链接的库。@Gemtylor我确实不确定什么是静态链接的确定标志。但一切都表明确实如此。也就是说,nokogiri.so
静态链接到libxml2
。我确信rmagick.so
是动态链接到libxml2
的。Ruby加载nokogiri.so
和rmagick.so
时需要d。但你能详细说明一下吗?什么是档案库?要正确构建,您必须添加?您知道他们决定仿效归档库的原因吗?另外,我已经提交了一份申请。如果你想纠正我的措辞或详细说明解决方案。