Lesz nekem unixODBC-m! Remélem...

Eddig még nem volt szerencsém ehhez a csodasághoz, de most a felsőbb hatalmak azt mondják, hogy kell nekem egy ilyen.
Innen szedtem le a 2.3.2-t forrásban: ftp://ftp.unixodbc.org/pub/unixODBC/
Egyelőre itt állt meg a 'make all':
libodbcinst.la linkelése nem sikerül:
ld: 0711-317 ERROR: Undefined symbol: lt_libltdlc_LTX_preloaded_symbols

Ez a komponens hiányolja: libltdl/libltdlc_la-ltdl.o, annak a forrása pedig a ltld.c:

#define preloaded_symbols LT_CONC3(lt_, LTDLOPEN, _LTX_preloaded_symbols)

Hozzászólások

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.

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.

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.

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

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.

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...