Не получается вызвать библиотеку. Я и gcc использовал (заточив код библиотеки под С),
и extern "C" ставил,- на запрос dlsym все равно выдается NULL , и как следствие ошибка "Segmentation fault"
Не подскажите, в чем проблема ?
С посощью чего удобнее смотреть "core" ?
[C++] Предположение21.09.03 12:41 Автор: amirul <Serge> Статус: The Elderman
> ////////////////////////////////// > //////// file magic.cpp /////////// > ////////////////////////////////// > #include <iostream.h> > > // extern "C" > void magic () { > cout << "Hello, World ! " << endl; > } При таком объявлении функция попадет в объектник как "_magic"
> $g++ -shared -fPIC -o libmagic.so magic.cpp
> #include <dlfcn.h> > > int main () { > > void * hand = dlopen ("libmagic.so",RTLD_LAZY); > void (* mag)() = (void(*)())dlsym (hand,"magic"); Возможно нужно так:
void (* mag)() = (void(*)())dlsym (hand,"_magic");
Или поковыряться в синтаксисе gcc-шного attribute - мож там есть атрибут для экспорта в либу без преобразования имени (как вариант посмотреть что делают другие, благо открытых исходников с шаровыми либами полно).
> С посощью чего удобнее смотреть "core" ? С помощью gdb вестимо. Точно не скажу, но по моему ключ -c служит для указания оного. Если ты еще исходник откомпилишь с дебажной инфой, то будет у тебя source-level отладка.
[C++] Предположение13.10.03 09:19 Автор: XR <eXtremal Research> Статус: The Elderman
> > ////////////////////////////////// > > //////// file magic.cpp /////////// > > ////////////////////////////////// > > #include <iostream.h> > > > > // extern "C" > > void magic () { > > cout << "Hello, World ! " << endl; > > } > При таком объявлении функция попадет в объектник как > "_magic" > > > $g++ -shared -fPIC -o libmagic.so magic.cpp > > > > #include <dlfcn.h> > > > > int main () { > > > > void * hand = dlopen ("libmagic.so",RTLD_LAZY); > > void (* mag)() = (void(*)())dlsym (hand,"magic"); > Возможно нужно так: > void (* mag)() = (void(*)())dlsym (hand,"_magic"); > > Или поковыряться в синтаксисе gcc-шного attribute - мож там > есть атрибут для экспорта в либу без преобразования имени > (как вариант посмотреть что делают другие, благо открытых > исходников с шаровыми либами полно). > > > С посощью чего удобнее смотреть "core" ? > С помощью gdb вестимо. Точно не скажу, но по моему ключ -c > служит для указания оного. Если ты еще исходник откомпилишь > с дебажной инфой, то будет у тебя source-level отладка.
Все куда проще ;)
ImHO ошибка типично неофитская :)
(отсутствует проверка результата вызова dlopen () )
1) раскоментируй extern "C" в коде библиотеки
2)добавь "./" перед именем библиотеки в вызывающем коде
void * hand = dlopen ("./libmagic.so",RTLD_LAZY);
Маленькая ремарка - fPIC в данном случае не нужен (для современного gcc) без этого ключика теоретически скорость вызова функции из библиотеки будет выше.
> Все куда проще ;) > ImHO ошибка типично неофитская :) > (отсутствует проверка результата вызова dlopen () ) > > 1) раскоментируй extern "C" в коде библиотеки > 2)добавь "./" перед именем библиотеки в вызывающем коде > > void * hand = dlopen ("./libmagic.so",RTLD_LAZY); > > > Маленькая ремарка - fPIC в данном случае не нужен (для > современного gcc) без этого ключика теоретически скорость > вызова функции из библиотеки будет выше.
Только странно, откуда же тогда она пыталась прочитать библиотеку,
я ее вроде как раскидал во все возможные каталоги ?
А что такое "неофитская" ?
[C++] Угу14.10.03 16:44 Автор: XR <eXtremal Research> Статус: The Elderman
> > > Все куда проще ;) > > ImHO ошибка типично неофитская :) > > (отсутствует проверка результата вызова dlopen () ) > > > > 1) раскоментируй extern "C" в коде библиотеки > > 2)добавь "./" перед именем библиотеки в вызывающем > коде > > > > void * hand = dlopen ("./libmagic.so",RTLD_LAZY); > > > > > > Маленькая ремарка - fPIC в данном случае не нужен (для > > современного gcc) без этого ключика теоретически > скорость > > вызова функции из библиотеки будет выше. > > > Только странно, откуда же тогда она пыталась прочитать > библиотеку, для большей скорости доступа к динамическим библиотекам, пути к ним кешируются.
см.
man ldconfig
для первоначального варианта кода - поиск идет в этом самом кеше.
Для того чтобы загрузчик находил библиотеку в данном случае нужно:
1а) Поместить библиотеку в один из каталогов, указанных в /etc/ld.so.config
1b) Или добавить в /etc/ld.so.config каталог с твоей библиотекой
(вариант 1a применяется в 99.9% случаев)
2) Перестроить кеш ( ldconfig )
Проверить успешность вышеприведеной операции можно следующим образом:
ldconfig -p | grep <имя библиотеки>
> я ее вроде как раскидал во все возможные каталоги ? >
Ну это явно лишнее :))
> А что такое "неофитская" ? по русски что то типа "новичковская" ;) только так не говорят ;)