[Q]: dlopen a spol.

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Duben 22 16:27:38 CEST 2000


On Fri, 21 Apr 2000, Ondrej Sury wrote:

> Mam dve knihovny (pluginy), ktere maji stejne symboly, ktere se 
> pouzivaji zvenku.  (Uvnitr muzou mit dalsi interni funkce.)
> A potreboval bych je nahrat do programu tak, abych uz nemusel delat
> nic jineho nez dlopen("knihovna", param);  Asi to nepujde, protoze
> nejspis neprinutim kompilator, aby slinkoval vec s nevyresolvovanyma
> symbolama, ale za dotaz to stoji.

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.

To, co byste asi chtel, by (bez velkych kotrmelcu) asi fungovalo mezi
dvema dynamickymi knihovnami nactenymi s RTLD_GLOBAL | RTLD_LAZY.

> A dalsi dotaz, co znamena:
> If  the  library  exports a routine named _init, then that code is 
> executed  before  dlopen  returns.  Funguje to i u normalnich
> dynamickych knihoven?

Nevim, u jakych nenormalnich knihoven by to melo fungovat. :)
Nicmene se obavam, ze je to ponekud zmatecne. Nejde totiz o symbol _init,
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) { ... };

Mozna nekdo zna lepsi zpusob.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux