summaryrefslogtreecommitdiff
path: root/ldso/ldso/ldso.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-08-19 13:11:09 +0000
committerEric Andersen <andersen@codepoet.org>2003-08-19 13:11:09 +0000
commit2711bc5895accc67e27232d9b75fc12c7994837f (patch)
tree945cf31c093b07bbdc09222c405297b7951336d1 /ldso/ldso/ldso.c
parentbca6a155c79147f706242ed7c590a3538e407a40 (diff)
Cool. Found most of the problem. Turns out we were inadvertanly loading some
libraries multiple times, wasting memory and causing different libraries to use different symbol sets, some of which were not properly resolved. Continue scrubbing ld.so and converting it to use proper types.
Diffstat (limited to 'ldso/ldso/ldso.c')
-rw-r--r--ldso/ldso/ldso.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index 7bfe24947..b3fbab842 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -142,7 +142,6 @@ static char *_dl_malloc_addr, *_dl_mmap_zero;
static char *_dl_trace_loaded_objects = 0;
static int (*_dl_elf_main) (int, char **, char **);
-static int (*_dl_elf_init) (void);
struct r_debug *_dl_debug_addr = NULL;
unsigned long *_dl_brkp;
unsigned long *_dl_envp;
@@ -665,7 +664,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
tpnt->next = 0;
tpnt->libname = 0;
tpnt->libtype = program_interpreter;
- tpnt->loadaddr = (char *) load_addr;
+ tpnt->loadaddr = (ElfW(Addr)) load_addr;
#ifdef ALLOW_ZERO_PLTGOT
if (tpnt->dynamic_info[DT_PLTGOT])
@@ -690,17 +689,17 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
tpnt->ppnt = myppnt = (ElfW(Phdr) *) (load_addr + epnt->e_phoff);
for (j = 0; j < epnt->e_phnum; j++, myppnt++) {
if (myppnt->p_type == PT_DYNAMIC) {
- tpnt->dynamic_addr = myppnt->p_vaddr + load_addr;
+ tpnt->dynamic_addr = (ElfW(Dyn) *)myppnt->p_vaddr + load_addr;
#if defined(__mips__)
{
int k = 1;
- Elf32_Dyn *dpnt = (Elf32_Dyn *) tpnt->dynamic_addr;
+ ElfW(Dyn) *dpnt = (ElfW(Dyn) *) tpnt->dynamic_addr;
while(dpnt->d_tag) {
dpnt++;
k++;
}
- tpnt->dynamic_size = k * sizeof(Elf32_Dyn);
+ tpnt->dynamic_size = k * sizeof(ElfW(Dyn));
}
#else
tpnt->dynamic_size = myppnt->p_filesz;
@@ -1038,8 +1037,7 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
for (dpnt = (Elf32_Dyn *) tcurr->dynamic_addr; dpnt->d_tag;
dpnt++) {
if (dpnt->d_tag == DT_NEEDED) {
- lpntstr = tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] +
- dpnt->d_un.d_val;
+ 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;
@@ -1261,15 +1259,17 @@ static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *a
tpnt->init_flag |= INIT_FUNCS_CALLED;
if (tpnt->dynamic_info[DT_INIT]) {
- _dl_elf_init = (int (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]);
-
+ void (*dl_elf_func) (void);
+ dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]);
#if defined (__SUPPORT_LD_DEBUG__)
if(_dl_debug) _dl_dprintf(_dl_debug_file,"\ncalling init: %s\n\n", tpnt->libname);
#endif
- (*_dl_elf_init) ();
+ (*dl_elf_func) ();
}
if (_dl_atexit && tpnt->dynamic_info[DT_FINI]) {
- (*_dl_atexit) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]);
+ void (*dl_elf_func) (void);
+ dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]);
+ (*_dl_atexit) (dl_elf_func);
#if defined (__SUPPORT_LD_DEBUG__)
if(_dl_debug && _dl_on_exit)
{