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/dl-hash.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/dl-hash.c')
-rw-r--r-- | ldso/ldso/dl-hash.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c index bd7ac7708..1eb7c5dd9 100644 --- a/ldso/ldso/dl-hash.c +++ b/ldso/ldso/dl-hash.c @@ -123,7 +123,7 @@ struct elf_resolve *_dl_add_elf_hash_table(const char *libname, tpnt->next = NULL; tpnt->init_flag = 0; tpnt->libname = _dl_strdup(libname); - tpnt->dynamic_addr = dynamic_addr; + tpnt->dynamic_addr = (ElfW(Dyn) *)dynamic_addr; tpnt->dynamic_size = dynamic_size; tpnt->libtype = loaded_file; @@ -135,7 +135,7 @@ struct elf_resolve *_dl_add_elf_hash_table(const char *libname, hash_addr += tpnt->nbucket; tpnt->chains = hash_addr; } - tpnt->loadaddr = loadaddr; + tpnt->loadaddr = (ElfW(Addr))loadaddr; for (i = 0; i < 24; i++) tpnt->dynamic_info[i] = dynamic_info[i]; #ifdef __mips__ @@ -285,15 +285,14 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt1, ELF32_ST_TYPE(symtab[si].st_info) == STT_NOTYPE) { /* nakao */ - data_result = tpnt->loadaddr + + data_result = (char *)tpnt->loadaddr + symtab[si].st_value; /* nakao */ break; /* nakao */ } else /* nakao */ - return tpnt->loadaddr + symtab[si].st_value; + return (char*)tpnt->loadaddr + symtab[si].st_value; case STB_WEAK: if (!weak_result) - weak_result = - tpnt->loadaddr + symtab[si].st_value; + weak_result = (char *)tpnt->loadaddr + symtab[si].st_value; break; default: /* Do local symbols need to be examined? */ break; |