OSDN Git Service

move _dl_fixup so staticly linked apps using dlopen have a
authorEric Andersen <andersen@codepoet.org>
Fri, 5 Dec 2003 20:24:26 +0000 (20:24 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 5 Dec 2003 20:24:26 +0000 (20:24 -0000)
chance of actually working

ldso/ldso/dl-elf.c
ldso/ldso/ldso.c
ldso/ldso/readelflib1.c

index a995137..cb6c689 100644 (file)
@@ -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;
+}
+
+
index e9f773f..a5826b6 100644 (file)
@@ -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;
index a995137..cb6c689 100644 (file)
@@ -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;
+}
+
+