[Q]: dlopen a spol.
Ondrej Sury
ondrej na sury.cz
Neděle Duben 23 10:14:42 CEST 2000
> On Fri, 21 Apr 2000, Ondrej Sury wrote:
>
> Pouzitim flagu "--noinhibit-exec" sice lze ld presvedcit, aby vygenerovalo
> exac i s nedefinovanymi symboly, ale nebude to fungovat tak, jak byste asi
> ocekaval, protoze za takovy symbol proste dosadi nulu.
No dobre, a kdybych nahral pres dlopen() knihovnu, ktera by definovala
ony konkretni symboly, tak by se to nepreplaclo?
> To, co byste asi chtel, by (bez velkych kotrmelcu) asi fungovalo mezi
> dvema dynamickymi knihovnami nactenymi s RTLD_GLOBAL | RTLD_LAZY.
Nakonec jsem to vyresil, tak ze jsem udelal wrapper, ktery na zacatku
nacte vsechny potrebne funkce do promenych <funkce>_dl a potom se ve
<funkce> vola pres obsah teto promenne. Sice presne tomu jsem se
puvodne chtel vyhnout, ale nakonec jsem neprisel na lepsi reseni.
> > A dalsi dotaz, co znamena:
> > If the library exports a routine named _init, then that code is
> > executed before dlopen returns.
> Nicmene se obavam, ze je to ponekud zmatecne. Nejde totiz o symbol _init,
Jedna, ale je to nepouzitelne. Pokud vytvorite funkci
void _init(void); tak se pri dlopen() zavola. Problem je v tom, ze
pak se to musi kompilovat s -nostdlib, protoze glibc tento symbol obsahuje
take a pokud tvorite v pluginu nejake slozitejsi konstrukce, tak to
potom hlasi ruzne neresolvovane symboly pri dlopen();
> ale (aspon v pripade ELFu) o to, mit nejaky kod v sekci .init, resp.
> nejaky kod odtud volany (protoze cely obsah sekce se bere jako jedna
> funkce). Znam jednu funkcni variantu:
>
> static void f(void) __attribute((constructor));
> void f(void) { ... };
Diky, vyzkousim. Neni to nejaky gccismus?
--
Ondrej Sury <ondrej na sury.cz>
Další informace o konferenci Linux