diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-08-19 13:11:09 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-08-19 13:11:09 +0000 |
commit | 2711bc5895accc67e27232d9b75fc12c7994837f (patch) | |
tree | 945cf31c093b07bbdc09222c405297b7951336d1 /ldso/ldso/ldso.c | |
parent | bca6a155c79147f706242ed7c590a3538e407a40 (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.c | 22 |
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) { |