The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Модульные программы, подключение модулей в виде SO библиотеки. (share lib example module)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: share, lib, example, module,  (найти похожие документы)
Date: Wed, 24 Apr 2002 16:07:05 +0000 (UTC) From: Valentin Nechayev <netch@segfault.kiev.ua> Newsgroups: fido7.ru.unix.prog Subject: Модульные программы, подключение модулей в виде SO библиотеки. > Вот вижу сейчас многие пишут программы с поддержкой модулей > - например oops. Вот у меня и возник вопрос: как вообще такое > делается :)? Если можно на примере - желательно простом. Модуль чаще всего делается как shared object (.so) или аналогичное средство других систем (DLL в винде, etc.), с набором входных точек с заранее определенными именами или иными индексами. Загружать его надо через dlopen() или аналогично для других систем, затем спрашивать (dlsym) адреса функций и явно их вызывать. (RTLD_GLOBAL не ставить! разве что модуль одного типа у тебя всегда только один) Когда вызывать, какие отношения между модулями - определяется приложением; никаких общих рецептов дать заранее нельзя. Некоторые продукты позволяют строить цепочки и стеки из действий, выполняемых модулями... это опять же все внутренние особенности. Ну а насчет примера... 18:58:10:netch@iv:~/tmp/mod>cat hello.c #include <stdio.h> void Func( void ) { printf( "Hello world!\n" ); } 18:58:16:netch@iv:~/tmp/mod>cat bye.c #include <stdio.h> void Func( void ) { printf( "Goodbye cruel world!\n" ); } 19:03:11:netch@iv:~/tmp/mod>cat m.c #include <dlfcn.h> #include <err.h> int main( int argc, char *argv[] ) { void* libp; const char* errp; void (*funcp)(void); if( argc != 2 ) errx( 1, "usage()" ); libp = dlopen( argv[1], RTLD_NOW ); errp = dlerror(); if( !libp ) errx( 1, "dlopen(): %s", errp ); funcp = dlsym( libp, "Func" ); errp = dlerror(); if( errp ) errx( 1, "dlsym(): %s", errp ); if( !funcp ) errx( 1, "dlsym(): ?" ); (*funcp)(); dlclose( libp ); return 0; } 19:03:16:netch@iv:~/tmp/mod>gcc -o hello.so -shared -Wall hello.c 19:03:37:netch@iv:~/tmp/mod>gcc -o bye.so -shared -Wall bye.c 19:03:45:netch@iv:~/tmp/mod>gcc -o m -g -Wall m.c 19:04:03:netch@iv:~/tmp/mod>./m ./hello.so Hello world! 19:04:08:netch@iv:~/tmp/mod>./m ./bye.so Goodbye cruel world! 19:04:11:netch@iv:~/tmp/mod>./m x m: dlopen(): Shared object "x" not found 19:04:15:netch@iv:~/tmp/mod>./m hello.so m: dlopen(): Shared object "hello.so" not found /netch

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, unlocked (ok), 15:43, 16/08/2010 [ответить]  
  • +/
    А каким образом можно узнать список функций в библиотеке??
    например в libphp5.so
     
  • 2, unlocked (ok), 16:37, 16/08/2010 [ответить]  
  • +/
    nm /usr/local/libexec/apache22/libphp5.so | grep "T"
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру