информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медЗа кого нас держат?Портрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach