X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fldso%2Fdynlink.c;h=f55c6f104c0a55de65ddad3318281d922904926b;hb=da8d0fc4fa3490f418a438b7e0830f9af312d41f;hp=08f9118d34b46a3a230ad9a06086932b0a04665a;hpb=87d13a4c33b8f75afac357f46341847ac92e2978;p=musl diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 08f9118d..f55c6f10 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -22,8 +22,6 @@ static char errbuf[128]; #ifdef SHARED -#include "reloc.h" - #if ULONG_MAX == 0xffffffff typedef Elf32_Ehdr Ehdr; typedef Elf32_Phdr Phdr; @@ -68,6 +66,8 @@ struct dso { char buf[]; }; +#include "reloc.h" + void __init_ssp(size_t *); static struct dso *head, *tail, *libc; @@ -174,6 +174,8 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri _exit(127); } sym_size = sym->st_size; + } else { + sym_val = sym_size = 0; } do_single_reloc(reloc_addr, type, sym_val, sym_size, base, rel[2]); } @@ -487,6 +489,9 @@ static void reloc_all(struct dso *p) for (; p; p=p->next) { if (p->relocated) continue; decode_vec(p->dynv, dyn, DYN_CNT); +#ifdef NEED_ARCH_RELOCS + do_arch_relocs(p, head); +#endif do_relocs(p, (void *)(p->base+dyn[DT_JMPREL]), dyn[DT_PLTRELSZ], 2+(dyn[DT_PLTREL]==DT_RELA)); do_relocs(p, (void *)(p->base+dyn[DT_REL]), dyn[DT_RELSZ], 2); @@ -685,9 +690,11 @@ void *__dynlink(int argc, char **argv) * all memory used by the dynamic linker. */ runtime = 1; +#ifndef DYNAMIC_IS_RO for (i=0; app->dynv[i]; i+=2) if (app->dynv[i]==DT_DEBUG) app->dynv[i+1] = (size_t)&debug; +#endif debug.ver = 1; debug.bp = _dl_debug_state; debug.head = head; @@ -796,7 +803,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) return p->base + sym->st_value; if (p->deps) for (i=0; p->deps[i]; i++) { - sym = lookup(s, h, p); + sym = lookup(s, h, p->deps[i]); if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) return p->deps[i]->base + sym->st_value; }