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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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
- 1419 megtekintés
Hozzászólások
Milyen gépen? Milyen processzorral?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
0ik kerdes: szerkezd meg a hozzaszolast, az < es > jeleket csereld le < e's > 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.
- A hozzászóláshoz be kell jelentkezni
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 ....
- A hozzászóláshoz be kell jelentkezni
"0.ikhoz doku szerint
val kell választékot írni ..."
Ez igaz, de a kodban az #include sorok erteket escapelni kell < es > 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.
- A hozzászóláshoz be kell jelentkezni
modosítva ...
kívánt file formátum:ELF-64 shared object file - PA-RISC 2.0 (LP64)
- A hozzászóláshoz be kell jelentkezni
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
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..
- A hozzászóláshoz be kell jelentkezni
Miért ragaszkodsz a gcc-hez?
- A hozzászóláshoz be kell jelentkezni
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 ;)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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-
- A hozzászóláshoz be kell jelentkezni