LINUX.ORG.RU

Так всётаки как написать so'шку???


0

0

Читал man dlsym, но так и не получилось разобраться. Задача написать so'шку и загрузить его из основной программы. Мог бы кто нить привести простой пример самой so'шки и, к примеру, main() в котором загружается эта so'шка. Т.е. so'шка должна быть самостоятельна.

Пробовал так

cat app.c
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv)
{
void *handle;
double (*cosine)(double);
char *error;

handle = dlopen ("litest.so", RTLD_LAZY);
if (!handle)
{
fprintf (stderr, "%s\n", dlerror());
exit(1);
}

dlerror(); /* Clear any existing error */
*(void **) (&f) = dlsym(handle, "f");
if ((error = dlerror()) != NULL)
{
fprintf (stderr, "%s\n", error);
exit(1);
}

printf ("%f\n", (*f)());
dlclose(handle);
return 0;
}

cat test.c
int f ()
{
return 3;
}

собирал так

gcc -shared -nostartfiles -o libtest.so test.c

gcc app.c
app.c: In function `main':
app.c:24: error: `f' undeclared (first use in this function)
app.c:24: error: (Each undeclared identifier is reported only once
app.c:24: error: for each function it appears in.)

Заранее спасибо!!!

★★★★★

>*(void **) (&f) = dlsym(handle, "f");

неправильно определена переменная f. я обычно использую typedef:

typedef int ( *f_proc_t )( void );

f_proc_t f = dlsym( handle, "f" );

...

f();

corpus
()
Ответ на: комментарий от corpus

> typedef int ( *f_proc_t )( void );

> f_proc_t f = dlsym( handle, "f" );

>...

>f();

а можно небольшой рабочий примерчик ПЛЗ!!!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

/////////// test.h ///////////
if !defined( __TEST_H__ )
#define __TEST_H__

typedef int ( *test_proc_t )();

extern int test();

#endif // __TEST_H__

/////////// test.c ///////////
#include "test.h"

int test() {
return 0xDEADCAFE;
}

/////////// main.c ///////////
#include <stdio.h>
#include <dlfcn.h>

#include "test.h"

int main() {
void *lib;
test_proc_t test = NULL;

if( NULL == ( lib = dlopen( "./libtest.so", RTLD_LAZY ) ) ) {
fprintf( stderr, "*** dlopen failed: %s\n", dlerror() );
return -1;
}
if( NULL == ( test = dlsym( lib, "test" ) ) ) {
fprintf( stderr, "*** dlsym failed: %s\n", dlerror() );
return -2;
}
printf( "test() call: 0x%08X\n", test() );
dlclose( lib );

return 0;
}

corpus
()
Ответ на: комментарий от olegk

Всем спасибо, вроде всё понятно, кроме одного, может ли ктонить обяснить вот такую кострукцию

typedef void (*hello_t)();
hello_t hello = (hello_t) dlsym(handle, "hello");

Т.е. почему обьявляют hello_t а потом hello, зачем нужен hello_t???

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

> Всем спасибо, вроде всё понятно, кроме одного, может ли ктонить
> обяснить вот такую кострукцию
>
> typedef void (*hello_t)();
> hello_t hello = (hello_t) dlsym(handle, "hello");
>
> Т.е. почему обьявляют hello_t а потом hello, зачем нужен hello_t???

Для читабельности и красоты =)

int19h ★★★★
()
Ответ на: комментарий от cyclon

если ты пишешь на QT, почему бы не использвать QLibrary ?

anonymous
()

Помогите еще одному ламеру. SO-ку сделал и скомпилил. Начинаю подключать -компилятор ругается на функции из dlfcn. Точнее говоря ругается линкер. Заголовок находится нормально, а вот само тело функции не находит. Что нужно прописать?

Varcom
()
Ответ на: комментарий от Keiko

>вспомнить про -ldl

Не вспомнить, а узнать! Интуиция подсказал только -ldlfcn, как можно догадаться не помогло-с. Большое Вам ламерское Спасибо!

Varcom
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.