From 91a32cb9815ca525726168750566d9acdb099a73 Mon Sep 17 00:00:00 2001
From: Eric Andersen <andersen@codepoet.org>
Date: Fri, 5 Dec 2003 20:24:26 +0000
Subject: move _dl_fixup so staticly linked apps using dlopen have a chance of
 actually working

---
 ldso/ldso/dl-elf.c      | 66 +++++++++++++++++++++++++++++++++++++++++++++++++
 ldso/ldso/ldso.c        | 65 ------------------------------------------------
 ldso/ldso/readelflib1.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 132 insertions(+), 65 deletions(-)

(limited to 'ldso')

diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index a99513700..cb6c6893b 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -903,3 +903,69 @@ void *_dl_malloc(int size)
 	return retval;
 }
 
+int _dl_fixup(struct elf_resolve *tpnt, int flag)
+{
+	int goof = 0;
+
+	if (tpnt->next)
+		goof += _dl_fixup(tpnt->next, flag);
+#if defined (__SUPPORT_LD_DEBUG__)
+	if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname);	
+#endif    
+	
+	if (tpnt->dynamic_info[DT_REL]) {
+#ifdef ELF_USES_RELOCA
+#if defined (__SUPPORT_LD_DEBUG__)
+		if(_dl_debug) _dl_dprintf(2, "%s: can't handle REL relocation records\n", _dl_progname);
+#endif    
+		goof++;
+		return goof;
+#else
+		if (tpnt->init_flag & RELOCS_DONE)
+			return goof;
+		tpnt->init_flag |= RELOCS_DONE;
+		goof += _dl_parse_relocation_information(tpnt, 
+				tpnt->dynamic_info[DT_REL], 
+				tpnt->dynamic_info[DT_RELSZ], 0);
+#endif
+	}
+	if (tpnt->dynamic_info[DT_RELA]) {
+#ifndef ELF_USES_RELOCA
+#if defined (__SUPPORT_LD_DEBUG__)
+		if(_dl_debug) _dl_dprintf(2, "%s: can't handle RELA relocation records\n", _dl_progname);
+#endif    
+		goof++;
+		return goof;
+#else
+		if (tpnt->init_flag & RELOCS_DONE)
+			return goof;
+		tpnt->init_flag |= RELOCS_DONE;
+		goof += _dl_parse_relocation_information(tpnt, 
+				tpnt->dynamic_info[DT_RELA], 
+				tpnt->dynamic_info[DT_RELASZ], 0);
+#endif
+	}
+	if (tpnt->dynamic_info[DT_JMPREL]) {
+		if (tpnt->init_flag & JMP_RELOCS_DONE)
+			return goof;
+		tpnt->init_flag |= JMP_RELOCS_DONE;
+		if (flag & RTLD_LAZY) {
+			_dl_parse_lazy_relocation_information(tpnt, 
+					tpnt->dynamic_info[DT_JMPREL], 
+					tpnt->dynamic_info [DT_PLTRELSZ], 0);
+		} else {
+			goof += _dl_parse_relocation_information(tpnt, 
+					tpnt->dynamic_info[DT_JMPREL], 
+					tpnt->dynamic_info[DT_PLTRELSZ], 0);
+		}
+	}
+#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");
+	}
+#endif    
+	return goof;
+}
+
+
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index e9f773f4a..a5826b671 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -1259,71 +1259,6 @@ void _dl_debug_state(void)
 {
 }
 
-int _dl_fixup(struct elf_resolve *tpnt, int flag)
-{
-	int goof = 0;
-
-	if (tpnt->next)
-		goof += _dl_fixup(tpnt->next, flag);
-#if defined (__SUPPORT_LD_DEBUG__)
-	if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname);	
-#endif    
-	
-	if (tpnt->dynamic_info[DT_REL]) {
-#ifdef ELF_USES_RELOCA
-#if defined (__SUPPORT_LD_DEBUG__)
-		if(_dl_debug) _dl_dprintf(2, "%s: can't handle REL relocation records\n", _dl_progname);
-#endif    
-		goof++;
-		return goof;
-#else
-		if (tpnt->init_flag & RELOCS_DONE)
-			return goof;
-		tpnt->init_flag |= RELOCS_DONE;
-		goof += _dl_parse_relocation_information(tpnt, 
-				tpnt->dynamic_info[DT_REL], 
-				tpnt->dynamic_info[DT_RELSZ], 0);
-#endif
-	}
-	if (tpnt->dynamic_info[DT_RELA]) {
-#ifndef ELF_USES_RELOCA
-#if defined (__SUPPORT_LD_DEBUG__)
-		if(_dl_debug) _dl_dprintf(2, "%s: can't handle RELA relocation records\n", _dl_progname);
-#endif    
-		goof++;
-		return goof;
-#else
-		if (tpnt->init_flag & RELOCS_DONE)
-			return goof;
-		tpnt->init_flag |= RELOCS_DONE;
-		goof += _dl_parse_relocation_information(tpnt, 
-				tpnt->dynamic_info[DT_RELA], 
-				tpnt->dynamic_info[DT_RELASZ], 0);
-#endif
-	}
-	if (tpnt->dynamic_info[DT_JMPREL]) {
-		if (tpnt->init_flag & JMP_RELOCS_DONE)
-			return goof;
-		tpnt->init_flag |= JMP_RELOCS_DONE;
-		if (flag & RTLD_LAZY) {
-			_dl_parse_lazy_relocation_information(tpnt, 
-					tpnt->dynamic_info[DT_JMPREL], 
-					tpnt->dynamic_info [DT_PLTRELSZ], 0);
-		} else {
-			goof += _dl_parse_relocation_information(tpnt, 
-					tpnt->dynamic_info[DT_JMPREL], 
-					tpnt->dynamic_info[DT_PLTRELSZ], 0);
-		}
-	}
-#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");
-	}
-#endif    
-	return goof;
-}
-
 char *_dl_getenv(const char *symbol, char **envp)
 {
 	char *pnt;
diff --git a/ldso/ldso/readelflib1.c b/ldso/ldso/readelflib1.c
index a99513700..cb6c6893b 100644
--- a/ldso/ldso/readelflib1.c
+++ b/ldso/ldso/readelflib1.c
@@ -903,3 +903,69 @@ void *_dl_malloc(int size)
 	return retval;
 }
 
+int _dl_fixup(struct elf_resolve *tpnt, int flag)
+{
+	int goof = 0;
+
+	if (tpnt->next)
+		goof += _dl_fixup(tpnt->next, flag);
+#if defined (__SUPPORT_LD_DEBUG__)
+	if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname);	
+#endif    
+	
+	if (tpnt->dynamic_info[DT_REL]) {
+#ifdef ELF_USES_RELOCA
+#if defined (__SUPPORT_LD_DEBUG__)
+		if(_dl_debug) _dl_dprintf(2, "%s: can't handle REL relocation records\n", _dl_progname);
+#endif    
+		goof++;
+		return goof;
+#else
+		if (tpnt->init_flag & RELOCS_DONE)
+			return goof;
+		tpnt->init_flag |= RELOCS_DONE;
+		goof += _dl_parse_relocation_information(tpnt, 
+				tpnt->dynamic_info[DT_REL], 
+				tpnt->dynamic_info[DT_RELSZ], 0);
+#endif
+	}
+	if (tpnt->dynamic_info[DT_RELA]) {
+#ifndef ELF_USES_RELOCA
+#if defined (__SUPPORT_LD_DEBUG__)
+		if(_dl_debug) _dl_dprintf(2, "%s: can't handle RELA relocation records\n", _dl_progname);
+#endif    
+		goof++;
+		return goof;
+#else
+		if (tpnt->init_flag & RELOCS_DONE)
+			return goof;
+		tpnt->init_flag |= RELOCS_DONE;
+		goof += _dl_parse_relocation_information(tpnt, 
+				tpnt->dynamic_info[DT_RELA], 
+				tpnt->dynamic_info[DT_RELASZ], 0);
+#endif
+	}
+	if (tpnt->dynamic_info[DT_JMPREL]) {
+		if (tpnt->init_flag & JMP_RELOCS_DONE)
+			return goof;
+		tpnt->init_flag |= JMP_RELOCS_DONE;
+		if (flag & RTLD_LAZY) {
+			_dl_parse_lazy_relocation_information(tpnt, 
+					tpnt->dynamic_info[DT_JMPREL], 
+					tpnt->dynamic_info [DT_PLTRELSZ], 0);
+		} else {
+			goof += _dl_parse_relocation_information(tpnt, 
+					tpnt->dynamic_info[DT_JMPREL], 
+					tpnt->dynamic_info[DT_PLTRELSZ], 0);
+		}
+	}
+#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");
+	}
+#endif    
+	return goof;
+}
+
+
-- 
cgit v1.2.3