From 9d4490420c4d60ef23c05736fa9c30f6b11c0328 Mon Sep 17 00:00:00 2001 From: agibert Date: Fri, 17 Jan 2003 17:00:58 +0000 Subject: [PATCH] Add glibc-2.2.2 support Export glibc private data in libver-glibc-x.y.z.h Split ver.h into ver.h and libver.h Rework Makefile. --- lib/Makefile | 7 +- lib/libver.c | 12 ++-- lib/ver.h | 198 ++------------------------------------------------- 3 files changed, 16 insertions(+), 201 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index b33373d..0125de5 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,7 +1,10 @@ +GLIBC_RELEASE = $(shell ls /lib/libc-?.?.?.so | sed -e "s/^\/lib\/libc-.\..\.//" -e "s/\.so//") + + all: libver.a libver.so -libver.o: libver.c ver.h Makefile - gcc -c -g -o libver.o -I . libver.c +libver.o: libver.c libver.h ver.h Makefile + gcc -c -g -D__GLIBC_RELEASE__=$(GLIBC_RELEASE) -o libver.o -I . libver.c libver.a: libver.o ar -r libver.a libver.o diff --git a/lib/libver.c b/lib/libver.c index fd4425b..0f3e23f 100644 --- a/lib/libver.c +++ b/lib/libver.c @@ -6,9 +6,9 @@ #include #endif #include -#include +#include -VER_INFO_EXPORT (libver, "$Revision: 1.2 $", "$Name: $", __FILE__, "$Author: agibert $") +VER_INFO_EXPORT (libver, "$Revision: 1.3 $", "$Name: $", __FILE__, "$Author: agibert $") void VER_Error_Print (void); void * VER_Symbol_Next_Find (const char *, VERT_Object *, VERT_Index *); @@ -340,10 +340,6 @@ VERT_Status VER_Object_Print (FILE * Stream, VERT_Print_Mode Mode) - autant d'objets qui ont chargés dynamiquement par le linker (.so) */ - /* On commence par récupèrer l'objet principal */ - - Handle = dlopen (NULL, RTLD_LAZY); - #ifdef __linux /* Sous LINUX, le linker définit une variable globale bien pratique qui référence @@ -359,6 +355,10 @@ VERT_Status VER_Object_Print (FILE * Stream, VERT_Print_Mode Mode) NB : cette fonction n'existe pas sous LINUX. */ + /* On commence par récupèrer l'objet principal */ + + Handle = dlopen (NULL, RTLD_LAZY); + Object = (VERT_Object *)malloc (sizeof (VERT_Object)); dlinfo (Handle, RTLD_DI_LINKMAP, &Object); #endif diff --git a/lib/ver.h b/lib/ver.h index 31151bb..4ba5d09 100644 --- a/lib/ver.h +++ b/lib/ver.h @@ -5,196 +5,6 @@ extern "C" { #endif -#ifdef __linux -# define DT_THISPROCNUM 0 - -# include - -typedef __u_quad_t ino64_t; - -/* Some internal data structures of the dynamic linker used in the - linker map. We only provide forward declarations. */ -struct libname_list; -struct r_found_version; -struct r_search_path_elem; - -/* Forward declaration. */ -struct link_map; - -/* Structure to describe a single list of scope elements. The lookup - functions get passed an array of pointers to such structures. */ -struct r_scope_elem -{ - /* Array of maps for the scope. */ - struct link_map **r_list; - /* Number of entries in the scope. */ - unsigned int r_nlist; -}; - - -/* Structure to record search path and allocation mechanism. */ -struct r_search_path_struct - { - struct r_search_path_elem **dirs; - int malloced; - }; - -struct link_map_machine - { - /* empty by default */ - }; - -/* Structure describing a loaded shared object. The `l_next' and `l_prev' - members form a chain of all the shared objects loaded at startup. - - These data structures exist in space used by the run-time dynamic linker; - modifying them may have disastrous results. - - This data structure might change in future, if necessary. User-level - programs must avoid defining objects of this type. */ - -struct _link_map - { - /* These first few members are part of the protocol with the debugger. - This is the same format used in SVR4. */ - - ElfW(Addr) l_addr; /* Base address shared object is loaded at. */ - char *l_name; /* Absolute file name object was found in. */ - ElfW(Dyn) *l_ld; /* Dynamic section of the shared object. */ - struct link_map *l_next, *l_prev; /* Chain of loaded objects. */ - - /* All following members are internal to the dynamic linker. - They may change without notice. */ - - struct libname_list *l_libname; - /* Indexed pointers to dynamic section. - [0,DT_NUM) are indexed by the processor-independent tags. - [DT_NUM,DT_NUM+DT_THISPROCNUM) are indexed by the tag minus DT_LOPROC. - [DT_NUM+DT_THISPROCNUM,DT_NUM+DT_THISPROCNUM+DT_EXTRANUM) are indexed - by DT_EXTRATAGIDX(tagvalue) and - [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM, - DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM) - are indexed by DT_EXTRATAGIDX(tagvalue) (see ). */ - - ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM - + DT_EXTRANUM]; - const ElfW(Phdr) *l_phdr; /* Pointer to program header table in core. */ - ElfW(Addr) l_entry; /* Entry point location. */ - ElfW(Half) l_phnum; /* Number of program header entries. */ - ElfW(Half) l_ldnum; /* Number of dynamic segment entries. */ - - /* Array of DT_NEEDED dependencies and their dependencies, in - dependency order for symbol lookup (with and without - duplicates). There is no entry before the dependencies have - been loaded. */ - struct r_scope_elem l_searchlist; - - /* We need a special searchlist to process objects marked with - DT_SYMBOLIC. */ - struct r_scope_elem l_symbolic_searchlist; - - /* Dependent object that first caused this object to be loaded. */ - struct link_map *l_loader; - - /* Symbol hash table. */ - Elf_Symndx l_nbuckets; - const Elf_Symndx *l_buckets, *l_chain; - - unsigned int l_opencount; /* Reference count for dlopen/dlclose. */ - enum /* Where this object came from. */ - { - lt_executable, /* The main executable program. */ - lt_library, /* Library needed by main executable. */ - lt_loaded /* Extra run-time loaded shared object. */ - } l_type:2; - unsigned int l_relocated:1; /* Nonzero if object's relocations done. */ - unsigned int l_init_called:1; /* Nonzero if DT_INIT function called. */ - unsigned int l_global:1; /* Nonzero if object in _dl_global_scope. */ - unsigned int l_reserved:2; /* Reserved for internal use. */ - unsigned int l_phdr_allocated:1; /* Nonzero if the data structure pointed - to by `l_phdr' is allocated. */ - unsigned int l_soname_added:1; /* Nonzero if the SONAME is for sure in - the l_libname list. */ - unsigned int l_faked:1; /* Nonzero if this is a faked descriptor - without associated file. */ - - /* Array with version names. */ - unsigned int l_nversions; - struct r_found_version *l_versions; - - /* Collected information about own RPATH directories. */ - struct r_search_path_struct l_rpath_dirs; - - /* Collected results of relocation while profiling. */ - ElfW(Addr) *l_reloc_result; - - /* Pointer to the version information if available. */ - ElfW(Versym) *l_versyms; - - /* String specifying the path where this object was found. */ - const char *l_origin; - - /* Start and finish of memory map for this object. l_map_start - need not be the same as l_addr. */ - ElfW(Addr) l_map_start, l_map_end; - - /* Default array for 'l_scope'. */ - struct r_scope_elem *l_scope_mem[4]; - /* Size of array allocated for 'l_scope'. */ - size_t l_scope_max; - /* This is an array defining the lookup scope for this link map. - There are at most three different scope lists. */ - struct r_scope_elem **l_scope; - - /* A similar array, this time only with the local scope. This is - used occasionally. */ - struct r_scope_elem *l_local_scope[2]; - - /* This information is kept to check for sure whether a shared - object is the same as one already loaded. */ - dev_t l_dev; - ino64_t l_ino; - - /* Collected information about own RUNPATH directories. */ - struct r_search_path_struct l_runpath_dirs; - - /* List of object in order of the init and fini calls. */ - struct link_map **l_initfini; - - /* List of the dependencies introduced through symbol binding. */ - unsigned int l_reldepsmax; - unsigned int l_reldepsact; - struct link_map **l_reldeps; - - /* Various flag words. */ - ElfW(Word) l_feature_1; - ElfW(Word) l_flags_1; - - /* Temporarily used in `dl_close'. */ - unsigned int l_idx; - - struct link_map_machine l_mach; - - struct - { - const ElfW(Sym) *sym; - int type_class; -#ifdef DL_LOOKUP_RETURNS_MAP - struct link_map *value; -#else - ElfW(Addr) value; -#endif - const ElfW(Sym) *ret; - } l_lookup_cache; - }; - - - - -#else -# include -#endif - typedef int VERT_Info; #define VERD_VERSION 1 @@ -249,7 +59,9 @@ VERT_Info_Container * VER_Info_Export_##obj (void) \ return (Container); \ } -char VER_Error_Msg [256]; + + + /*------------------------------------------------------------------------------*/ /* Affichage des informations exportées par l'objet courant */ @@ -311,8 +123,8 @@ VERT_Status VER_Info_End (VERT_Info_Container * Container); /*------------------------------------------------------------------------------*/ -#ifdef __cplusplus +# ifdef __cplusplus } -#endif +# endif #endif