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
- 1136 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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');
- A hozzászóláshoz be kell jelentkezni
szerintem ez most nem játszik, mivel a dlopen a fő programban van, a hívás pedig az egyik .so-ban, de a kérdező majd pontosít. Egyébként igen, ez lenne az igazi.
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
so -t tud dlopen-el betölteni, annyi hogy a referencia pontokat létre kell hoznia.
- A hozzászóláshoz be kell jelentkezni
Nem értem, hogy ezt most mire írod...
- A hozzászóláshoz be kell jelentkezni
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. :)
- A hozzászóláshoz be kell jelentkezni
Na ezek jóknak tűnnek, holnap megnézem, köszi!
- A hozzászóláshoz be kell jelentkezni