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 后面
我有一个测试程序试图在 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