Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 动态链接库能否覆盖静态库?_C_Ruby_Shared Libraries_Static Linking_Dynamic Linking - Fatal编程技术网

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。但你能详细说明一下吗?什么是档案库?要正确构建,您必须添加?您知道他们决定仿效归档库的原因吗?另外,我已经提交了一份申请。如果你想纠正我的措辞或详细说明解决方案。