diff options
-rw-r--r-- | extra/Configs/Config.in | 60 | ||||
-rw-r--r-- | ldso/ldso/Makefile | 34 | ||||
-rw-r--r-- | ldso/ldso/arm/elfinterp.c | 41 | ||||
-rw-r--r-- | ldso/ldso/cris/elfinterp.c | 22 | ||||
-rw-r--r-- | ldso/ldso/dl-elf.c | 28 | ||||
-rw-r--r-- | ldso/ldso/i386/elfinterp.c | 42 | ||||
-rw-r--r-- | ldso/ldso/ldso.c | 106 | ||||
-rw-r--r-- | ldso/ldso/m68k/elfinterp.c | 40 | ||||
-rw-r--r-- | ldso/ldso/mips/elfinterp.c | 6 | ||||
-rw-r--r-- | ldso/ldso/powerpc/elfinterp.c | 49 | ||||
-rw-r--r-- | ldso/ldso/readelflib1.c | 28 | ||||
-rw-r--r-- | ldso/ldso/sh/elfinterp.c | 41 | ||||
-rw-r--r-- | ldso/ldso/sparc/elfinterp.c | 50 |
13 files changed, 282 insertions, 265 deletions
diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index 1b3357ded..d2a52f055 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -33,6 +33,17 @@ config BUILD_UCLIBC_LDSO be built for your target architecture. If this option is available, to you, then you almost certainly want to answer Y. +config LDSO_LDD_SUPPORT + bool "Native shared library loader 'ldd' support" + depends on BUILD_UCLIBC_LDSO + default y + help + Enable this to enable all the code needed to support traditional ldd, + which executes the shared library loader to resolve all dependancies + and then provide a list of shared libraries that are required for an + application to function. Disabling this option will makes uClibc's + shared library loader a little bit smaller. Most people will answer Y. + config UCLIBC_HAS_THREADS bool "POSIX Threading Support" default y @@ -264,6 +275,55 @@ config DODEBUG If you are doing development and want to debug uClibc, answer Y. Otherwise, answer N. + +config SUPPORT_LD_DEBUG + bool "Build the shared library loader with debugging support" + depends on BUILD_UCLIBC_LDSO + default y + help + Answer Y here to enable all the extra code needed to debug the uClibc + native shared library loader. The level of debugging noise that is + generated depends on the LD_DEBUG environment variable... Just set + LD_DEBUG to something like: 'LD_DEBUG=token1,token2,.. prog' to + debug your application. Diagnostic messages will then be printed to + the stderr. + + For now these debugging tokens are available: + detail provide more information for some options + move display copy processings + symbols display symbol table processing + reloc display relocation processing; detail shows the relocation patch + nofixups never fixes up jump relocations + bindings displays the resolve processing (function calls); detail shows the relocation patch + all Enable everything! + + The additional environment variable: + LD_DEBUG_OUTPUT=file + redirects the diagnostics to an output file created using + the specified name and the process id as a suffix. + + An excellent start is simply: + $ LD_DEBUG=binding,move,symbols,reloc,detail ./appname + or to log everything to a file named 'logfile', try this + $ LD_DEBUG=all LD_DEBUG_OUTPUT=logfile ./appname + + If you are doing development and want to debug uClibc's shared library + loader, answer Y. Mere mortals answer N. + +config SUPPORT_LD_DEBUG_EARLY + bool "Build the shared library loader with early debugging support" + depends on BUILD_UCLIBC_LDSO + default y + help + Answer Y here to if you find the uClibc shared library loader is + crashing or otherwise not working very early on. This is typical + only when starting a new port when you havn't figured out how to + properly get the values for argc, argv, environ, etc. This method + allows a degree of visibility into the very early shared library + loader initialization process. If you are doing development and want + to debug the uClibc shared library loader early initialization, + answer Y. Mere mortals answer N. + endmenu diff --git a/ldso/ldso/Makefile b/ldso/ldso/Makefile index 3ecbe9f77..e386408ce 100644 --- a/ldso/ldso/Makefile +++ b/ldso/ldso/Makefile @@ -26,40 +26,6 @@ TOPDIR=../../ include $(TOPDIR)Rules.mak LDSO_FULLNAME=ld-uClibc-$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL).so -# Enable this to enable all the code needed to support traditional ldd -# (i.e. where the shared library loader does all the heavy lifting) -# Since this currently only saves about 300 bytes, I'm going to leave -# it enabled... -XXFLAGS+= -DLD_TRACE - -# Enable this to enable all the code needed for debugging the runtime -# linking of an application using the LD_DEBUG environment variable: -# LD_DEBUG=token1,token2,.. prog -# enables diagnostics to the stderr. -# For now there are these tokens possible: -# bindings displays the resolve processing (function calls); detail shows the relocation patch -# detail provide more information for some options -# move display copy processings -# reloc display relocation processing; detail shows the relocation patch -# symbols display symbol table processing -# -# The additional environment variable: -# LD_DEBUG_OUTPUT=file -# redirects the diagnostics to an output file created using -# the specified name and the process id as a suffix. -# -# try this -# $ LD_DEBUG=binding,move,symbols,reloc,detail LD_DEBUG_OUTPUT=appname ./appname -# -#XXFLAGS+= -DSUPPORT_LD_DEBUG - -# Enable this for the very very early debugging. Really only useful -# for people porting to new architectures. -#XXFLAGS+= -DLD_DEBUG - -# Enable this to never actually fixup symbols... -#XXFLAGS+= -DLD_NEVER_FIXUP_SYMBOLS - XXFLAGS+=-DUCLIBC_TARGET_PREFIX=\"$(TARGET_PREFIX)\" \ -DUCLIBC_DEVEL_PREFIX=\"$(DEVEL_PREFIX)\" \ -DUCLIBC_BUILD_DIR=\"$(shell cd $(TOPDIR) && pwd)\" diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c index 84b94550b..e46ae51a4 100644 --- a/ldso/ldso/arm/elfinterp.c +++ b/ldso/ldso/arm/elfinterp.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) static const char *_dl_reltypes_tab[] = [0] "R_ARM_NONE", "R_ARM_PC24", "R_ARM_ABS32", "R_ARM_REL32", [4] "R_ARM_PC13", "R_ARM_ABS16", "R_ARM_ABS12", "R_ARM_THM_ABS5", @@ -153,22 +153,19 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) _dl_progname, strtab + symtab[symtab_index].st_name); _dl_exit(1); }; -#if defined (SUPPORT_LD_DEBUG) || defined (LD_NEVER_FIXUP_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) if ((unsigned long) got_addr < 0x40000000) { -#ifndef SUPPORT_LD_DEBUG - if (_dl_debug_bindings) - { - _dl_dprintf(_dl_debug_file, "\nresolve function: %s", - strtab + symtab[symtab_index].st_name); - if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); - } -#endif -#ifndef LD_NEVER_FIXUP_SYMBOLS - *got_addr = new_addr; -#endif - } else { - *got_addr = new_addr; + if (_dl_debug_bindings) + { + _dl_dprintf(_dl_debug_file, "\nresolve function: %s", + strtab + symtab[symtab_index].st_name); + if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, + "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); + } + } + if (!_dl_debug_nofixups) { + *got_addr = new_addr; } #else *got_addr = new_addr; @@ -210,7 +207,7 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, _dl_symbol(strtab + symtab[symtab_index].st_name)) continue; -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) debug_sym(symtab,strtab,symtab_index); debug_reloc(symtab,strtab,rpnt); #endif @@ -227,7 +224,7 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, if (res <0) { int reloc_type = ELF32_R_TYPE(rpnt->r_info); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); #else _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); @@ -297,7 +294,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, } } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; #endif @@ -354,7 +351,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, default: return -1; /*call _dl_exit(1) */ } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -374,7 +371,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); reloc_type = ELF32_R_TYPE(rpnt->r_info); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; #endif @@ -387,7 +384,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, default: return -1; /*call _dl_exit(1) */ } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -430,7 +427,7 @@ _dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, if (!symbol_addr) goof++; } if (!goof) { -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_move) _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", strtab + symtab[symtab_index].st_name, diff --git a/ldso/ldso/cris/elfinterp.c b/ldso/ldso/cris/elfinterp.c index 9a0b42635..72e85530e 100644 --- a/ldso/ldso/cris/elfinterp.c +++ b/ldso/ldso/cris/elfinterp.c @@ -33,12 +33,8 @@ * SUCH DAMAGE. */ -#ifndef VERBOSE_DLINKER -#define VERBOSE_DLINKER -#endif - /* Support for the LD_DEBUG variable. */ -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) static const char *_dl_reltypes_tab[] = { [0] "R_CRIS_NONE", "R_CRIS_8", "R_CRIS_16", "R_CRIS_32", [4] "R_CRIS_8_PCREL", "R_CRIS_16_PCREL", "R_CRIS_32_PCREL", "R_CRIS_GNU_VTINHERIT", @@ -143,7 +139,7 @@ _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_offset) _dl_exit(1); } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if (_dl_debug_bindings) { _dl_dprintf(_dl_debug_file, "\nresolve function: %s", strtab + symtab[symtab_index].st_name); @@ -188,7 +184,7 @@ _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, unsigned long re _dl_symbol(strtab + symtab[symtab_index].st_name)) continue; -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; @@ -203,7 +199,7 @@ _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, unsigned long re default: _dl_dprintf(_dl_debug_file, "%s: Can't handle relocation type (lazy).\n", _dl_progname); -#ifdef SUPPORT_LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG__ _dl_dprintf(_dl_debug_file, "%s ", _dl_reltypes(reloc_type)); #endif if (symtab_index) @@ -211,7 +207,7 @@ _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, unsigned long re _dl_exit(1); } -#if defined(SUPPORT_LD_DEBUG) +#if defined(__SUPPORT_LD_DEBUG__) if (_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -273,7 +269,7 @@ _dl_parse_relocation_information(struct elf_resolve *tpnt, unsigned long rel_add symbol_addr += rpnt->r_addend; } -#if defined(SUPPORT_LD_DEBUG) +#if defined(__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; debug_sym(symtab,strtab,symtab_index); @@ -311,7 +307,7 @@ _dl_parse_relocation_information(struct elf_resolve *tpnt, unsigned long rel_add break; default: _dl_dprintf(_dl_debug_file, "%s: Can't handle relocation type ", _dl_progname); -#ifdef SUPPORT_LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG__ _dl_dprintf(_dl_debug_file, "%s\n", _dl_reltypes(reloc_type)); #endif if (symtab_index) { @@ -319,7 +315,7 @@ _dl_parse_relocation_information(struct elf_resolve *tpnt, unsigned long rel_add return -1; } } -#if defined(SUPPORT_LD_DEBUG) +#if defined(__SUPPORT_LD_DEBUG__) if (_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -385,7 +381,7 @@ _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, unsigne } if (!goof) { -#if defined(SUPPORT_LD_DEBUG) +#if defined(__SUPPORT_LD_DEBUG__) if (_dl_debug_move) _dl_dprintf(_dl_debug_file, "\n%s move %x bytes from %x to %x", strtab + symtab[symtab_index].st_name, diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index 199726ff3..b84476338 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -193,8 +193,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, pnt++; } -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching for library: '%s'\n", libname); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching for library: '%s'\n", libname); #endif /* If the filename has any '/', try it straight and leave it at that. For IBCS2 compatibility under linux, we substitute the string @@ -217,8 +217,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, if (pnt) { pnt += (unsigned long) tpnt->loadaddr + tpnt->dynamic_info[DT_STRTAB]; -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching RPATH: '%s'\n", pnt); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching RPATH: '%s'\n", pnt); #endif if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) { @@ -230,8 +230,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ if (_dl_library_path) { -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching _dl_library_path: '%s'\n", _dl_library_path); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching _dl_library_path: '%s'\n", _dl_library_path); #endif if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt)) != NULL) { @@ -264,8 +264,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, /* Look for libraries wherever the shared library loader * was installed */ -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching in ldso dir: %s\n", _dl_ldsopath); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching in ldso dir: %s\n", _dl_ldsopath); #endif if ((tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt)) != NULL) { @@ -275,8 +275,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, /* Lastly, search the standard list of paths for the library. This list must exactly match the list in uClibc/ldso/util/ldd.c */ -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching full lib path list\n"); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching full lib path list\n"); #endif if ((tpnt1 = search_for_named_library(libname, secure, UCLIBC_TARGET_PREFIX "/usr/lib:" @@ -296,8 +296,8 @@ goof: _dl_error_number = _dl_internal_error_number; else _dl_error_number = LD_ERROR_NOFILE; -#ifdef LD_DEBUG - _dl_dprintf(2, "Bummer: could not find '%s'!\n", libname); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(2, "Bummer: could not find '%s'!\n", libname); #endif return NULL; } @@ -643,7 +643,7 @@ int _dl_copy_fixups(struct dyn_elf *rpnt) return goof; tpnt->init_flag |= COPY_RELOCS_DONE; -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s", tpnt->libname); #endif @@ -656,7 +656,7 @@ int _dl_copy_fixups(struct dyn_elf *rpnt) tpnt->dynamic_info[DT_RELSZ], 0); #endif -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s; finished\n\n", tpnt->libname); #endif return goof; diff --git a/ldso/ldso/i386/elfinterp.c b/ldso/ldso/i386/elfinterp.c index 2d08bf406..4ee2be82f 100644 --- a/ldso/ldso/i386/elfinterp.c +++ b/ldso/ldso/i386/elfinterp.c @@ -29,7 +29,7 @@ * SUCH DAMAGE. */ -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) static const char *_dl_reltypes_tab[] = { [0] "R_386_NONE", "R_386_32", "R_386_PC32", "R_386_GOT32", @@ -147,22 +147,20 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) _dl_progname, strtab + symtab[symtab_index].st_name); _dl_exit(1); }; -#if defined (SUPPORT_LD_DEBUG) || defined (LD_NEVER_FIXUP_SYMBOLS) + +#if defined (__SUPPORT_LD_DEBUG__) if ((unsigned long) got_addr < 0x40000000) { -#ifndef SUPPORT_LD_DEBUG - if (_dl_debug_bindings) - { - _dl_dprintf(_dl_debug_file, "\nresolve function: %s", - strtab + symtab[symtab_index].st_name); - if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); - } -#endif -#ifndef LD_NEVER_FIXUP_SYMBOLS - *got_addr = new_addr; -#endif - } else { - *got_addr = new_addr; + if (_dl_debug_bindings) + { + _dl_dprintf(_dl_debug_file, "\nresolve function: %s", + strtab + symtab[symtab_index].st_name); + if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, + "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); + } + } + if (!_dl_debug_nofixups) { + *got_addr = new_addr; } #else *got_addr = new_addr; @@ -204,7 +202,7 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, _dl_symbol(strtab + symtab[symtab_index].st_name)) continue; -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) debug_sym(symtab,strtab,symtab_index); debug_reloc(symtab,strtab,rpnt); #endif @@ -221,7 +219,7 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, if (res <0) { int reloc_type = ELF32_R_TYPE(rpnt->r_info); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); #else _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); @@ -267,7 +265,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, } } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; #endif @@ -301,7 +299,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, default: return -1; /*call _dl_exit(1) */ } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -321,7 +319,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); reloc_type = ELF32_R_TYPE(rpnt->r_info); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; #endif @@ -335,7 +333,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, default: return -1; /*call _dl_exit(1) */ } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -378,7 +376,7 @@ _dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, if (!symbol_addr) goof++; } if (!goof) { -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_move) _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", strtab + symtab[symtab_index].st_name, diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 4c61be223..3dd5d19c9 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -108,12 +108,6 @@ * housekeeping chores and we can transfer control to the user's * application. */ -#ifdef LD_DEBUG_SYMBOLS -#ifdef SUPPORT_LD_DEBUG -#undef SUPPORT_LD_DEBUG -#endif -#define SUPPORT_LD_DEBUG -#endif #include "ld_syscall.h" #include "linuxelf.h" @@ -140,12 +134,13 @@ char *_dl_library_path = 0; /* Where we look for libraries */ char *_dl_preload = 0; /* Things to be loaded before the libs. */ char *_dl_ldsopath = 0; static char *_dl_not_lazy = 0; -#ifdef SUPPORT_LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG__ static char *_dl_debug = 0; static char *_dl_debug_symbols = 0; static char *_dl_debug_move = 0; static char *_dl_debug_reloc = 0; static char *_dl_debug_detail = 0; +static char *_dl_debug_nofixups = 0; static char *_dl_debug_bindings = 0; static int _dl_debug_file = 2; #else @@ -181,7 +176,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a auxvt[0...N] Auxiliary Vector Table elements (mixed types) */ -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ /* Debugging is especially tricky on PowerPC, since string literals * require relocations. Thus, you can't use _dl_dprintf() for * anything until the bootstrap relocations are finished. */ @@ -281,7 +276,7 @@ LD_BOOT(unsigned long args) SEND_STDERR("Invalid ELF header\n"); _dl_exit(0); } -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ SEND_STDERR("ELF header="); SEND_ADDRESS_STDERR(load_addr, 1); #endif @@ -322,7 +317,7 @@ LD_BOOT(unsigned long args) Elf32_Shdr *shdr; Elf32_Phdr *pt_load; -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ SEND_STDERR("Finding the GOT using C code to read the ELF file\n"); #endif /* Find where the dynamic linking information section is hiding */ @@ -367,7 +362,7 @@ LD_BOOT(unsigned long args) /* Now, finally, fix up the location of the dynamic stuff */ dpnt = (Elf32_Dyn *) (*got + load_addr); -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ SEND_STDERR("First Dynamic section entry="); SEND_ADDRESS_STDERR(dpnt, 1); #endif @@ -511,7 +506,7 @@ LD_BOOT(unsigned long args) /* OK, now do the relocations. We do not do a lazy binding here, so that once we are done, we have considerably more flexibility. */ -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ SEND_STDERR("About to do library loader relocations.\n"); #endif @@ -569,7 +564,7 @@ LD_BOOT(unsigned long args) SEND_STDERR(" undefined.\n"); goof++; } -#ifdef LD_DEBUG_SYMBOLS +#ifdef __SUPPORT_LD_DEBUG_EARLY__ SEND_STDERR("About to fixup symbol: "); SEND_STDERR(strtab + symtab[symtab_index].st_name); SEND_STDERR("\n"); @@ -585,7 +580,7 @@ LD_BOOT(unsigned long args) if (goof) { _dl_exit(14); } -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ /* Wahoo!!! */ _dl_dprintf(_dl_debug_file, "Done relocating library loader, so we can now\n\tuse globals and make function calls!\n"); #endif @@ -622,16 +617,13 @@ LD_BOOT(unsigned long args) * Transfer control to the application. */ status = 0; /* Used on x86, but not on other arches */ -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "Calling application main()\n"); -#endif -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\ntransfering control: %s\n\n", _dl_progname); #endif START(); } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) static void debug_fini (int status, void *arg) { (void)status; @@ -651,7 +643,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a struct elf_resolve *tpnt1; unsigned long brk_addr, *lpnt; int (*_dl_atexit) (void *); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) int (*_dl_on_exit) (void (*FUNCTION)(int STATUS, void *ARG),void*); #endif @@ -668,7 +660,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a tpnt->loadaddr = (char *) load_addr; INIT_GOT(lpnt, tpnt); -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "GOT found at %x\n", lpnt); #endif /* OK, this was a big step, now we need to scan all of the user images @@ -768,7 +760,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a if (readsize > 0 && readsize < (int)(sizeof(buf)-1)) { pnt1 = _dl_strrchr(buf, '/'); if (pnt1 && buf != pnt1) { -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "changing tpnt->libname from '%s' to '%s'\n", tpnt->libname, buf); #endif tpnt->libname = _dl_strdup(buf); @@ -785,7 +777,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a } else { _dl_ldsopath = tpnt->libname; } -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Lib Loader:\t(%x) %s\n", tpnt->loadaddr, tpnt->libname); #endif } @@ -814,19 +806,20 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a } } -#ifdef SUPPORT_LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG__ _dl_debug = _dl_getenv("LD_DEBUG", envp); if (_dl_debug) { if (_dl_strstr(_dl_debug, "all")) { _dl_debug_detail = _dl_debug_move = _dl_debug_symbols - = _dl_debug_reloc = _dl_debug_bindings = _dl_strstr(_dl_debug, "all"); + = _dl_debug_reloc = _dl_debug_bindings = _dl_debug_nofixups = _dl_strstr(_dl_debug, "all"); } else { _dl_debug_detail = _dl_strstr(_dl_debug, "detail"); _dl_debug_move = _dl_strstr(_dl_debug, "move"); _dl_debug_symbols = _dl_strstr(_dl_debug, "sym"); _dl_debug_reloc = _dl_strstr(_dl_debug, "reloc"); + _dl_debug_nofixups = _dl_strstr(_dl_debug, "nofix"); _dl_debug_bindings = _dl_strstr(_dl_debug, "bind"); } } @@ -866,8 +859,8 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a #endif - _dl_trace_loaded_objects = _dl_getenv("LD_TRACE_LOADED_OBJECTS", envp); -#ifndef LD_TRACE + _dl_trace_loaded_objects = _dl_getenv("__LDSO_LDD_SUPPORT___LOADED_OBJECTS", envp); +#ifndef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects) { _dl_dprintf(_dl_debug_file, "Use the ldd provided by uClibc\n"); _dl_exit(1); @@ -901,7 +894,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a { tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str); if (!tpnt1) { -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects) _dl_dprintf(1, "\t%s => not found\n", str); else { @@ -909,14 +902,14 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a _dl_dprintf(2, "%s: can't load " "library '%s'\n", _dl_progname, str); _dl_exit(15); -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ } #endif } else { -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #endif -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects && tpnt1->usage_count==1) { /* this is a real hack to make ldd not print @@ -980,7 +973,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a tpnt1 = _dl_load_shared_library(0, &rpnt, NULL, cp2); if (!tpnt1) { -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects) _dl_dprintf(1, "\t%s => not found\n", cp2); else { @@ -988,14 +981,14 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a _dl_dprintf(2, "%s: can't load library '%s'\n", _dl_progname, cp2); _dl_exit(15); -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ } #endif } else { -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #endif -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects && tpnt1->usage_count==1) { _dl_dprintf(1, "\t%s => %s (0x%x)\n", cp2, @@ -1031,7 +1024,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a if (tpnt && _dl_strcmp(lpntstr, _dl_get_last_path_component(tpnt->libname)) == 0) { struct elf_resolve *ttmp; -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects && tpnt->usage_count==1) { _dl_dprintf(1, "\t%s => %s (0x%x)\n", lpntstr, tpnt->libname, (unsigned) tpnt->loadaddr); @@ -1056,22 +1049,21 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a } if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr))) { -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects) _dl_dprintf(1, "\t%s => not found\n", lpntstr); else { #endif - _dl_dprintf(2, "%s: can't load library '%s'\n", - _dl_progname, lpntstr); + _dl_dprintf(2, "%s: can't load library '%s'\n", _dl_progname, lpntstr); _dl_exit(16); -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ } #endif } else { -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #endif -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects && tpnt1->usage_count==1) _dl_dprintf(1, "\t%s => %s (0x%x)\n", lpntstr, tpnt1->libname, (unsigned) tpnt1->loadaddr); @@ -1086,7 +1078,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a _dl_unmap_cache(); #endif /* ldd uses uses this. I am not sure how you pick up the other flags */ -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects) { char *_dl_warn = 0; _dl_warn = _dl_getenv("LD_WARN", envp); @@ -1128,7 +1120,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a rpnt->dyn = tpnt; tpnt = NULL; } -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (_dl_trace_loaded_objects) { _dl_dprintf(1, "\t%s => %s (0x%x)\n", rpnt->dyn->libname + (_dl_strlen(_dl_ldsopath)) + 1, rpnt->dyn->libname, rpnt->dyn->loadaddr); @@ -1144,7 +1136,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a _dl_perform_mips_global_got_relocations(_dl_loaded_modules); #endif -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Beginning relocation fixups\n"); #endif /* @@ -1159,12 +1151,12 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a and we have to manually search for entries that require fixups. Solaris gets this one right, from what I understand. */ -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Beginning copy fixups\n"); #endif if (_dl_symbol_tables) goof += _dl_copy_fixups(_dl_symbol_tables); -#ifdef LD_TRACE +#ifdef __LDSO_LDD_SUPPORT__ if (goof || _dl_trace_loaded_objects) _dl_exit(0); #endif @@ -1207,7 +1199,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a } #endif _dl_atexit = (int (*)(void *)) (intptr_t) _dl_find_hash("atexit", NULL, NULL, symbolrel); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) _dl_on_exit = (int (*)(void (*)(int, void *),void*)) (intptr_t) _dl_find_hash("on_exit", NULL, NULL, symbolrel); #endif @@ -1227,10 +1219,6 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a function call. */ ((void (*)(void)) debug_addr->r_brk) (); -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "Calling init/fini for shared libraries\n"); -#endif - for (rpnt = _dl_symbol_tables; rpnt!=NULL&& rpnt->next!=NULL; rpnt=rpnt->next) ; @@ -1254,21 +1242,21 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a if (tpnt->dynamic_info[DT_INIT]) { _dl_elf_init = (int (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\ncalling init: %s\n\n", tpnt->libname); #endif (*_dl_elf_init) (); } if (_dl_atexit && tpnt->dynamic_info[DT_FINI]) { (*_dl_atexit) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug && _dl_on_exit) { (*_dl_on_exit)(debug_fini, tpnt->libname); } #endif } -#ifdef LD_DEBUG +#if defined (__SUPPORT_LD_DEBUG__) else { if (!_dl_atexit) _dl_dprintf(_dl_debug_file, "%s: The address of atexit () is 0x0.\n", tpnt->libname); @@ -1297,7 +1285,7 @@ int _dl_fixup(struct elf_resolve *tpnt) if (tpnt->next) goof += _dl_fixup(tpnt->next); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); #endif @@ -1338,7 +1326,7 @@ int _dl_fixup(struct elf_resolve *tpnt) goof += _dl_parse_relocation_information(tpnt, tpnt->dynamic_info[DT_JMPREL], tpnt->dynamic_info[DT_PLTRELSZ], 0); } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) { _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); _dl_dprintf(_dl_debug_file,"; finished\n\n"); @@ -1352,7 +1340,7 @@ void *_dl_malloc(int size) void *retval; #if 0 -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "malloc: request for %d bytes\n", size); #endif #endif @@ -1361,7 +1349,7 @@ void *_dl_malloc(int size) return (*_dl_malloc_function) (size); if (_dl_malloc_addr - _dl_mmap_zero + size > 4096) { -#ifdef LD_DEBUG +#ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "malloc: mmapping more memory\n"); #endif _dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size, diff --git a/ldso/ldso/m68k/elfinterp.c b/ldso/ldso/m68k/elfinterp.c index 5854899ec..0531b17f9 100644 --- a/ldso/ldso/m68k/elfinterp.c +++ b/ldso/ldso/m68k/elfinterp.c @@ -29,10 +29,7 @@ * SUCH DAMAGE. */ -#ifndef VERBOSE_DLINKER -#define VERBOSE_DLINKER -#endif -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) static const char *_dl_reltypes[] = { "R_68K_NONE", @@ -93,9 +90,10 @@ unsigned int _dl_linux_resolver (int dummy1, int dummy2, instr_addr = (int) this_reloc->r_offset + (int) tpnt->loadaddr; got_addr = (char **) instr_addr; -#ifdef LD_DEBUG_SYMBOLS - _dl_dprintf (2, "Resolving symbol %s\n", - strtab + symtab[symtab_index].st_name); +#ifdef __SUPPORT_LD_DEBUG__ + if (_dl_debug_symbols) { + _dl_dprintf (2, "Resolving symbol %s\n", strtab + symtab[symtab_index].st_name); + } #endif /* Get the address of the GOT entry. */ @@ -107,16 +105,24 @@ unsigned int _dl_linux_resolver (int dummy1, int dummy2, _dl_progname, strtab + symtab[symtab_index].st_name); _dl_exit (1); } -#ifdef LD_NEVER_FIXUP_SYMBOLS - if ((unsigned int) got_addr < 0x40000000) { - _dl_dprintf (2, "Calling library function: %s\n", - strtab + symtab[symtab_index].st_name); - } else { - *got_addr = new_addr; - } +#if defined (__SUPPORT_LD_DEBUG__) + if ((unsigned long) got_addr < 0x40000000) + { + if (_dl_debug_bindings) + { + _dl_dprintf(_dl_debug_file, "\nresolve function: %s", + strtab + symtab[symtab_index].st_name); + if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, + "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); + } + } + if (!_dl_debug_nofixups) { + *got_addr = new_addr; + } #else - *got_addr = new_addr; + *got_addr = new_addr; #endif + return (unsigned int) new_addr; } @@ -162,7 +168,7 @@ _dl_parse_lazy_relocation_information (struct elf_resolve *tpnt, break; default: _dl_dprintf (2, "%s: (LAZY) can't handle reloc type ", _dl_progname); -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf (2, "%s ", _dl_reltypes[reloc_type]); #endif if (symtab_index) @@ -274,7 +280,7 @@ _dl_parse_relocation_information (struct elf_resolve *tpnt, break; default: _dl_dprintf (2, "%s: can't handle reloc type ", _dl_progname); -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf (2, "%s ", _dl_reltypes[reloc_type]); #endif if (symtab_index) diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c index bac0cf584..182a79fc0 100644 --- a/ldso/ldso/mips/elfinterp.c +++ b/ldso/ldso/mips/elfinterp.c @@ -56,7 +56,7 @@ unsigned long _dl_linux_resolver(unsigned long sym_index, *(got + local_gotno + sym_index - gotsym) = value; -#ifdef LD_DEBUG +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "---RESOLVER---\n"); _dl_dprintf(2, "SYMTAB INDEX: %i\n", sym_index); _dl_dprintf(2, " GOTSYM: %i\n", gotsym); @@ -164,7 +164,7 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt) /* Relocate the global GOT entries for the object */ while(i--) { -#ifdef LD_DEBUG +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2,"BEFORE: %s=%x\n", strtab + sym->st_name, *got_entry); #endif @@ -192,7 +192,7 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt) sym->st_name, tpnt->symbol_scope, NULL, copyrel); } -#ifdef LD_DEBUG +#if defined (__SUPPORT_LD_DEBUG__) if (*got_entry == 0) _dl_dprintf(2,"ZERO: %s\n", strtab + sym->st_name); else diff --git a/ldso/ldso/powerpc/elfinterp.c b/ldso/ldso/powerpc/elfinterp.c index 4d263df2f..9a6700e01 100644 --- a/ldso/ldso/powerpc/elfinterp.c +++ b/ldso/ldso/powerpc/elfinterp.c @@ -27,10 +27,7 @@ * SUCH DAMAGE. */ -#ifndef VERBOSE_DLINKER -#define VERBOSE_DLINKER -#endif -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) static const char *_dl_reltypes[] = { "R_PPC_NONE", "R_PPC_ADDR32", "R_PPC_ADDR24", "R_PPC_ADDR16", "R_PPC_ADDR16_LO", "R_PPC_ADDR16_HI", "R_PPC_ADDR16_HA", @@ -59,10 +56,10 @@ static const char *_dl_reltypes[] = working. */ -#ifdef LD_DEBUG_SYMBOLS +#ifdef __SUPPORT_LD_DEBUG__ static void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index); static void debug_reloc(ELF_RELOC *rpnt); -#define DPRINTF(fmt,args...) _dl_dprintf(2,fmt,args) +#define DPRINTF(fmt,args...) if (_dl_debug) _dl_dprintf(2,fmt,args) #else #define debug_sym(a,b,c) #define debug_reloc(a) @@ -286,7 +283,7 @@ void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, default: _dl_dprintf(2, "%s: (LAZY) can't handle reloc type ", _dl_progname); -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); #endif if (symtab_index) @@ -434,7 +431,7 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt, break; default: _dl_dprintf(2, "%s: can't handle reloc type ", _dl_progname); -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); #endif if (symtab_index) @@ -561,29 +558,33 @@ static void fixup_jmpslot(unsigned long reloc_addr, unsigned long targ_addr) #endif -#ifdef LD_DEBUG_SYMBOLS +#ifdef __SUPPORT_LD_DEBUG__ static void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index) { - if(symtab_index){ - _dl_dprintf(2, "sym: name=%s value=%x size=%x info=%x other=%x shndx=%x\n", - strtab + symtab[symtab_index].st_name, - symtab[symtab_index].st_value, - symtab[symtab_index].st_size, - symtab[symtab_index].st_info, - symtab[symtab_index].st_other, - symtab[symtab_index].st_shndx); - }else{ - _dl_dprintf(2, "sym: null\n"); + if (_dl_debug_symbols) { + if(symtab_index){ + _dl_dprintf(2, "sym: name=%s value=%x size=%x info=%x other=%x shndx=%x\n", + strtab + symtab[symtab_index].st_name, + symtab[symtab_index].st_value, + symtab[symtab_index].st_size, + symtab[symtab_index].st_info, + symtab[symtab_index].st_other, + symtab[symtab_index].st_shndx); + }else{ + _dl_dprintf(2, "sym: null\n"); + } } } static void debug_reloc(ELF_RELOC *rpnt) { - _dl_dprintf(2, "reloc: offset=%x type=%x sym=%x addend=%x\n", - rpnt->r_offset, - ELF32_R_TYPE(rpnt->r_info), - ELF32_R_SYM(rpnt->r_info), - rpnt->r_addend); + if (_dl_debug_reloc) { + _dl_dprintf(2, "reloc: offset=%x type=%x sym=%x addend=%x\n", + rpnt->r_offset, + ELF32_R_TYPE(rpnt->r_info), + ELF32_R_SYM(rpnt->r_info), + rpnt->r_addend); + } } #endif diff --git a/ldso/ldso/readelflib1.c b/ldso/ldso/readelflib1.c index 199726ff3..b84476338 100644 --- a/ldso/ldso/readelflib1.c +++ b/ldso/ldso/readelflib1.c @@ -193,8 +193,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, pnt++; } -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching for library: '%s'\n", libname); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching for library: '%s'\n", libname); #endif /* If the filename has any '/', try it straight and leave it at that. For IBCS2 compatibility under linux, we substitute the string @@ -217,8 +217,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, if (pnt) { pnt += (unsigned long) tpnt->loadaddr + tpnt->dynamic_info[DT_STRTAB]; -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching RPATH: '%s'\n", pnt); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching RPATH: '%s'\n", pnt); #endif if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) { @@ -230,8 +230,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ if (_dl_library_path) { -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching _dl_library_path: '%s'\n", _dl_library_path); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching _dl_library_path: '%s'\n", _dl_library_path); #endif if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt)) != NULL) { @@ -264,8 +264,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, /* Look for libraries wherever the shared library loader * was installed */ -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching in ldso dir: %s\n", _dl_ldsopath); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching in ldso dir: %s\n", _dl_ldsopath); #endif if ((tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt)) != NULL) { @@ -275,8 +275,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, /* Lastly, search the standard list of paths for the library. This list must exactly match the list in uClibc/ldso/util/ldd.c */ -#ifdef LD_DEBUG - _dl_dprintf(_dl_debug_file, "searching full lib path list\n"); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "searching full lib path list\n"); #endif if ((tpnt1 = search_for_named_library(libname, secure, UCLIBC_TARGET_PREFIX "/usr/lib:" @@ -296,8 +296,8 @@ goof: _dl_error_number = _dl_internal_error_number; else _dl_error_number = LD_ERROR_NOFILE; -#ifdef LD_DEBUG - _dl_dprintf(2, "Bummer: could not find '%s'!\n", libname); +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(2, "Bummer: could not find '%s'!\n", libname); #endif return NULL; } @@ -643,7 +643,7 @@ int _dl_copy_fixups(struct dyn_elf *rpnt) return goof; tpnt->init_flag |= COPY_RELOCS_DONE; -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s", tpnt->libname); #endif @@ -656,7 +656,7 @@ int _dl_copy_fixups(struct dyn_elf *rpnt) tpnt->dynamic_info[DT_RELSZ], 0); #endif -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s; finished\n\n", tpnt->libname); #endif return goof; diff --git a/ldso/ldso/sh/elfinterp.c b/ldso/ldso/sh/elfinterp.c index 734655075..e094cc79b 100644 --- a/ldso/ldso/sh/elfinterp.c +++ b/ldso/ldso/sh/elfinterp.c @@ -28,7 +28,7 @@ * SUCH DAMAGE. */ -#if defined (SUPPORT_LD_DEBUG) || defined (LD_DEBUG_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) static const char *_dl_reltypes_tab[] = { [0] "R_SH_NONE", "R_SH_DIR32", "R_SH_REL32", "R_SH_DIR8WPN", @@ -152,22 +152,19 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) _dl_exit(1); } -#if defined (SUPPORT_LD_DEBUG) || defined (LD_NEVER_FIXUP_SYMBOLS) +#if defined (__SUPPORT_LD_DEBUG__) if ((unsigned long) got_addr < 0x20000000) { -#ifndef SUPPORT_LD_DEBUG - if (_dl_debug_bindings) - { - _dl_dprintf(_dl_debug_file, "\nresolve function: %s", - strtab + symtab[symtab_index].st_name); - if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); - } -#endif -#ifndef LD_NEVER_FIXUP_SYMBOLS - *got_addr = new_addr; -#endif - } else { - *got_addr = new_addr; + if (_dl_debug_bindings) + { + _dl_dprintf(_dl_debug_file, "\nresolve function: %s", + strtab + symtab[symtab_index].st_name); + if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, + "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); + } + } + if (!_dl_debug_nofixups) { + *got_addr = new_addr; } #else *got_addr = new_addr; @@ -210,7 +207,7 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, _dl_symbol(strtab + symtab[symtab_index].st_name)) continue; -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) debug_sym(symtab,strtab,symtab_index); debug_reloc(symtab,strtab,rpnt); #endif @@ -227,7 +224,7 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, if (res <0) { int reloc_type = ELF32_R_TYPE(rpnt->r_info); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); #else _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); @@ -277,7 +274,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; #endif @@ -302,7 +299,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, default: return -1; /*call _dl_exit(1) */ } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -326,7 +323,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); reloc_type = ELF32_R_TYPE(rpnt->r_info); -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) { unsigned long old_val = *reloc_addr; #endif @@ -339,7 +336,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, default: return -1; /*call _dl_exit(1) */ } -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_reloc && _dl_debug_detail) _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); } @@ -382,7 +379,7 @@ _dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, if (!symbol_addr) goof++; } if (!goof) { -#if defined (SUPPORT_LD_DEBUG) +#if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug_move) _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", strtab + symtab[symtab_index].st_name, diff --git a/ldso/ldso/sparc/elfinterp.c b/ldso/ldso/sparc/elfinterp.c index 60ec4b0e8..64f769485 100644 --- a/ldso/ldso/sparc/elfinterp.c +++ b/ldso/ldso/sparc/elfinterp.c @@ -28,10 +28,7 @@ * SUCH DAMAGE. */ -#ifndef VERBOSE_DLINKER -#define VERBOSE_DLINKER -#endif -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) static const char * _dl_reltypes[] = { "R_SPARC_NONE", "R_SPARC_8", "R_SPARC_16", "R_SPARC_32", "R_SPARC_DISP8", "R_SPARC_DISP16", "R_SPARC_DISP32", "R_SPARC_WDISP30", "R_SPARC_WDISP22", @@ -103,9 +100,11 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt) _dl_dprintf(2, "symtab_index %d\n", symtab_index); -#ifdef LD_DEBUG_SYMBOLS - _dl_dprintf(2, "Resolving symbol %s\n", - strtab + symtab[symtab_index].st_name); +#ifdef __SUPPORT_LD_DEBUG__ + if (_dl_debug_symbols) { + _dl_dprintf(2, "Resolving symbol %s\n", + strtab + symtab[symtab_index].st_name); + } #endif /* Get the address of the GOT entry */ @@ -116,20 +115,29 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt) _dl_progname, strtab + symtab[symtab_index].st_name); _dl_exit(31); }; -#ifdef LD_NEVER_FIXUP_SYMBOLS - if((unsigned int) got_addr < 0x40000000) { - _dl_dprintf(2, "Calling library function: %s\n", - strtab + symtab[symtab_index].st_name); - } else { - got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff)); - got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff)); - } + +#if defined (__SUPPORT_LD_DEBUG__) + if ((unsigned long) got_addr < 0x40000000) + { + if (_dl_debug_bindings) + { + _dl_dprintf(_dl_debug_file, "\nresolve function: %s", + strtab + symtab[symtab_index].st_name); + if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, + "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); + } + } + if (!_dl_debug_nofixups) { + got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff)); + got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff)); + } #else - got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff)); - got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff)); + got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff)); + got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff)); #endif - _dl_dprintf(2, "Address = %x\n",new_addr); - _dl_exit(32); + + _dl_dprintf(2, "Address = %x\n",new_addr); + _dl_exit(32); return (unsigned int) new_addr; } @@ -169,7 +177,7 @@ void _dl_parse_lazy_relocation_information(struct elf_resolve * tpnt, int rel_ad break; default: _dl_dprintf(2, "%s: (LAZY) can't handle reloc type ", _dl_progname); -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); #endif if(symtab_index) _dl_dprintf(2, "'%s'\n", @@ -272,7 +280,7 @@ int _dl_parse_relocation_information(struct elf_resolve * tpnt, int rel_addr, break; default: _dl_dprintf(2, "%s: can't handle reloc type ", _dl_progname); -#ifdef VERBOSE_DLINKER +#if defined (__SUPPORT_LD_DEBUG__) _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); #endif if (symtab_index) |