дублированная динамическая загрузка: ошибка сегментации - PullRequest
0 голосов
/ 28 января 2019

Я написал библиотеку, в которой используются tesseract.dll и leptonica.dll с динамической загрузкой (LoadLibrary в Windows и dlopen в Linux).Tesseract также использует лептонику для внутреннего использования, но это подразумевает загрузку, а не динамическую загрузку.

Моя библиотека хорошо работает в Windows, но при портировании ее в Ubuntu происходит сбой, когда tesseract lib вызывает функцию leptonica.Это может быть вызвано повторяющимся символом.

Если я изменяю загрузку leptonica на неявную загрузку (добавляя -llept к LDFLAGS), ошибка сегментации, когда tesseract вызывает первую функцию leptonica (convertOnBigEnd16), исчезает.

Как я могу загрузить библиотеку с помощью dlopen, который уже загружен имплицитной загрузкой?

Я попробовал следующее.

dlopen("liblept.so", RTLD_LAZY|RTLD_NOLOAD|RTLD_GLOBAL); //(dlopen manual says ' a library that was previously loaded with RTLD_LOCAL can be reopened with RTLD_NOLOAD | RTLD_GLOBAL')
dlopen("liblept.so", RTLD_LAZY|RTLD_LOCAL);

но все испытанияошибка сегментации (все dlopen и dlsym возвращают успех и указатели на функции нормальны, но вызывают segfault)

[другие испытания]

неявная загрузка libtesseract.so + неявная загрузка liblept.so в библиотеке: работает хорошо

dlopen из libtesseract.so + dlopen из liblept.so в основном: работает хорошо

dlopen из libtesseract.so + dlopenliblept.so в lib: ошибка сегмента

Почему только последний случай вызывает ошибку сегмента?

Во время ошибки указатель на функцию leptonica не равен нулю, а отладчик сообщает

No source available for "convertOnBigEnd16() at 0x7ffff7dd4290

и дизассемблированный код не соответствует выводу objdump.

Как я могузагрузить libray с dlopen в lib после того, как он уже был загружен неявно?

...