Oracle 12.1 instant client működik AIX-on

Mármint úgy működik, hogy a LIBPATH-t jól beállítjuk. Ez se rossz persze, de lehet rajta hangolni. Most pl. ide jutatottam:


# dump -H -X64 /opt/lib64/libsqora.so.12.1
INDEX  PATH                          BASE                MEMBER
0      /opt/lib64:/usr/lib    
1      /usr/local/lib64              libodbcinst.so.2
2      /opt/lib64                    libclntsh.so.12
3      /opt/lib64                    libclntshcore.so.12
4      /opt/lib64                    libons.so.12
5      /usr/lib                      libc.a              shr_64.o
6      /                             unix

Azért ez nem rossz. Kivéve (most jön a banénhéj), hogy időnként dlopen-nel hivogatják egymást a komponensek, de persze verziószám nélkül:


Breakpoint 1, 0x09000000000d723c in dlopen () from /usr/lib/libc.a(shr_64.o)
1: (char *)$r3 = 0xfffffffffffd290 "libclntshcore.so"

vagyis ha eljő egy boldog nap, amikor 13-as verziót telepítek (vagy 8-ast, mert erőt vesz rajtam a nosztalgia), akkor úgy összekavarodnak, ahogy kell.

Ugyanez linuxon:


Breakpoint 1, 0x00007ffff48d9eb0 in dlopen () from /lib64/libdl.so.2
1: (char *)$rdi = 0x7fffffffb3f0 "libclntsh.so.11.1"

Kezdem úgy érezni magam, hogy csapok egy kis programocskát dlopen_for_ora12 néven, ami meghaxolja az oracle dlopen-jeit, vagyis odaragsztja a verziószámot (mondjuk a .12-t nevezem ki majornak, a .1 -et minornak). Előre a gányolás útján!

Hozzászólások

Hát igen, még sosem fordult elő, hogy az egyik alkalmazás csak a X-library egy bizonyos verziójával volt hajlandó működni, a másik meg csak az X-library másik verziójával... vagy ha igen, akkor csak álmodtam...
Persze mindez csak játék és mese pl ehhez képest: http://forum.index.hu/Article/showArticle?t=9084892

Egy Gary Hook nevű úr "Advanced linking" című könyve segített, ps formátumban lehet letölteni, abból néztem ki a -brename használatának trükkjét. Pillanatnyu állapot:


Debug: dlopen_for_ora("libclntshcore.so", 0x80004)
Debug: dlopen_for_ora("/opt/lib64/libclntsh.so", 0x80004)
Debug: dlopen_for_ora("/opt/lib64/libociei.so", 0x80004)

Szerk: később:


Debug: dlopen_for_ora("libclntshcore.so", 0x80004)
Debug2:dlopen_for_ora("/opt/lib64/libclntshcore.so.12", 0x80004)
Debug: dlopen_for_ora("/opt/lib64/libclntsh.so", 0x80004)
Debug2:dlopen_for_ora("/opt/lib64/libclntsh.so.12", 0x80004)
Debug: dlopen_for_ora("/opt/lib64/libociei.so", 0x80004)
Debug2:dlopen_for_ora("/opt/lib64/libociei.so.12", 0x80004)

On: Végül is elég jó a helyzet: elég újraindítani az Oracle10-zel szerkesztett komponenseket (PHP, for example), és már mennek is Oracle12-vel. Mármint látszólag. Azért majd meg kell tesztelni.

(Persze ebből nem akarok rendszert csinálni, az lenne az cél, hogy a programok egy része a 'libclnsth.so.10'-ra dependáljon, más része a 'libclnsth.so.12'-re, és ezek egyszerre mehessenek.

Off: Sose találjátok ki, melyik komponensben találtam közben, csak úgy mellékesen javítani valót... na jó, elárulom: a házibarkács libtool-ban;)

Nem kell 'portolni', a libtool egyrészt külön termékként is fordítható/használható AIX-on, másrészt minden egyes software magával cipel belőle egyet, azzal sincs különösebb baj...

Azért van saját libtool-om, mert abba tettem a major/minor verziószámok követését.

Nélküle ilyesmi lenne a shared libek függősége:

program1.exe -> libfoo.so -> libbar.so
program2.exe -> libfoo.so -> libbar.so

Vele:

program1.exe -> libfoo.so.14 -> libbar.so.25
program2.exe -> libfoo.so.15 -> libbar.so.26

Ez elég sokat tud számítani, amikor a libbar komponensben csinálni kell egy inkompatibilis fejlesztést, és lesz belőle libbar.so.26, akkor esetleg nem akarjuk, hogy a régi programok egy síma újraindulás után megpusztuljanak. Ez persze nem valami misztikus csodaság, hanem a default unix-os működés.