Ver Fonte

delete some garbage, cleanup duplicate handling

Eric Andersen há 21 anos atrás
pai
commit
e94c196685
1 ficheiros alterados com 34 adições e 67 exclusões
  1. 34 67
      ldso/ldso/ldso.c

+ 34 - 67
ldso/ldso/ldso.c

@@ -125,16 +125,16 @@
 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 int _dl_be_lazy = 1;
+static int _dl_be_lazy = RTLD_LAZY;
 #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;
+char *_dl_debug  = 0;
+char *_dl_debug_symbols = 0;
+char *_dl_debug_move    = 0;
+char *_dl_debug_reloc   = 0;
+char *_dl_debug_detail  = 0;
+char *_dl_debug_nofixups  = 0;
+char *_dl_debug_bindings  = 0;
+int   _dl_debug_file = 2;
 #else
 #define _dl_debug_file 2
 #endif
@@ -906,6 +906,10 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 				{
 					continue;
 				}
+#if defined (__SUPPORT_LD_DEBUG__)
+				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
+						str, _dl_progname);
+#endif
 				tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str);
 				if (!tpnt1) {
 #ifdef __LDSO_LDD_SUPPORT__
@@ -986,6 +990,10 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 						{
 							continue;
 						}
+#if defined (__SUPPORT_LD_DEBUG__)
+						if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
+								cp2, _dl_progname);
+#endif
 						tpnt1 = _dl_load_shared_library(0, &rpnt, NULL, cp2);
 						if (!tpnt1) {
 #ifdef __LDSO_LDD_SUPPORT__
@@ -1022,70 +1030,32 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 	}
 #endif
 
-	for (tcurr = _dl_loaded_modules; tcurr; tcurr = tcurr->next) {
+	for (tcurr = _dl_loaded_modules; tcurr; tcurr = tcurr->next) 
+	{
 		Elf32_Dyn *dpnt;
-		for (dpnt = (Elf32_Dyn *) tcurr->dynamic_addr; dpnt->d_tag;
-				dpnt++) {
-			if (dpnt->d_tag == DT_NEEDED) {
+		for (dpnt = (Elf32_Dyn *) tcurr->dynamic_addr; dpnt->d_tag; dpnt++) 
+		{
+			if (dpnt->d_tag == DT_NEEDED) 
+			{
+				char *name;
 				lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val);
-				if (_dl_strcmp(lpntstr, "libc.so.6") == 0) {
-					char *name, *msg;
-					name = tcurr->libname;
-					while(*name == '/')
-						name++;
-					if (_dl_trace_loaded_objects) {
-						msg = "WARNING"; 
-					} else {
-						msg = "ERROR"; 
-					}
-					_dl_dprintf(2, "\t%s: %s is linked with GNU libc!\n", msg, --name);
-					/* If all we are doing is ldd, then we don't need to freak out... */
-					if (_dl_trace_loaded_objects) {
-						continue;
-					}
-					/* Time to freak out.  Make sure glibc linked libraries are not loaded */
-					_dl_exit(150);
-				}
-				if (tpnt && _dl_strcmp(lpntstr, _dl_get_last_path_component(tpnt->libname)) == 0) 
-				{
-					struct elf_resolve *ttmp;
+				name = _dl_get_last_path_component(lpntstr);
 
-#ifdef __LDSO_LDD_SUPPORT__
-					if (_dl_trace_loaded_objects && tpnt->usage_count==1) {
-						char *name;
-						name = tpnt->libname;
-						while(*name == '/')
-							name++;
-						_dl_dprintf(1, "\t%s => %s (%x)\n", 
-								lpntstr, --name, (unsigned) tpnt->loadaddr);
-					}
-#endif
-					ttmp = _dl_loaded_modules;
-					while (ttmp->next)
-						ttmp = ttmp->next;
-					ttmp->next = tpnt;
-					tpnt->prev = ttmp;
-					tpnt->next = NULL;
-					rpnt->next = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf));
-					_dl_memset(rpnt->next, 0, sizeof(struct dyn_elf));
-					rpnt->next->prev = rpnt;
-					rpnt = rpnt->next;
-					rpnt->dyn = tpnt;
-					tpnt->usage_count++;
-					tpnt->symbol_scope = _dl_symbol_tables;
-					tpnt = NULL;
-					continue;
-				}
-				if ((tpnt1 = _dl_check_if_named_library_is_loaded(lpntstr))) 
+				if ((tpnt1 = _dl_check_if_named_library_is_loaded(name))) 
 				{
 					continue;
 				}
+#if defined (__SUPPORT_LD_DEBUG__)
+				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s';  needed by '%s'\n", 
+						lpntstr, _dl_progname);
+#endif
 				if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr)))
 				{
 #ifdef __LDSO_LDD_SUPPORT__
-					if (_dl_trace_loaded_objects)
+					if (_dl_trace_loaded_objects) {
 						_dl_dprintf(1, "\t%s => not found\n", lpntstr);
-					else 
+						continue;
+					} else 
 #endif
 					{
 						_dl_dprintf(2, "%s: can't load library '%s'\n", _dl_progname, lpntstr);
@@ -1097,10 +1067,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
 #endif
 #ifdef __LDSO_LDD_SUPPORT__
 					if (_dl_trace_loaded_objects && tpnt1->usage_count==1) {
-						char *name;
-						name = tpnt1->libname;
-						while(*name == '/')
-							name++;
+						name = _dl_get_last_path_component(tpnt1->libname);
 						_dl_dprintf(1, "\t%s => %s (%x)\n", lpntstr, --name, 
 								(unsigned) tpnt1->loadaddr);
 					}