- NevemTeve blogja
- A hozzászóláshoz be kell jelentkezni
Hozzászólások
Kene neked egy normalis libtool :-)
--
Blog | @hron84
Üzemeltető macik
- A hozzászóláshoz be kell jelentkezni
Valószínűleg igazad van, könnyen lehet, hogy a libtoolnak valami olyan képességét/funkcióját akarja használni, amit én (még) nem emulálok.
- A hozzászóláshoz be kell jelentkezni
Megnézem egy ubuntun, on a libodbc.so.1 dependál a libltdl.so.7-re, az utóbbi a libltdl7 nevű csomagból jön
Description: A system independent dlopen wrapper for GNU libtool
This package contains the run-time libltdl library.
.
A small library that aims at hiding the various difficulties of
dlopening libraries from programmers. It is a system independent
dlopen wrapper for GNU libtool.
.
It supports the following dlopen interfaces:
* dlopen (Solaris, Linux and various BSD flavors)
* shl_load (HP-UX)
* LoadLibrary (Win16 and Win32)
* load_add_on (BeOS)
* GNU DLD (emulates dynamic linking for static libraries)
* libtool's dlpreopen
És abban van is egy lt_libltdl_LTX_preloaded_symbols nevű elem, ami már csak egy vacak 'c' betűvel különbözik attól, ami nekünk hiányzik.
- A hozzászóláshoz be kell jelentkezni
Van fordításkor egy olyan define, hogy -DLTDLOPEN=libltdlc, szinte biztos, hogy ennek is van valamilyen jelentősége.
Sőt, úgy tűnik (libltdl/Makefile alapján), hogy van libltdl és libltdlc is. Ennek bizonyára van jelentősége.
- A hozzászóláshoz be kell jelentkezni
Hát kérem, most jött el a -dlpreopen című opció implementálásának... (egész szépen kibírtam mostanáig nélküle;)
http://www.gnu.org/software/libtool/manual/libtool.html#Dlpreopening
- A hozzászóláshoz be kell jelentkezni
... vagy portolhatnad a libtool-t #troll :-)
--
Blog | @hron84
Üzemeltető macik
- A hozzászóláshoz be kell jelentkezni
Namost annak bizonyítékául, hogy a 'program ír programot' elv nem annyira papsajt, mint amennyire fénylik, nézzünk egy példát a gyári libtool-lal.
input (saját program):
/* vartest.c */
int uninit_var;
char init_var[32]= "Hello";
const char const_var[]= "Hey";
a nm kimenete:
B uninit_var
D init_var
T const_var
ahol B=bss, D=data, T=text
az ebből automágikusan generált program:
extern int const_var();
extern char init_var;
extern char uninit_var;
Vagyis a konstans adatból (const_var) függvény lett. Persze ez még nem akkora gond, de azért egy kis szépséghiba.
- A hozzászóláshoz be kell jelentkezni
linuxban jó; ott a 'nm' kimenete ilyen:
R const_var
D init_var
C uninit_var
C=Common, D=Data, R=Readonly data
- A hozzászóláshoz be kell jelentkezni
Van még egy specialitása az AIX-nek, mégpedig az exportálásánál. Mondjuk legyen két függvényünk, local_open32 és local_open64. Ekkor a következőket mutatja a nm:
T .local_open32
D local_open32
T .local_open64
D local_open64
az undefined (vagyis máshonnan feloldandó) szimbólumok is ponttal kezdődnek, ha függvényre vonatkoznak; ha változóra, akkor nincs pont előttük.
Szerk: no ez nem igaz: ha adatról van szó, akkor nincs pont, tovább akkor sincs, ha egy függvény címét használjuk. Tehát pl. láthatunk ilyet:
- U .fflush
- U .printf
- U _iob
- U uninit_var
- U vartest_fun
- U .vartest_fun
- A hozzászóláshoz be kell jelentkezni
Pillanatnyilag a következő kapkodást vélem lehetséges:
a paraméterek elemzésekor kigyűjtjük a -dlpreopen *.la elemeket (csak la legyen, további intézkedésig).
Az illető la-elemkhez megkeressük az export-fájlokat (ha nincs, megállunk -- szerencsére nemrég belefejlesztettem, hogy mindenfajta la-hoz (static, shared, mindkettő; conventional/normal) képződjön export fájl), az exportfájlokból megszerkesztünk egy forrásprogramot, valami ilyesmi:
extern char minden_amit_az_exportfajlokbol_vettunk;
extern char persze_kiveve_ha_C_ben_ervenytelen_nev;
extern char pl___i686.get_pc_thunk.bx;
extern char tipust_nem_tudunk_de_nem_is_törödünk_vele;
extern char mindenbol_extern_char_lesz;
struct {
const char *name;
void *address;
} lt_<output>_LTX_preloaded_symbols[] = {
{"<hivo>", (void *)0},
{"<hivott1>", (void *)0},
{"hivott1_export1", (void *)&hivott1_export1},
...
{"<hivottN>", (void *)0},
{"hivottN_export1", (void *)&hivottN_export1},
...
{"hivottN_exportM", (void *)&hivottN_exportM},
{(void *)0, (void *)0}
};
ezt is lefordítjuk (-fPIC opcióval), és hozzáadjuk a linkeléshez.
- A hozzászóláshoz be kell jelentkezni
Mondjuk az ember legjobb barátja a C++, azzal nem tudom, hogy mi a pálya... overload, name-mangle...
Szerk: végeztem egy próbát, az export fájlban mangled nevek vannak...
- A hozzászóláshoz be kell jelentkezni