Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
[C++] Угу 14.10.03 16:44 Число просмотров: 1232
Автор: 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 <имя библиотеки>
> я ее вроде как раскидал во все возможные каталоги ? >
Ну это явно лишнее :))
> А что такое "неофитская" ? по русски что то типа "новичковская" ;) только так не говорят ;)
|
<programming>
|
[C++] linux, библиотеки 20.09.03 21:30
Автор: oleaster Статус: Незарегистрированный пользователь
|
//////////////////////////////////
//////// file magic.cpp ///////////
//////////////////////////////////
#include <iostream.h>
// extern "C"
void magic () {
cout << "Hello, World ! " << endl;
}
$g++ -shared -fPIC -o libmagic.so magic.cpp
//////////////////////////////////
////////// file main.cpp /////////
//////////////////////////////////
#include <dlfcn.h>
int main () {
void * hand = dlopen ("libmagic.so",RTLD_LAZY);
void (* mag)() = (void(*)())dlsym (hand,"magic");
(*mag) ();
dlclose (hand);
return 0;
}
$g++ -o var1 main.cpp -ldl
Не получается вызвать библиотеку. Я и 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) без этого ключика теоретически скорость вызова функции из библиотеки будет выше.
|
| | |
[C++] Угу 13.10.03 22:56
Автор: oleaster Статус: Незарегистрированный пользователь
|
> Все куда проще ;) > 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 <имя библиотеки>
> я ее вроде как раскидал во все возможные каталоги ? >
Ну это явно лишнее :))
> А что такое "неофитская" ? по русски что то типа "новичковская" ;) только так не говорят ;)
|
|
|