[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