summaryrefslogtreecommitdiff
path: root/ldso/ldso
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2004-01-29 10:44:50 +0000
committerEric Andersen <andersen@codepoet.org>2004-01-29 10:44:50 +0000
commit3312c6ac985f422a529cf91cfae035f5a3556f8e (patch)
tree97dc40b830aa594606ff836f4ad1f2625b82d695 /ldso/ldso
parentda609428b6b31a46c9309423824767ff7b2a415e (diff)
Eliminate separate passes for _dl_copy_fixups() and _dl_fixup(), and
do both operations in a single pass.
Diffstat (limited to 'ldso/ldso')
-rw-r--r--ldso/ldso/dl-elf.c64
-rw-r--r--ldso/ldso/ldso.c15
-rw-r--r--ldso/ldso/readelflib1.c64
3 files changed, 41 insertions, 102 deletions
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 9650b2f53..fb7eacc12 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -735,47 +735,6 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
return tpnt;
}
-/* Ugly, ugly. Some versions of the SVr4 linker fail to generate COPY
- relocations for global variables that are present both in the image and
- the shared library. Go through and do it manually. If the images
- are guaranteed to be generated by a trustworthy linker, then this
- step can be skipped. */
-
-int _dl_copy_fixups(struct dyn_elf *rpnt)
-{
- int goof = 0;
- struct elf_resolve *tpnt;
-
- if (rpnt->next)
- goof += _dl_copy_fixups(rpnt->next);
- else
- return 0;
-
- tpnt = rpnt->dyn;
-
- if (tpnt->init_flag & COPY_RELOCS_DONE)
- return goof;
- tpnt->init_flag |= COPY_RELOCS_DONE;
-
-#if defined (__SUPPORT_LD_DEBUG__)
- if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s", tpnt->libname);
-#endif
-
-#ifdef ELF_USES_RELOCA
- goof += _dl_parse_copy_information(rpnt,
- tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0);
-
-#else
- goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL],
- tpnt->dynamic_info[DT_RELSZ], 0);
-
-#endif
-#if defined (__SUPPORT_LD_DEBUG__)
- if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s; finished\n\n", tpnt->libname);
-#endif
- return goof;
-}
-
/* Minimal printf which handles only %s, %d, and %x */
void _dl_dprintf(int fd, const char *fmt, ...)
{
@@ -905,12 +864,15 @@ void *_dl_malloc(int size)
return retval;
}
-int _dl_fixup(struct elf_resolve *tpnt, int flag)
+int _dl_fixup(struct dyn_elf *rpnt, int flag)
{
int goof = 0;
+ struct elf_resolve *tpnt;
+
+ if (rpnt->next)
+ goof += _dl_fixup(rpnt->next, flag);
+ tpnt = rpnt->dyn;
- 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
@@ -961,6 +923,19 @@ int _dl_fixup(struct elf_resolve *tpnt, int flag)
tpnt->dynamic_info[DT_PLTRELSZ], 0);
}
}
+ if (tpnt->init_flag & COPY_RELOCS_DONE)
+ return goof;
+ tpnt->init_flag |= COPY_RELOCS_DONE;
+#ifdef ELF_USES_RELOCA
+ goof += _dl_parse_copy_information(rpnt,
+ tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0);
+
+#else
+ goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL],
+ tpnt->dynamic_info[DT_RELSZ], 0);
+
+#endif
+
#if defined (__SUPPORT_LD_DEBUG__)
if(_dl_debug) {
_dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname);
@@ -970,4 +945,3 @@ int _dl_fixup(struct elf_resolve *tpnt, int flag)
return goof;
}
-
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index 0f89d70e8..8d5d08e1e 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -145,7 +145,7 @@ static int (*_dl_elf_main) (int, char **, char **);
struct r_debug *_dl_debug_addr = NULL;
unsigned long *_dl_brkp;
unsigned long *_dl_envp;
-int _dl_fixup(struct elf_resolve *tpnt, int lazy);
+int _dl_fixup(struct dyn_elf *rpnt, int flag);
void _dl_debug_state(void);
char *_dl_get_last_path_component(char *path);
static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt,
@@ -1185,18 +1185,9 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
* Now we go through and look for REL and RELA records that indicate fixups
* to the GOT tables. We need to do this in reverse order so that COPY
* directives work correctly */
- goof = _dl_loaded_modules ? _dl_fixup(_dl_loaded_modules, _dl_be_lazy) : 0;
-
-
- /* Some flavors of SVr4 do not generate the R_*_COPY directive,
- and we have to manually search for entries that require fixups.
- Solaris gets this one right, from what I understand. */
-
-#ifdef __SUPPORT_LD_DEBUG_EARLY__
- _dl_dprintf(_dl_debug_file, "Beginning copy fixups\n");
-#endif
if (_dl_symbol_tables)
- goof += _dl_copy_fixups(_dl_symbol_tables);
+ goof += _dl_fixup(_dl_symbol_tables, _dl_be_lazy);
+
/* OK, at this point things are pretty much ready to run. Now we
need to touch up a few items that are required, and then
diff --git a/ldso/ldso/readelflib1.c b/ldso/ldso/readelflib1.c
index 9650b2f53..fb7eacc12 100644
--- a/ldso/ldso/readelflib1.c
+++ b/ldso/ldso/readelflib1.c
@@ -735,47 +735,6 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
return tpnt;
}
-/* Ugly, ugly. Some versions of the SVr4 linker fail to generate COPY
- relocations for global variables that are present both in the image and
- the shared library. Go through and do it manually. If the images
- are guaranteed to be generated by a trustworthy linker, then this
- step can be skipped. */
-
-int _dl_copy_fixups(struct dyn_elf *rpnt)
-{
- int goof = 0;
- struct elf_resolve *tpnt;
-
- if (rpnt->next)
- goof += _dl_copy_fixups(rpnt->next);
- else
- return 0;
-
- tpnt = rpnt->dyn;
-
- if (tpnt->init_flag & COPY_RELOCS_DONE)
- return goof;
- tpnt->init_flag |= COPY_RELOCS_DONE;
-
-#if defined (__SUPPORT_LD_DEBUG__)
- if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s", tpnt->libname);
-#endif
-
-#ifdef ELF_USES_RELOCA
- goof += _dl_parse_copy_information(rpnt,
- tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0);
-
-#else
- goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL],
- tpnt->dynamic_info[DT_RELSZ], 0);
-
-#endif
-#if defined (__SUPPORT_LD_DEBUG__)
- if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s; finished\n\n", tpnt->libname);
-#endif
- return goof;
-}
-
/* Minimal printf which handles only %s, %d, and %x */
void _dl_dprintf(int fd, const char *fmt, ...)
{
@@ -905,12 +864,15 @@ void *_dl_malloc(int size)
return retval;
}
-int _dl_fixup(struct elf_resolve *tpnt, int flag)
+int _dl_fixup(struct dyn_elf *rpnt, int flag)
{
int goof = 0;
+ struct elf_resolve *tpnt;
+
+ if (rpnt->next)
+ goof += _dl_fixup(rpnt->next, flag);
+ tpnt = rpnt->dyn;
- 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
@@ -961,6 +923,19 @@ int _dl_fixup(struct elf_resolve *tpnt, int flag)
tpnt->dynamic_info[DT_PLTRELSZ], 0);
}
}
+ if (tpnt->init_flag & COPY_RELOCS_DONE)
+ return goof;
+ tpnt->init_flag |= COPY_RELOCS_DONE;
+#ifdef ELF_USES_RELOCA
+ goof += _dl_parse_copy_information(rpnt,
+ tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0);
+
+#else
+ goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL],
+ tpnt->dynamic_info[DT_RELSZ], 0);
+
+#endif
+
#if defined (__SUPPORT_LD_DEBUG__)
if(_dl_debug) {
_dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname);
@@ -970,4 +945,3 @@ int _dl_fixup(struct elf_resolve *tpnt, int flag)
return goof;
}
-