Я написал библиотеку, в которой используются 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
+ dlopen
liblept.so
в lib: ошибка сегмента
Почему только последний случай вызывает ошибку сегмента?
Во время ошибки указатель на функцию leptonica не равен нулю, а отладчик сообщает
No source available for "convertOnBigEnd16() at 0x7ffff7dd4290
и дизассемблированный код не соответствует выводу objdump
.
Как я могузагрузить libray с dlopen
в lib после того, как он уже был загружен неявно?