summaryrefslogtreecommitdiff
path: root/ldso
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-12-05 20:24:26 +0000
committerEric Andersen <andersen@codepoet.org>2003-12-05 20:24:26 +0000
commit91a32cb9815ca525726168750566d9acdb099a73 (patch)
tree212c2f637f22b0e4b56fac1f5c510657df6c241f /ldso
parent386eee7b494be91e20fdd760bc01b20534e5fa7b (diff)
move _dl_fixup so staticly linked apps using dlopen have a
chance of actually working
Diffstat (limited to 'ldso')
-rw-r--r--ldso/ldso/dl-elf.c66
-rw-r--r--ldso/ldso/ldso.c65
-rw-r--r--ldso/ldso/readelflib1.c66
3 files changed, 132 insertions, 65 deletions
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;
+}
+
+