Quote:
Tool kaže:
Imam server, Centos 6.6.
Na njemu trebam upogonit program koji prilikom pokretanja javlja:
Kod:
/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found
Nakon malo istrazivanja, ispada da greska izvire iz gcc verzije, koji je na 4.4. Minimalno mora biti 4.6.
|
Nije do GCC-a, nego do libstdc++ biblioteke. /usr/lib64/libstdc++.so.6 je prestar.
Quote:
Dakle, potrebno je skinuti i buildati gcc 4.6, odvojeno na istom serveru uz 4.4.
|
Da, ali ne mora biti gcc 4.6, nego moze biti i najnovija verzija, sve dotle, dok generirani kod odnosno aplikacija nema neku regresiju, bilo u performansama, bilo u necem drugome.
Quote:
Zatim je potrebno skopirati libstdc++.so.6.0.16 iz skinutog gcc-a, i staviti ga u /usr/lib64, i promijeniti symlink da pokazuje na novu verziju (prije je bila niza).
|
NE!!! NIKADA!!! NIKADA!!!!!
GNU C i C++ biblioteke ne garantiraju apsolutno ikakvu kompatibilnost niti API, kako unaprijed a tako ni unazad. Nije ti ovo UNIX, to je GNU, kauboji i Indijanci!
Quote:
S ovim je narusen integritet OS-a, no s druge strane, program je proradio. Pa je moje pitanje: da li je moguce rijesiti ovo na drugi nacin, koji ne narusava integritet sistema? Da li je apsolutno potrebno promijeniti server?
|
Da, moguce je to rijesiti i to tako da bude 100% cisto. Ja sam to izveo na prastarom RHEL-u 5.8, gdje je compiler bio GCC 4.4, a ja sam uz pomoc njega izgradio GCC 5.3.0 (samo C i C++ u prvom prolazu), odnosno napisao sam vlastiti RPM .spec file za isti i pronasao sam tocan redosljed opcija, te korektne opcije dok to nije proradilo.
Taj sam gcc i g++ modificirao tako da je uz /usr/lib te /usr/lib64 jos i automatski trazio header datoteke te biblioteke u /opt/antr/include te /opt/antr/lib, odnosno /opt/antr/lib64.
Uz to sam jos i modificirao ta dva compilera da u svaki generirani ELF kod dodaju $ORIGIN:$ORIGIN/../lib64 RPATH slot za 64-bitni, odnosno $ORIGIN:$ORIGIN/../lib RPATH slot za 32-bitni generirani kod.
Nakon toga sam uz pomoc tog compilera ponovno izkompilirao sve njegove biblioteke (libisl, libgmp, libz i tako dalje), te njega samog, plus jos gfortran.
Zatim sam sve jos jednom rekompilirao s tim novim compilerima.
Tako sam se oslobodio sistemskog GCC-a. Nakon toga sam mogao normalno kompilirati s GCC 5.3.0 compilerom na RHEL-u 5.8. Naravno, prije izgradnje svega toga, morao sam kompilirati i pripadajuce binutils, jer one uvijek idu u tandemu s GCC compilerom. Njih sam isto modificirao za "multilib" (32- i 64-bit as te ld, te podrska za dodatne arhitekture i platforme), rekompilirao s novim compilerom, te nakon toga opet rekompilirao compilere.
Sve u svemu, binutils, pripadajuce shared object biblioteke, te same compilere sam morao kompilirati najmanje tri puta kako bi se potpuno oslobodio sistemskog compilera, sistemskih binutils te sistemskih biblioteka koje GCC treba.
Ako ti jos uvijek treba, mogu ovdje postati moje .spec datoteke za automatsku izgradnju RPM paketa.
Isto tako morat ces generirati zasebni paket za samo libc i libstdc++ - takozvani "GCC runtime" paket, da aplikacije kompilirane s tvojim compilerom ne moraju instalirati compilere samo da bi se mogle pokrenuti.
Uglavnom, bio je to pravi pravcati inzinjerski izazov, jer je GCC 4.4 prestar za kompilaciju GCC 5.3.0, te jer sam ja izricito htio da mi gcc i g++ po defaultu generiraju 32-bitni kod, cak i kada sam na 64-bitnoj platformi, kako bi se ponasali isto kao sto se ponasaju na Solarisu ili pak na Linuxima koji se vrte na RISC (citaj: PPC) platformama opcenito. Bilo je to poduze natezanje dok nisam uspio naci carobni redosljed tocno odredjenih opcija, jer GCC bootstrap na GNU/Linuxu to smatra "cross kompilacijom" ako si na 64-bitnoj platformi, dok na UNIX operativnim sustavima po defaultu generira "multilib" 32-/64-bitne compilere bez ikakvih problema ili natezanja. A ja pristup 32-bitnoj platformi nisam imao, jer su sistem inzinjeri bili nesposobni, a nisam si smio sam sloziti 32-bitni RHEL 5.8.
Cijela akcija je bila vise-manje jednaka jailbreak-u, jer je idiotsko-kretenski redhat eksplicitno kastrirao sistemski GCC compiler da moze generirati samo 64-bitni kod (jos jedan argument zasto ne koristiti redhatove izbljuvke).