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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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