Browse Source

Step one, begin shuffling things around a bit

Eric Andersen 21 years ago
parent
commit
2e723e150a

+ 5 - 2
ldso/include/dl-elf.h

@@ -65,11 +65,14 @@ extern void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
 extern int _dl_parse_relocation_information(struct dyn_elf *rpnt,
 extern int _dl_parse_relocation_information(struct dyn_elf *rpnt,
 	unsigned long rel_addr, unsigned long rel_size, int type);
 	unsigned long rel_addr, unsigned long rel_size, int type);
 extern struct elf_resolve * _dl_load_shared_library(int secure,
 extern struct elf_resolve * _dl_load_shared_library(int secure,
-	struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname);
+	struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname,
+	int trace_loaded_objects);
 extern struct elf_resolve * _dl_load_elf_shared_library(int secure,
 extern struct elf_resolve * _dl_load_elf_shared_library(int secure,
 	struct dyn_elf **rpnt, char *libname);
 	struct dyn_elf **rpnt, char *libname);
-extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname);
+extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname,
+	int trace_loaded_objects);
 extern int _dl_linux_resolve(void);
 extern int _dl_linux_resolve(void);
+extern int _dl_fixup(struct dyn_elf *rpnt, int flag);
 
 
 
 
 /*
 /*

+ 5 - 2
ldso/include/ld_elf.h

@@ -65,11 +65,14 @@ extern void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
 extern int _dl_parse_relocation_information(struct dyn_elf *rpnt,
 extern int _dl_parse_relocation_information(struct dyn_elf *rpnt,
 	unsigned long rel_addr, unsigned long rel_size, int type);
 	unsigned long rel_addr, unsigned long rel_size, int type);
 extern struct elf_resolve * _dl_load_shared_library(int secure,
 extern struct elf_resolve * _dl_load_shared_library(int secure,
-	struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname);
+	struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname,
+	int trace_loaded_objects);
 extern struct elf_resolve * _dl_load_elf_shared_library(int secure,
 extern struct elf_resolve * _dl_load_elf_shared_library(int secure,
 	struct dyn_elf **rpnt, char *libname);
 	struct dyn_elf **rpnt, char *libname);
-extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname);
+extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname,
+	int trace_loaded_objects);
 extern int _dl_linux_resolve(void);
 extern int _dl_linux_resolve(void);
+extern int _dl_fixup(struct dyn_elf *rpnt, int flag);
 
 
 
 
 /*
 /*

+ 46 - 0
ldso/include/ldso.h

@@ -1,3 +1,6 @@
+#ifndef _LDSO_H_
+#define _LDSO_H_
+
 #include <features.h>
 #include <features.h>
 /* Pull in compiler and arch stuff */
 /* Pull in compiler and arch stuff */
 #include <stdlib.h>
 #include <stdlib.h>
@@ -30,3 +33,46 @@
 #define __LINUX_COMPILER_H
 #define __LINUX_COMPILER_H
 #endif
 #endif
 
 
+
+/* Global variables used within the shared library loader */
+extern char *_dl_library_path;         /* Where we look for libraries */
+extern char *_dl_preload;              /* Things to be loaded before the libs */
+extern char *_dl_ldsopath;             /* Where the shared lib loader was found */
+extern const char *_dl_progname;       /* The name of the executable being run */
+extern unsigned char *_dl_malloc_addr; /* Lets _dl_malloc use the already allocated memory page */
+extern unsigned char *_dl_mmap_zero;   /* Also used by _dl_malloc */
+extern unsigned long *_dl_brkp;        /* The end of the data segment for brk and sbrk */
+extern unsigned long *_dl_envp;        /* The environment address */
+extern int _dl_secure;                 /* Are we dealing with setuid stuff? */
+
+#ifdef __SUPPORT_LD_DEBUG__
+extern char *_dl_debug;
+extern char *_dl_debug_symbols;
+extern char *_dl_debug_move;
+extern char *_dl_debug_reloc;
+extern char *_dl_debug_detail;
+extern char *_dl_debug_nofixups;
+extern char *_dl_debug_bindings;
+extern int   _dl_debug_file;
+#else
+#define _dl_debug_file 2
+#endif
+
+#ifndef NULL
+#define NULL ((void *) 0)
+#endif
+
+extern void *_dl_malloc(int size);
+extern char *_dl_getenv(const char *symbol, char **envp);
+extern void _dl_unsetenv(const char *symbol, char **envp);
+extern char *_dl_strdup(const char *string);
+extern void _dl_dprintf(int, const char *, ...);
+
+extern void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt,
+		unsigned long load_addr, unsigned long *hash_addr,
+		Elf32_auxv_t auxvt[AT_EGID + 1], char **envp, struct r_debug *debug_addr,
+		unsigned char *malloc_buffer, unsigned char *mmap_zero, char **argv);
+
+
+#endif /* _LDSO_H_ */
+

+ 1 - 1
ldso/ldso/Makefile

@@ -44,7 +44,7 @@ endif
 
 
 XXFLAGS+=$(shell $(CC) -print-search-dirs | sed -ne "s/install: *\(.*\)/-I\1include/gp")
 XXFLAGS+=$(shell $(CC) -print-search-dirs | sed -ne "s/install: *\(.*\)/-I\1include/gp")
 LDFLAGS=$(CPU_LDFLAGS-y) -shared --warn-common --export-dynamic --sort-common \
 LDFLAGS=$(CPU_LDFLAGS-y) -shared --warn-common --export-dynamic --sort-common \
-	-z combreloc --discard-locals --discard-all
+	-z combreloc --discard-locals --discard-all --no-undefined
 
 
 CSRC= ldso.c #hash.c readelflib1.c $(TARGET_ARCH)/elfinterp.c
 CSRC= ldso.c #hash.c readelflib1.c $(TARGET_ARCH)/elfinterp.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 COBJS=$(patsubst %.c,%.o, $(CSRC))

+ 5 - 4
ldso/ldso/dl-elf.c

@@ -166,7 +166,8 @@ search_for_named_library(const char *name, int secure, const char *path_list,
 }
 }
 
 
 /* Check if the named library is already loaded... */
 /* Check if the named library is already loaded... */
-struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname)
+struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname,
+		int trace_loaded_objects)
 {
 {
 	const char *pnt, *pnt1;
 	const char *pnt, *pnt1;
 	struct elf_resolve *tpnt1;
 	struct elf_resolve *tpnt1;
@@ -201,7 +202,7 @@ struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libnam
 	{
 	{
 		/* Abort attempts to load glibc, libc5, etc */
 		/* Abort attempts to load glibc, libc5, etc */
 		if ( libname[8]!='0') {
 		if ( libname[8]!='0') {
-			if (!_dl_trace_loaded_objects) {
+			if (!trace_loaded_objects) {
 				_dl_dprintf(2, aborted_wrong_lib, libname, _dl_progname);
 				_dl_dprintf(2, aborted_wrong_lib, libname, _dl_progname);
 				_dl_exit(1);
 				_dl_exit(1);
 			}
 			}
@@ -241,7 +242,7 @@ unsigned long _dl_internal_error_number;
 extern char *_dl_ldsopath;
 extern char *_dl_ldsopath;
 
 
 struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
 struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
-	struct elf_resolve *tpnt, char *full_libname)
+	struct elf_resolve *tpnt, char *full_libname, int trace_loaded_objects)
 {
 {
 	char *pnt, *pnt1;
 	char *pnt, *pnt1;
 	struct elf_resolve *tpnt1;
 	struct elf_resolve *tpnt1;
@@ -265,7 +266,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
 	/* Critical step!  Weed out duplicates early to avoid
 	/* Critical step!  Weed out duplicates early to avoid
 	 * function aliasing, which wastes memory, and causes
 	 * function aliasing, which wastes memory, and causes
 	 * really bad things to happen with weaks and globals. */
 	 * really bad things to happen with weaks and globals. */
-	if ((tpnt1=_dl_check_if_named_library_is_loaded(libname))!=NULL)
+	if ((tpnt1=_dl_check_if_named_library_is_loaded(libname, trace_loaded_objects))!=NULL)
 		return tpnt1;
 		return tpnt1;
 
 
 #if defined (__SUPPORT_LD_DEBUG__)
 #if defined (__SUPPORT_LD_DEBUG__)

+ 58 - 64
ldso/ldso/ldso.c

@@ -114,7 +114,7 @@
 #define	    ELFMAGIC	ELFMAG
 #define	    ELFMAGIC	ELFMAG
 
 
 /* This is a poor man's malloc, used prior to resolving our internal poor man's malloc */
 /* This is a poor man's malloc, used prior to resolving our internal poor man's malloc */
-#define LD_MALLOC(SIZE) ((unsigned void *) (malloc_buffer += SIZE, malloc_buffer - SIZE)) ;  REALIGN();
+#define LD_MALLOC(SIZE) ((void *) (malloc_buffer += SIZE, malloc_buffer - SIZE)) ;  REALIGN();
 /*
 /*
  * Make sure that the malloc buffer is aligned on 4 byte boundary.  For 64 bit
  * Make sure that the malloc buffer is aligned on 4 byte boundary.  For 64 bit
  * platforms we may need to increase this to 8, but this is good enough for
  * platforms we may need to increase this to 8, but this is good enough for
@@ -125,7 +125,6 @@
 char *_dl_library_path = 0;		/* Where we look for libraries */
 char *_dl_library_path = 0;		/* Where we look for libraries */
 char *_dl_preload = 0;			/* Things to be loaded before the libs. */
 char *_dl_preload = 0;			/* Things to be loaded before the libs. */
 char *_dl_ldsopath = 0;
 char *_dl_ldsopath = 0;
-static int _dl_be_lazy = RTLD_LAZY;
 #ifdef __SUPPORT_LD_DEBUG__
 #ifdef __SUPPORT_LD_DEBUG__
 char *_dl_debug  = 0;
 char *_dl_debug  = 0;
 char *_dl_debug_symbols = 0;
 char *_dl_debug_symbols = 0;
@@ -140,7 +139,7 @@ int   _dl_debug_file = 2;
 #endif
 #endif
 static unsigned char *_dl_malloc_addr, *_dl_mmap_zero;
 static unsigned char *_dl_malloc_addr, *_dl_mmap_zero;
 
 
-static char *_dl_trace_loaded_objects = 0;
+static int _dl_secure = 0;
 static int (*_dl_elf_main) (int, char **, char **);
 static int (*_dl_elf_main) (int, char **, char **);
 struct r_debug *_dl_debug_addr = NULL;
 struct r_debug *_dl_debug_addr = NULL;
 unsigned long *_dl_brkp;
 unsigned long *_dl_brkp;
@@ -148,9 +147,6 @@ unsigned long *_dl_envp;
 int _dl_fixup(struct dyn_elf *rpnt, int flag);
 int _dl_fixup(struct dyn_elf *rpnt, int flag);
 void _dl_debug_state(void);
 void _dl_debug_state(void);
 char *_dl_get_last_path_component(char *path);
 char *_dl_get_last_path_component(char *path);
-static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt, 
-		unsigned long load_addr, unsigned long *hash_addr, Elf32_auxv_t auxvt[AT_EGID + 1], 
-		char **envp, struct r_debug *debug_addr);
 
 
 #include "boot1_arch.h"
 #include "boot1_arch.h"
 #include "_dl_progname.h"				/* Pull in the value of _dl_progname */
 #include "_dl_progname.h"				/* Pull in the value of _dl_progname */
@@ -166,29 +162,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)
 		auxvt[0...N]   Auxiliary Vector Table elements (mixed types)
 */
 */
 
 
-#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. */
-static inline void hexprint(unsigned long x)
-{
-	int i;
-	char c;
-
-	for (i = 0; i < 8; i++) {
-		c = ((x >> 28) + '0');
-		if (c > '9')
-			c += 'a' - '9' - 1;
-		_dl_write(1, &c, 1);
-		x <<= 4;
-	}
-	c = '\n';
-	_dl_write(1, &c, 1);
-}
-#endif
-
 LD_BOOT(unsigned long args) __attribute__ ((unused));
 LD_BOOT(unsigned long args) __attribute__ ((unused));
-
 LD_BOOT(unsigned long args)
 LD_BOOT(unsigned long args)
 {
 {
 	unsigned int argc;
 	unsigned int argc;
@@ -645,24 +619,16 @@ LD_BOOT(unsigned long args)
 	   free to start using global variables, since these things have all been
 	   free to start using global variables, since these things have all been
 	   fixed up by now.  Still no function calls outside of this library ,
 	   fixed up by now.  Still no function calls outside of this library ,
 	   since the dynamic resolver is not yet ready. */
 	   since the dynamic resolver is not yet ready. */
-	_dl_get_ready_to_run(tpnt, app_tpnt, load_addr, hash_addr, auxvt, envp, debug_addr);
+	_dl_get_ready_to_run(tpnt, app_tpnt, load_addr, hash_addr,
-
+			auxvt, envp, debug_addr, malloc_buffer, mmap_zero, argv);
 
 
-	/* Notify the debugger that all objects are now mapped in.  */
-	_dl_debug_addr->r_state = RT_CONSISTENT;
-	_dl_debug_state();
 
 
-
+	/* Transfer control to the application.  */
-	/* OK we are done here.  Turn out the lights, and lock up. */
-	_dl_elf_main = (int (*)(int, char **, char **)) auxvt[AT_ENTRY].a_un.a_fcn;
-
-	/*
-	 * Transfer control to the application.
-	 */
 	status = 0;					/* Used on x86, but not on other arches */
 	status = 0;					/* Used on x86, but not on other arches */
 #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);	
 	if(_dl_debug) _dl_dprintf(_dl_debug_file,"\ntransfering control: %s\n\n", _dl_progname);	
 #endif    
 #endif    
+	_dl_elf_main = (int (*)(int, char **, char **)) auxvt[AT_ENTRY].a_un.a_fcn;
 	START();
 	START();
 }
 }
 
 
@@ -674,13 +640,15 @@ static void debug_fini (int status, void *arg)
 }
 }
 #endif    
 #endif    
 
 
-static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt, 
+void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt,
-		unsigned long load_addr, unsigned long *hash_addr, Elf32_auxv_t auxvt[AT_EGID + 1], 
+		unsigned long load_addr, unsigned long *hash_addr,
-		char **envp, struct r_debug *debug_addr)
+		Elf32_auxv_t auxvt[AT_EGID + 1], char **envp, struct r_debug *debug_addr,
+		unsigned char *malloc_buffer, unsigned char *mmap_zero, char **argv)
+
 {
 {
 	ElfW(Phdr) *ppnt;
 	ElfW(Phdr) *ppnt;
 	char *lpntstr;
 	char *lpntstr;
-	int i, _dl_secure, goof = 0;
+	int i, goof = 0, be_lazy = RTLD_LAZY, trace_loaded_objects = 0;
 	struct dyn_elf *rpnt;
 	struct dyn_elf *rpnt;
 	struct elf_resolve *tcurr;
 	struct elf_resolve *tcurr;
 	struct elf_resolve *tpnt1;
 	struct elf_resolve *tpnt1;
@@ -690,10 +658,30 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 	int (*_dl_on_exit) (void (*FUNCTION)(int STATUS, void *ARG),void*);
 	int (*_dl_on_exit) (void (*FUNCTION)(int STATUS, void *ARG),void*);
 #endif
 #endif
 
 
+#ifdef __SUPPORT_LD_DEBUG_EARLY__
+    /* Wahoo!!! */
+    SEND_STDERR("Cool, we managed to make a function call.\n");
+#endif
+
+	/* Make it so _dl_malloc can use the page of memory we have already
+	 * allocated.  We shouldn't need to grab any more memory.  This must
+	 * be first since things like _dl_dprintf() use _dl_malloc().... */
+	_dl_malloc_addr = malloc_buffer;
+	_dl_mmap_zero = mmap_zero;
+
 	/* Now we have done the mandatory linking of some things.  We are now
 	/* Now we have done the mandatory linking of some things.  We are now
-	   free to start using global variables, since these things have all been
+	 * free to start using global variables, since these things have all been
-	   fixed up by now.  Still no function calls outside of this library ,
+	 * fixed up by now.  Still no function calls outside of this library ,
-	   since the dynamic resolver is not yet ready. */
+	 * since the dynamic resolver is not yet ready. */
+
+	if (argv[0]) {
+		_dl_progname = argv[0];
+	}
+
+	/* Start to build the tables of the modules that are required for
+	 * this beast to run.  We start with the basic executable, and then
+	 * go from there.  Eventually we will run across ourself, and we
+	 * will need to properly deal with that as well. */
 	lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + load_addr);
 	lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + load_addr);
 
 
 	tpnt->chains = hash_addr;
 	tpnt->chains = hash_addr;
@@ -823,7 +811,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 	   Note that for SUID programs we ignore the settings in LD_LIBRARY_PATH */
 	   Note that for SUID programs we ignore the settings in LD_LIBRARY_PATH */
 	{
 	{
 		if (_dl_getenv("LD_BIND_NOW", envp))
 		if (_dl_getenv("LD_BIND_NOW", envp))
-			_dl_be_lazy = 0;
+			be_lazy = 0;
 
 
 		if ((auxvt[AT_UID].a_un.a_val == -1 && _dl_suid_ok()) ||
 		if ((auxvt[AT_UID].a_un.a_val == -1 && _dl_suid_ok()) ||
 				(auxvt[AT_UID].a_un.a_val != -1 && 
 				(auxvt[AT_UID].a_un.a_val != -1 && 
@@ -895,9 +883,11 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 	
 	
 	
 	
 #endif	
 #endif	
-	_dl_trace_loaded_objects = _dl_getenv("LD_TRACE_LOADED_OBJECTS", envp);
+	if (_dl_getenv("LD_TRACE_LOADED_OBJECTS", envp) != NULL) {
+		trace_loaded_objects++;
+	}
 #ifndef __LDSO_LDD_SUPPORT__
 #ifndef __LDSO_LDD_SUPPORT__
-	if (_dl_trace_loaded_objects) {
+	if (trace_loaded_objects) {
 		_dl_dprintf(_dl_debug_file, "Use the ldd provided by uClibc\n");
 		_dl_dprintf(_dl_debug_file, "Use the ldd provided by uClibc\n");
 		_dl_exit(1);
 		_dl_exit(1);
 	}
 	}
@@ -942,7 +932,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 			*str2 = '\0';
 			*str2 = '\0';
 			if (!_dl_secure || _dl_strchr(str, '/') == NULL) 
 			if (!_dl_secure || _dl_strchr(str, '/') == NULL) 
 			{
 			{
-				if ((tpnt1 = _dl_check_if_named_library_is_loaded(str))) 
+				if ((tpnt1 = _dl_check_if_named_library_is_loaded(str, trace_loaded_objects))) 
 				{
 				{
 					continue;
 					continue;
 				}
 				}
@@ -950,10 +940,10 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
 						str, _dl_progname);
 						str, _dl_progname);
 #endif
 #endif
-				tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str);
+				tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str, trace_loaded_objects);
 				if (!tpnt1) {
 				if (!tpnt1) {
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
-					if (_dl_trace_loaded_objects)
+					if (trace_loaded_objects)
 						_dl_dprintf(1, "\t%s => not found\n", str);
 						_dl_dprintf(1, "\t%s => not found\n", str);
 					else 
 					else 
 #endif
 #endif
@@ -966,7 +956,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 					_dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
 					_dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
 #endif
 #endif
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
-					if (_dl_trace_loaded_objects && tpnt1->usage_count==1) {
+					if (trace_loaded_objects && tpnt1->usage_count==1) {
 						/* this is a real hack to make ldd not print 
 						/* this is a real hack to make ldd not print 
 						 * the library itself when run on a library. */
 						 * the library itself when run on a library. */
 						if (_dl_strcmp(_dl_progname, str) != 0)
 						if (_dl_strcmp(_dl_progname, str) != 0)
@@ -1026,7 +1016,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 						c = *cp;
 						c = *cp;
 						*cp = '\0';
 						*cp = '\0';
 
 
-						if ((tpnt1 = _dl_check_if_named_library_is_loaded(cp2))) 
+						if ((tpnt1 = _dl_check_if_named_library_is_loaded(cp2, trace_loaded_objects))) 
 						{
 						{
 							continue;
 							continue;
 						}
 						}
@@ -1034,10 +1024,10 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 						if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
 						if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
 								cp2, _dl_progname);
 								cp2, _dl_progname);
 #endif
 #endif
-						tpnt1 = _dl_load_shared_library(0, &rpnt, NULL, cp2);
+						tpnt1 = _dl_load_shared_library(0, &rpnt, NULL, cp2, trace_loaded_objects);
 						if (!tpnt1) {
 						if (!tpnt1) {
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
-							if (_dl_trace_loaded_objects)
+							if (trace_loaded_objects)
 								_dl_dprintf(1, "\t%s => not found\n", cp2);
 								_dl_dprintf(1, "\t%s => not found\n", cp2);
 							else 
 							else 
 #endif
 #endif
@@ -1050,7 +1040,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 							_dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
 							_dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
 #endif
 #endif
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
-							if (_dl_trace_loaded_objects && tpnt1->usage_count==1) {
+							if (trace_loaded_objects && tpnt1->usage_count==1) {
 								_dl_dprintf(1, "\t%s => %s (%x)\n", cp2, 
 								_dl_dprintf(1, "\t%s => %s (%x)\n", cp2, 
 										tpnt1->libname, (unsigned) tpnt1->loadaddr);
 										tpnt1->libname, (unsigned) tpnt1->loadaddr);
 							}
 							}
@@ -1081,7 +1071,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 				lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val);
 				lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val);
 				name = _dl_get_last_path_component(lpntstr);
 				name = _dl_get_last_path_component(lpntstr);
 
 
-				if ((tpnt1 = _dl_check_if_named_library_is_loaded(name))) 
+				if ((tpnt1 = _dl_check_if_named_library_is_loaded(name, trace_loaded_objects))) 
 				{
 				{
 					continue;
 					continue;
 				}
 				}
@@ -1089,10 +1079,10 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
 						lpntstr, _dl_progname);
 						lpntstr, _dl_progname);
 #endif
 #endif
-				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr)))
+				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr, trace_loaded_objects)))
 				{
 				{
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
-					if (_dl_trace_loaded_objects) {
+					if (trace_loaded_objects) {
 						_dl_dprintf(1, "\t%s => not found\n", lpntstr);
 						_dl_dprintf(1, "\t%s => not found\n", lpntstr);
 						continue;
 						continue;
 					} else 
 					} else 
@@ -1106,7 +1096,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 					_dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
 					_dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
 #endif
 #endif
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
-					if (_dl_trace_loaded_objects && tpnt1->usage_count==1) {
+					if (trace_loaded_objects && tpnt1->usage_count==1) {
 						_dl_dprintf(1, "\t%s => %s (%x)\n", lpntstr, tpnt1->libname, 
 						_dl_dprintf(1, "\t%s => %s (%x)\n", lpntstr, tpnt1->libname, 
 								(unsigned) tpnt1->loadaddr);
 								(unsigned) tpnt1->loadaddr);
 					}
 					}
@@ -1154,7 +1144,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 
 
 #ifdef __LDSO_LDD_SUPPORT__
 #ifdef __LDSO_LDD_SUPPORT__
 	/* End of the line for ldd.... */
 	/* End of the line for ldd.... */
-	if (_dl_trace_loaded_objects) {
+	if (trace_loaded_objects) {
 		_dl_dprintf(1, "\t%s => %s (%x)\n", rpnt->dyn->libname + (_dl_strlen(_dl_ldsopath)) + 1, 
 		_dl_dprintf(1, "\t%s => %s (%x)\n", rpnt->dyn->libname + (_dl_strlen(_dl_ldsopath)) + 1, 
 				rpnt->dyn->libname, rpnt->dyn->loadaddr);  
 				rpnt->dyn->libname, rpnt->dyn->loadaddr);  
 		_dl_exit(0);
 		_dl_exit(0);
@@ -1179,7 +1169,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 	 * to the GOT tables.  We need to do this in reverse order so that COPY
 	 * to the GOT tables.  We need to do this in reverse order so that COPY
 	 * directives work correctly */
 	 * directives work correctly */
 	if (_dl_symbol_tables)
 	if (_dl_symbol_tables)
-		goof += _dl_fixup(_dl_symbol_tables, _dl_be_lazy);
+		goof += _dl_fixup(_dl_symbol_tables, be_lazy);
 
 
 
 
 	/* OK, at this point things are pretty much ready to run.  Now we
 	/* OK, at this point things are pretty much ready to run.  Now we
@@ -1279,6 +1269,10 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 		}
 		}
 #endif
 #endif
 	}
 	}
+
+	/* Notify the debugger that all objects are now mapped in.  */
+	_dl_debug_addr->r_state = RT_CONSISTENT;
+	_dl_debug_state();
 }
 }
 
 
 /*
 /*

+ 5 - 4
ldso/ldso/readelflib1.c

@@ -166,7 +166,8 @@ search_for_named_library(const char *name, int secure, const char *path_list,
 }
 }
 
 
 /* Check if the named library is already loaded... */
 /* Check if the named library is already loaded... */
-struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname)
+struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname,
+		int trace_loaded_objects)
 {
 {
 	const char *pnt, *pnt1;
 	const char *pnt, *pnt1;
 	struct elf_resolve *tpnt1;
 	struct elf_resolve *tpnt1;
@@ -201,7 +202,7 @@ struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libnam
 	{
 	{
 		/* Abort attempts to load glibc, libc5, etc */
 		/* Abort attempts to load glibc, libc5, etc */
 		if ( libname[8]!='0') {
 		if ( libname[8]!='0') {
-			if (!_dl_trace_loaded_objects) {
+			if (!trace_loaded_objects) {
 				_dl_dprintf(2, aborted_wrong_lib, libname, _dl_progname);
 				_dl_dprintf(2, aborted_wrong_lib, libname, _dl_progname);
 				_dl_exit(1);
 				_dl_exit(1);
 			}
 			}
@@ -241,7 +242,7 @@ unsigned long _dl_internal_error_number;
 extern char *_dl_ldsopath;
 extern char *_dl_ldsopath;
 
 
 struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
 struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
-	struct elf_resolve *tpnt, char *full_libname)
+	struct elf_resolve *tpnt, char *full_libname, int trace_loaded_objects)
 {
 {
 	char *pnt, *pnt1;
 	char *pnt, *pnt1;
 	struct elf_resolve *tpnt1;
 	struct elf_resolve *tpnt1;
@@ -265,7 +266,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
 	/* Critical step!  Weed out duplicates early to avoid
 	/* Critical step!  Weed out duplicates early to avoid
 	 * function aliasing, which wastes memory, and causes
 	 * function aliasing, which wastes memory, and causes
 	 * really bad things to happen with weaks and globals. */
 	 * really bad things to happen with weaks and globals. */
-	if ((tpnt1=_dl_check_if_named_library_is_loaded(libname))!=NULL)
+	if ((tpnt1=_dl_check_if_named_library_is_loaded(libname, trace_loaded_objects))!=NULL)
 		return tpnt1;
 		return tpnt1;
 
 
 #if defined (__SUPPORT_LD_DEBUG__)
 #if defined (__SUPPORT_LD_DEBUG__)

+ 5 - 5
ldso/libdl/dlib.c

@@ -32,9 +32,9 @@ static int __attribute__ ((unused)) foobar1 = (int) foobar;	/* Use as pointer */
 extern void _dl_dprintf(int, const char *, ...) __attribute__ ((__weak__, __alias__ ("foobar")));
 extern void _dl_dprintf(int, const char *, ...) __attribute__ ((__weak__, __alias__ ("foobar")));
 extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, enum caller_type)
 extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, enum caller_type)
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 	__attribute__ ((__weak__, __alias__ ("foobar")));
-extern struct elf_resolve * _dl_load_shared_library(int, struct dyn_elf **, struct elf_resolve *, char *)
+extern struct elf_resolve * _dl_load_shared_library(int, struct dyn_elf **, struct elf_resolve *, char *, int)
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 	__attribute__ ((__weak__, __alias__ ("foobar")));
-extern struct elf_resolve * _dl_check_if_named_library_is_loaded(const char *full_libname)
+extern struct elf_resolve * _dl_check_if_named_library_is_loaded(const char *, int)
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 extern int _dl_fixup(struct dyn_elf *rpnt, int lazy)
 extern int _dl_fixup(struct dyn_elf *rpnt, int lazy)
 	 __attribute__ ((__weak__, __alias__ ("foobar")));
 	 __attribute__ ((__weak__, __alias__ ("foobar")));
@@ -79,7 +79,7 @@ int   _dl_debug_file = 2;
 char *_dl_library_path = 0;
 char *_dl_library_path = 0;
 char *_dl_ldsopath = 0;
 char *_dl_ldsopath = 0;
 struct r_debug *_dl_debug_addr = NULL;
 struct r_debug *_dl_debug_addr = NULL;
-static char *_dl_malloc_addr, *_dl_mmap_zero;
+static unsigned char *_dl_malloc_addr, *_dl_mmap_zero;
 #include "../ldso/_dl_progname.h"               /* Pull in the name of ld.so */
 #include "../ldso/_dl_progname.h"               /* Pull in the name of ld.so */
 #include "../ldso/hash.c"
 #include "../ldso/hash.c"
 #define _dl_trace_loaded_objects    0
 #define _dl_trace_loaded_objects    0
@@ -179,7 +179,7 @@ void *_dlopen(const char *libname, int flag)
 	if(_dl_debug) 
 	if(_dl_debug) 
 	_dl_dprintf(_dl_debug_file, "Trying to dlopen '%s'\n", (char*)libname);
 	_dl_dprintf(_dl_debug_file, "Trying to dlopen '%s'\n", (char*)libname);
 #endif
 #endif
-	tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname);
+	tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname, 0);
 	if (tpnt == NULL) {
 	if (tpnt == NULL) {
 		_dl_unmap_cache();
 		_dl_unmap_cache();
 		return NULL;
 		return NULL;
@@ -226,7 +226,7 @@ void *_dlopen(const char *libname, int flag)
 						lpntstr, tcurr->libname);
 						lpntstr, tcurr->libname);
 #endif
 #endif
 
 
-				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr))) {
+				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr, 0))) {
 					goto oops;
 					goto oops;
 				}
 				}
 
 

+ 5 - 5
ldso/libdl/libdl.c

@@ -32,9 +32,9 @@ static int __attribute__ ((unused)) foobar1 = (int) foobar;	/* Use as pointer */
 extern void _dl_dprintf(int, const char *, ...) __attribute__ ((__weak__, __alias__ ("foobar")));
 extern void _dl_dprintf(int, const char *, ...) __attribute__ ((__weak__, __alias__ ("foobar")));
 extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, enum caller_type)
 extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, enum caller_type)
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 	__attribute__ ((__weak__, __alias__ ("foobar")));
-extern struct elf_resolve * _dl_load_shared_library(int, struct dyn_elf **, struct elf_resolve *, char *)
+extern struct elf_resolve * _dl_load_shared_library(int, struct dyn_elf **, struct elf_resolve *, char *, int)
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 	__attribute__ ((__weak__, __alias__ ("foobar")));
-extern struct elf_resolve * _dl_check_if_named_library_is_loaded(const char *full_libname)
+extern struct elf_resolve * _dl_check_if_named_library_is_loaded(const char *, int)
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 	__attribute__ ((__weak__, __alias__ ("foobar")));
 extern int _dl_fixup(struct dyn_elf *rpnt, int lazy)
 extern int _dl_fixup(struct dyn_elf *rpnt, int lazy)
 	 __attribute__ ((__weak__, __alias__ ("foobar")));
 	 __attribute__ ((__weak__, __alias__ ("foobar")));
@@ -79,7 +79,7 @@ int   _dl_debug_file = 2;
 char *_dl_library_path = 0;
 char *_dl_library_path = 0;
 char *_dl_ldsopath = 0;
 char *_dl_ldsopath = 0;
 struct r_debug *_dl_debug_addr = NULL;
 struct r_debug *_dl_debug_addr = NULL;
-static char *_dl_malloc_addr, *_dl_mmap_zero;
+static unsigned char *_dl_malloc_addr, *_dl_mmap_zero;
 #include "../ldso/_dl_progname.h"               /* Pull in the name of ld.so */
 #include "../ldso/_dl_progname.h"               /* Pull in the name of ld.so */
 #include "../ldso/hash.c"
 #include "../ldso/hash.c"
 #define _dl_trace_loaded_objects    0
 #define _dl_trace_loaded_objects    0
@@ -179,7 +179,7 @@ void *_dlopen(const char *libname, int flag)
 	if(_dl_debug) 
 	if(_dl_debug) 
 	_dl_dprintf(_dl_debug_file, "Trying to dlopen '%s'\n", (char*)libname);
 	_dl_dprintf(_dl_debug_file, "Trying to dlopen '%s'\n", (char*)libname);
 #endif
 #endif
-	tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname);
+	tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname, 0);
 	if (tpnt == NULL) {
 	if (tpnt == NULL) {
 		_dl_unmap_cache();
 		_dl_unmap_cache();
 		return NULL;
 		return NULL;
@@ -226,7 +226,7 @@ void *_dlopen(const char *libname, int flag)
 						lpntstr, tcurr->libname);
 						lpntstr, tcurr->libname);
 #endif
 #endif
 
 
-				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr))) {
+				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr, 0))) {
 					goto oops;
 					goto oops;
 				}
 				}