информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsГде водятся OGRыВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Угу 13.10.03 22:56  Число просмотров: 1172
Автор: oleaster Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> Все куда проще ;)
> ImHO ошибка типично неофитская :)
> (отсутствует проверка результата вызова dlopen () )
>
> 1) раскоментируй extern "C" в коде библиотеки
> 2)добавь "./" перед именем библиотеки в вызывающем коде
>
> void * hand = dlopen ("./libmagic.so",RTLD_LAZY);
>
>
> Маленькая ремарка - fPIC в данном случае не нужен (для
> современного gcc) без этого ключика теоретически скорость
> вызова функции из библиотеки будет выше.


Только странно, откуда же тогда она пыталась прочитать библиотеку,
я ее вроде как раскидал во все возможные каталоги ?

А что такое "неофитская" ?
<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 <имя библиотеки>


> я ее вроде как раскидал во все возможные каталоги ?
>

Ну это явно лишнее :))

> А что такое "неофитская" ?
по русски что то типа "новичковская" ;) только так не говорят ;)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach