Két .so azonos függvényekkel

Fórumok

Sziasztok!

Van egy programom, ami használja a MyAAA.so-t, illetve betölti az XYZ.so-t (glib segítségével), amely használja a MyBBB.so-t.
Na most a MyAAA.so-ban és a MyBBB.so-ban is van egy-egy függvény, mindegyik my_ccc(). A gondom az, hogy amikor az XYZ.so a MyBBB.so egy olyan függvényét hívja (pl. x()), ami a my_ccc()-t hívná, a MyAAA.so-ban található my_ccc() hívódik meg.
A kérdés adott tehát: hogy tudom megoldani, hogy az x() hívása során a MyBBB.so-beli my_ccc() hívódjon meg? Illetve ha a programom hívja a my_ccc()-t, akkor a MyAAA.so-beli my_ccc() hívását eredményezze.
A MyAAA.so és a MyBBB.so adottak, a főprogram, illetve az XYZ.so forrásába és fordításába van beleszólásom.
Köszi,

Zoli

Hozzászólások

Egyszerű, máshogy hívod a függvényt. Más megoldás nincs, hisz az .so-nak pont az a lényege, hogy két különböző fileban ugyanolyan nevű függvényed van, de egyszerre csak az egyiket húzod be, ezáltal váltogatsz az implementációk között, miközben az API ua marad. Ebből következik, hogyha két .so-t töltesz be egyszerre ugyanolyan függvénynévvel, akkor az nem determinisztikus.

Dinamikus betöltéssel.
http://www.linuxjournal.com/article/3687

pl.:
void *hndl = dlopen("libnewshapes.so", RTLD_NOW);
if(hndl == NULL){
cerr << dlerror() << endl;
exit(-1);
}
void *mkr = dlsym(hndl, "maker");

na most az egyik libből azt a függvényt így töltöd be:
void *egyik_fv = dlsym(egyikhandle,'my_ccc');

míg a másikból:
void *masik_fv = dlsym(masikhandle,'my_ccc');

Én úgy vettem ki, hogy ő írja a programot, s a .so-k adottak.
Persze lehet, hogy rosszul értelmeztem.
Arra az esetre, ha a program adott, és az .so-kat írja ő, viszont csak az a megoldás játsizk, hogy az egyikben átnevezi a függvényt.
De akkor a programot is modósítani kell, szóval most nem tudom, hogy mi is a felállás, de én arra szavazok, hogy ő a programot írja, nem az .so-kat.

man dlopen -> itt van sok egyéb paraméter, például elsőre az RTLD_DEEPBIND tűnik szimpinek, bár nem tudom megmondani hogy egyáltalán megoldható-e amit szeretnél. Mindenesetre errefelé kezdenék el nézelődni.

Esetleg gondolkozz el a két 3rd party lib közül az egyik bináris patchelésén: egyszerűen írd át a függvénynevet egy másik azonos hosszúságú sztringre. :)