Ошибка сегментации при разборе xml только с libdb2 - PullRequest
1 голос
/ 13 марта 2020

У меня есть тестовая программа, которая пытается проанализировать пример xml на SLES11, но в результате возникает ошибка сегментации. Однако, если я ссылаюсь без libdb2, то это работает нормально.

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

Добавлен -ldb2, и я получаю упомянутую ошибку сегментации, а до этого "1: ошибка синтаксического анализатора: документ empty "

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;
}

И callstack:

#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 здесь не используется, но используется в нашем программном обеспечении, откуда возникает эта проблема.

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Проблема в том, что lib xml требует libz, а вы не связываетесь с ним.

Поскольку Db2 включает zlib в свои библиотеки (см. Стековые фреймы # 1, # 2), символы разрешаются компоновщиком.

Должна быть некоторая несовместимость между zlib, которого ожидает lib xml, и версией, встроенной в Db2.

Попробуйте добавить '-lz' в строку компиляции. до '-ldb2', чтобы компоновщик сначала попытался использовать эту библиотеку.

1 голос
/ 13 марта 2020

Db2 использует zlib внутри, и эти символы (неправильно) экспортируются. Эта проблема будет решена с помощью APAR IT29520: СИМВОЛЫ ZLIB ВНУТРИ LIBDB2.SO ГЛОБАЛЬНО ВИДИМЫ, ЧТО ОНИ СОБИРАЮТСЯ С СИМВОЛАМИ ZLIB ВНУТРИ LIBZ.SO

С LD_DEBUG=all вы увидите, как символы сопоставляются / решен. Вы можете попробовать предложение @ memmertoIBM или поместить libdb2 за zlib в LD_LIBRARY_PTH

...