64bit-es shared lib fordítás HPUX-PA 11.x-en [+oldva]

 ( tamsa | 2010. szeptember 23., csütörtök - 15:09 )

Kedves hozzáértők!

Leszögezem nem érteka programozáshoz, így botornak tűnő kérdéssel állok elő.

Van egy nagyon egyszerű kódom, amiből szeretnék HP-UX PA-RISC alatt shared library- fordítani, de nekem gcc-vel nem megy.

Konkrétan Oracle adatbázis alá akarok betenni egy rutint amit extproc-ként hínék.
A gcc-vel lefordított (gcc -shared -o shell.so shell.c) után "is not a valid load module: Bad magic number" (ORA-06522) hibával elszáll.
Hosszas google-zás után az a gyanum, hogy nem 64bit re fordítja...
Nem tudom ezt hogyan tehetném meg. Van még telepítve ANSI-C is.

kód:

#include 
#include 
#include 

void sh(char *);

void sh( char  *cmd )

{
int num;
num = system(cmd);
}

Kívánt file formátum:ELF-64 shared object file - PA-RISC 2.0 (LP64)

köszönettel: TamsA

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Milyen gépen? Milyen processzorral?

En eddig mindig ket lepesben csinaltam shared library-kat, eloszor -fPIC-cel leforditom a forrasokat, aztan -shared a linkelesnel: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html. Nem tudom, hogy az altalad irt egylepeses modszernel az -fPIC automatikusan odakerul-e... Azt, hogy 64-bites lesz-e a shared library, a file parancs megmondja.

0ik kerdes: szerkezd meg a hozzaszolast, az < es > jeleket csereld le &lt; e's &gt; izekre ;]

probald meg -fPIC-cel forditani, hatha az ugy jobb. legalabbis linux/gcc alatt ez szokott segiteni a "nem birja betolteni es/vagy nem birja osszelinkelni a shared object"-eket.

illetve nezz utana ennek az oracle api-nak, hatha kell valami egyeb extra, pl egy magic number (egy globalis valtozo, string, integer, barmi), aminek a jelenlete szukseges ehhez. altalaban mindig van valami definit entry point a shared object-ben (egy specialis nevu" tomb, fuggveny, stb) amin keresztul meg lehet tudni hogy mit is tud az adott shared object. tehat tobb mint random altalad elnevezett fuggvenyek halmaza kell hogy legyen. egy "sh" nevu" szimbolum az annyira altalanos, rovid, stb elnevezes (szinte me'g lokalis valtozonak is, nemhogy globalis szimbolumnak) hogy kizart hogy egy oracle ezt hasznalja external module entry point-nak.

a.

0.ikhoz doku szerint <!--break--> val kell választékot írni ...
linuxon gcc-vel tökéletesen működik ... persze az 32 bit-es

a lefordítottról azt mondja a file, hogy shell.so: PA-RISC2.0 shared library -not stripped

ebből aztán tudom ogy 64-bit sem ....

"0.ikhoz doku szerint val kell választékot írni ..."
Ez igaz, de a kodban az #include sorok erteket escapelni kell &lt; es &gt; karakterekkel, hogy latszodjon, hogy #include <stdio.h> akkor is, ha code tagek kozott van.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

modosítva ...
kívánt file formátum:ELF-64 shared object file - PA-RISC 2.0 (LP64)

megoldás cc-vel (HP ANSI C)

cc +DA2.0W +DS2.0 -DSS_64BIT_SERVER -c shell.c
d -G -b -o shell.so shell.o

persze a komoly kódot át kellett alakítani hogy egye aszutyok...
így ilyen lett:

#include 
#include 
#include 
/*
void sh(char *);
*/
void sh(cmd )
char*cmd;
{
int num;
num = system(cmd);

Már csak az a kérdés mind ezt hogyan kell gcc-vel ...?


Ha átadod a tudásod neked attól még nem lesz kevesebb belőle..

Miért ragaszkodsz a gcc-hez?

talán mert az említett c fordító fizetős, drága....
meg érdekel a megoldás ....
Lehet, hogy másik gcc-vel jó lesz .... remélem holnap kiderül mert találtam valami érdekeset.

Kb. 5 napja folyamatosan google meg doku bújás eredményeként (no meg sok fórumban a give up a vége), tettem fel itt a kérdést. Mivel részben megválaszoltam magamnak le is zárhatnám, de (még) nem teszem.
Az a helyzet iróniája, hogy miután rögzítettem akadtam véletlenül a megoldáshoz vezető útra, no meg hogy volt próba licenc a cc-re.

Szóval azt mondják, hogy GNU val minden megoldható ... ezt kutatom ;)

Idézet:
talán mert az említett c fordító fizetős, drága....

Ha már fenn van, akkor valaki kifizette, nem? Próba licenc? Javíts ki, ha tévedek, de az ANSI C codeword-ös. Ha már fenn van, akkor további licencek nem kellenek hozzá. Nem?
«update»
Gondolom nektek a B9007AABEVAL van fenn... Így értem.
«/update»

Amúgy a témához nálam jobban értő kollegám szerint a gcc kódja vacakabb mint az ANSI C-jé. Nem tudom, de én elhiszem neki.

Ave, Saabi.

Igen próba licenc....

De azóta megvan a megoldás.
Az öreg ördög gondolta volna, hogy HP-ra kiadnak még 32 bit-es gcc-t, de a mai napig így van. Tehát csak fel kellett dobni egy 64-bites hppa64-gcc-t és azzal teljesen jól működik a dolog.

-TamsA-