Ezek után dpkg-val telepítettem (na jó, letöltöttem a deb-et, és kézileg bemásoltam a fájlokat) a libaio1.amd64.deb és libaio-dev.amd64.deb csomagokat; bővítettem a /etc/ld.so.conf.s/local fájlt egy új sorral, futtatam a ldconfigot...
És máris tudok 64-bites programokat linkelni Oracle-val. Na jó, nem futnak, rendben, máris nézem azt is...
20131114.1336: Adtam még egy esélyt annak az elemnek is, amit a múltkor kihagytam, mert nem tetszett a neve (libociei.so), most megy. Pontosabban mondva, nem tesztett, hogy olyan bazi nagy, meg az hogy a libclnstsh.so nem is használja. (Legalábbis nem láttam, hogy hol hiányolja.)
20131114.1620: OCI-t használó programok mennek, Pro*C-sek nem.
#0 0x00007ffff74fb621 in sqlcfx ()
from /usr/local/OraHome_Current/lib64/libclntsh.so.11.1
#1 0x00007ffff74f3584 in sqlcxt ()
from /usr/local/OraHome_Current/lib64/libclntsh.so.11.1
#2 0x00000000004031e7 in OraReconnAt (db=0x4072ec "") at oraconn.pc:228
#3 0x0000000000402cd0 in OraConnV (uid=0x406f0a "scott/tiger@test-tcp.world",
db=0x4072ec "", ap=0x7fffffffd940) at oraconn.pc:195
#4 0x000000000040281d in OraConnX (uid=0x406f0a "scott/tiger@test-tcp.world",
db=0x4072ec "") at oraconn.pc:119
#5 0x0000000000402631 in OraConn (uid=0x406f0a "scott/tiger@test-tcp.world")
at oraconn.pc:56
#6 0x00000000004014da in main (argc=1, argv=0x7fffffffde48) at seltest.pc:43
A napló kedvéért: 32-bites megy, továbbá egy AIX-os gépen ugyanaz a prg megy (32 és 64 bites is).
20131114.1825: Nyilván az új Pro*C-t kellene használnom. Kis szerencsével ettől működni kezd a 64-bites, és megszűnik működni a 32-bites.
20131114.1907: Talán kezdenek javulni a dolgok, főleg, hogy lett egy /etc/tnsnames.ora is.
További kérdés: vajon van olyan *instantclient* csomag, amiben oci.h is van?
20131114.1937: Hát az meg a *devel*rpm csomagban van benne, ez csak kézenfekvő, nem?!
20131114.2004: Akkor örömmel mondhatjuk, hogy már csak olyan apró verzió-eltérseket kell megfixálni, mint pl:
volt: extern void sqlglmt( void*, char*, size_t*, size_t* );
lett: extern void sqlglmt( void*, unsigned char*, size_t*, size_t* );.
Egy hisztisre beállított gcc-nek (-Werror) ennyi elég is ahhoz, hogy megálljon. (Ennek függvények a szebbik neve SQLErrorGetText)
20131115.0914: Ismét rászaladtam a gcc egyik kedves meglepetésére (vagyis a Pro*C szaladt rá (ez persze alátámasztja azt a korábbi gondolatomat, hogy a precompileres működés koncepcionálisan hibás):
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
A megoldás természetesen a saját stddef.h használata (és az include-sorrend átrendezése a $ORACLE_precomp/admin/pcscfg.cfg -ben)
Most már csak a LOB-oknál áll le a fordítás;)
20131115.0943: Újabb include-sort a pcscfg.cfg-be, és az is fordul!
20131115.1111: Még arra ügyeljünk, hogy a régi precompilerrel előállított forrásokat semmiképp se használjuk 64-bites fordításhoz, ugyanis változott például a 'struct sqlexd' típus (sqlstm változó):
volt:
static struct sqlexd {
unsigned int sqlvsn;
unsigned int arrsiz;
lett:
static struct sqlexd {
unsigned long sqlvsn;
unsigned int arrsiz;
20131118.1700: Már a 32-bites verzió is az instanclient-11.2-ből van, úgyhogy nézzük, mit talál ki az új Sql*Plus, hogy ne kelljen elindulnia:
Error 6 initializing SQL*Plus
SP2-0667: Message file sp1<lang>.msb not found
SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory
20111118.1722: Vaklárma volt, rossz helyre tettem az sqlplus lib*.so fájljait. Akkor most jöhet a yasql (illetve az alatta lévő DBD-Oracle-1.66) életre keltése.
20111118.1736: Neki meg build.mk kellene. Vajon honnan lesz olyanom?
20111118.1852: Asszem adok egy esélyt a teljes kliensnek. Az ugyan nem instant, de legalább lesz némi esélye, hogy egy komplett rendszer lesz egy kalap alkatrész helyett.
20131119.1016: Azt mondja a kliens, hogy:
/tmp/OraInstall2013-11-19_10-14-31AM/jdk/jre/bin/java:
symbol lookup error:
/tmp/OraInstall2013-11-19_10-14-31AM/jdk/jre/lib/amd64/libawt.so:
undefined symbol: JNU_GetEnv, version SUNWprivate_1.1
2013119.1105: Visszarettentem a full-kliens installtól, viszont rájöttem, mit kell tenni, hogy forduljon a DBD-Oracle:
cd $ORACLE_HOME
ln -s lib32/lib* .
cd /usr/local/src/DBD-Oracle-1.66
perl Makefile.PL
make
make install
cd $ORACLE_HOME
rm lib*
Vagyis attól, hogy az ORACLE_HOME-ban shared libeket lát, megbékül, és lemond a build.mk kereséséről... Persze lesz a keletkező Oracle.so-ban egy felesleges sor:
readelf -d Oracle.so | grep RPATH
Library rpath: [/local/usr/local/OraHome11
de ezt még elbírjuk valahogy... a ld.so úgyis megtalálja, amit kell, mégpedig a /etc/ld.so.conf.d/local.conf című file alapján:
# local.conf
/usr/local/OraHome_Current/lib32
/usr/local/OraHome_Current/lib64
/usr/local/lib
/usr/local/lib64
# /opt/firefox
/opt/jre32/lib/i386
/opt/jre64/lib/amd64
Off: Nem fogod elhinni, de ha a '/opt/firefox' sor nincs megjegyzésbe téve, akkor nem működik jól az rpm2cpio... ez már az emberi ésszel felfoghatón messze túl van.
- NevemTeve blogja
- A hozzászóláshoz be kell jelentkezni
- 992 megtekintés
Hozzászólások
Elsősorban egy strace.amd.deb is kell (és abból lesz egy /usr/bin/strace64), mert a 32-bites nem szól, hogy nem tudja követni a 64-bites programot, csak hülyeségeket ír ki.
Rögtön látszik, hogy puszta szívjóságból rengeteg szemetet hasznos fájlt generál a ~/oradiag_$USER könyvtárba.
Másrészt látszik, hogy libnuma.so.1 kellene neki. (Persze ez a függőség nincs benne a shared lib fejrészében, mert még a ldd/ld.so tudomást szerezne erről.)
PS: Bocs, azt nem mondtam, hogy a hiba az OciEnvCreate-ból jött, a hibakódja -1 (az kb a 'baj van')
- A hozzászóláshoz be kell jelentkezni
Illetve, más a hibakód strace-ból futtatva (65), mint önmagában. Továbba a strace jelzi hogy a timezone fájlokat próbálná megnyitni. Amik persze a régi verzióhoz tartoznak.
Már azon gondolkodom, hogy megpróbálom a nem-instant verzióval is. (Nem tesz semmit, mindössze 700 MB)
- A hozzászóláshoz be kell jelentkezni
subscribe
- A hozzászóláshoz be kell jelentkezni
Az utolsóhoz egy lehetőség (pl Makefile-ba a clean-hez):
find . -name '*.pc' | while read L; do
rm $${L%.pc}.c 2>/dev/null;
done
- A hozzászóláshoz be kell jelentkezni
A JNU_GetEnv az ugyanott elterülő libjava.so-ból kellene jöjjön. Talán.
$ nm -D libjava.so | grep JNU_GetEnv
0000000000013240 T JNU_GetEnv
Ha LD_PRELOAD-dal zsonglőrözünk egy kicsit, akkor valamivel értelmesebb hibaüzenetek kapunk:
libxcb.so.1: cannot open shared object file: No such file or directory
- A hozzászóláshoz be kell jelentkezni
Viszont a php-5.4.16 első pöccre újrafordult az új Oracle-val:
checking for Oracle Database OCI8 support... yes
checking PHP version... 5.4.16, ok
checking for long int... yes
checking size of long int... 4
checking checking if we're on a 64-bit platform... no
checking Oracle ORACLE_HOME install directory... /usr/local/OraHome_Current
checking ORACLE_HOME library validity... lib32
checking Oracle library version compatibility... 11.1
- A hozzászóláshoz be kell jelentkezni