martes, febrero 15, 2005

Acceder a la tabla con las posiciones en memória donde el loader carga las librerias

El loader tiene una tabla (_rtld_global), que está definida en el archivo ldsodefs.h (/sysdeps/generic/). En ejecución lo encontramos en /lib/ld-linux.so:

readelf -s /lib/ld-linux.so.2 | grep _rtld_global
8: 00016000 1080 OBJECT GLOBAL DEFAULT 16 _rtld_global@@GLIBC_PRIVATE
24: 00015ca0 460 OBJECT GLOBAL DEFAULT 13 _rtld_global_ro@@GLIBC_PRIVATE

Para encontrar este código hemos partido de la función dl_open, definida como _dl_open (/elf/dl-open.c), hemos ido siguiendo la ejecución para ver dónde cojia la tabla con las posiciones en memória de las librerias. El recorrido ha sido:

dl-open.c: _dl_open() : errcode = _dl_catch_error (&objname, &errstring, dl_open_worker, &args);
dl-error.c: _dl_catch_error() :(*operate) (args);
dl-open.c: dl_open_worker() : GL(dl_loaded)
ldsodefs.h: # define GL(name) _rtld_global._##name