xml 处的分段错误仅使用 libdb2 进行解析

Segmentation fault at xml parsing only with libdb2

我有一个测试程序试图在 SLES11 上解析示例 xml,但结果是分段错误。 但是,如果我 link 没有 libdb2,它就可以正常工作。

g++-8.3 -o testXmlParser main.cpp -m31 -lxml2

添加了 -ldb2,我得到了提到的分段错误,在此之前是“1:解析器错误:文档为空”

g++-8.3 -o testXmlParser main.cpp -m31 -lxml2 -ldb2

我的代码:

#include <libxml/parser.h>
#include <libxml/tree.h>
#include <iostream>


int main ()
{
        xmlDoc *doc = NULL;
        xmlNode *root_element = NULL;
        std::cout << "log1" << std::endl;
        doc = xmlParseEntity("/tmp/testXML.xml");
        std::cout << "log2" << std::endl;
        root_element = xmlDocGetRootElement(doc);
        std::cout << "root element: "<<root_element->name << std::endl ;
        return 0;
}

调用堆栈:

#0  0x7b30399e in free () from /lib/libc.so.6
#1  0x7bb3bb92 in destroy () from /data/db2inst1/sqllib/lib32/libdb2.so.1
#2  0x7bb3cdf4 in gzclose () from /data/db2inst1/sqllib/lib32/libdb2.so.1
#3  0x7d1896f0 in ?? () from /usr/lib/libxml2.so.2
#4  0x7d187e80 in xmlFreeParserInputBuffer () from /usr/lib/libxml2.so.2
#5  0x7d1602f4 in xmlFreeInputStream () from /usr/lib/libxml2.so.2
#6  0x7d160336 in xmlFreeParserCtxt () from /usr/lib/libxml2.so.2
#7  0x7d17427c in xmlSAXParseEntity () from /usr/lib/libxml2.so.2
#8  0x00400c02 in main ()

你能帮我解决这个问题吗?

这是一个测试程序,这里没有使用db2,但是在我们的软件中使用了这个问题。

问题是 libxml 需要 libz 而您没有与之链接。

由于 Db2 在其库中包含 zlib(请参阅堆栈帧 #1、#2),链接器正在解析这些符号。

libxml 期望的 zlib 与嵌入到 Db2 中的版本之间肯定存在一些不兼容。

尝试在编译行的“-ldb2”之前添加“-lz”,以便链接器首先尝试使用该库。

Db2 在内部使用 zlib 并且这些符号被(错误地)导出。这将通过 APAR 解决 IT29520:LIBDB2.SO 内的 ZLIB 符号全局可见,这意味着它们与 LIBZ.SO 内的 ZLIB 符号冲突

使用 LD_DEBUG=all 你会看到符号 mapped/resolved。您可以尝试@memmertoIBM 的建议或将 libdb2 放在 LD_LIBRARY_PTH

中的 zlib 后面