Portál AbcLinuxu, 16. července 2025 21:06


Dotaz: C a dlsym

5.11.2010 14:36 Jozef G
C a dlsym
Přečteno: 304×
Odpovědět | Admin
Mam nieco taketo:
void *lib=0;
lib=dlopen("./libeng.so.1.0.0", RTLD_LAZY);
int (*hello)() = (int(*)()) dlsym(lib, "hello");
hello();
dlclose(lib);
prekladam to: gcc -ldl -rdynamic -std=c99 -pedantic -Wall -o test ./main.c a dostanem warning: ISO C forbids conversion of object pointer to function pointer type.

Neviete prosim, ci mam zle to pretypovanie alebo to proste ISO C zakazuje?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 5.11.2010 15:15 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C a dlsym
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ten problém je složitější, mrkni sem.
5.11.2010 15:37 l4m4
Rozbalit Rozbalit vše Re: C a dlsym
C++ je paranoidní a netahal bych ho sem.

Na POSIXovém systému je void* a ukazatel na funkci konvertovatelný. Program
typedef int (*Foo)(int);
int f(int x) { return x+1; }

int
main(void)
{
    void *p = &f;
    Foo g = p;

    return 0;
}
je normálně přeložitelný (a funguje, pokud se g následně k něčemu použije).
Luboš Doležel (Doli) avatar 5.11.2010 17:46 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C a dlsym
Ehm, čtete pořádně. Tohle můžete v C++ udělat samozřejmě taky, stačí tam přidat cast. My tady řešíme to varování.
8.11.2010 09:17 l4m4
Rozbalit Rozbalit vše Re: C a dlsym
Buď na dané platformě jsou pointery na funkce a void* zaměnitelné, tj. je to POSIX či něco jiného příčetného. (Máte snad systém, kde funguje dlsym() a pointery nejsou zaměnitelné?) Potom je příčina problému s varováním v tom, že od kompilátoru požadujete nesmyslné varování, takže to nedělejte.

Nebo zaměnitelné nejsou, a pak váš problém není žáný warning, ale to že pointery nejsou zaměnitelné, a dlsym() takhle vůbec nejde použít, a nejspíš tam ani neexistuje.
5.11.2010 16:09 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: C a dlsym
Odpovědět | | Sbalit | Link | Blokovat | Admin
Viz man dlsym :-).

           /* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
              would seem more natural, but the C99 standard leaves
              casting from "void *" to a function pointer undefined.
              The assignment used below is the POSIX.1-2003 (Technical
              Corrigendum 1) workaround; see the Rationale for the
              POSIX specification of dlsym(). */

           *(void **) (&cosine) = dlsym(handle, "cos");

Takze:

int main(){
	void *lib = NULL;
	int (*hello)();
	
   	lib = dlopen("./libeng.so.1.0.0", RTLD_LAZY); 
	*(void**) (&hello) = dlsym(lib, "hello");
	hello();
	dlclose(lib);
	return 0;
}

5.11.2010 16:55 Jozef G
Rozbalit Rozbalit vše Re: C a dlsym
Da sa nejak ludsky vysvetlit *(void**) (&hello)?
mess avatar 5.11.2010 17:01 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
Rozbalit Rozbalit vše Re: C a dlsym
Z "hello" se uděla pointer (pomoci &), ten se následně castuje na void ** a nakonec se provede jeho dereference.
Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
5.11.2010 17:07 Jozef G
Rozbalit Rozbalit vše Re: C a dlsym
Cize mam funkciu, ktora vracia int. Hello je ukazatel na funkciu, ktora vracia int. &hello - vytvori ukazatel na ukazatel funkcie, ktora vracia int a ten je nasledne typecastnuty na ukazatel na ukazatel na void. Prva hviezdicka z toho spravi ukazatel na void.
Luboš Doležel (Doli) avatar 5.11.2010 17:43 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: C a dlsym
Tohle mi dřív házelo varování kvůli strict aliasing rules.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.