diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-06-25 22:36:21 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-06-25 22:36:21 -0400 |
commit | 32de61e81a64c8bb2cd23e3476f00433692f8e59 (patch) | |
tree | 1c078d393681448b498d865db9550d4d209732fa /src | |
parent | 1a3ff4f9099cf3d6b65a77cf9bfb7f69a7698a30 (diff) | |
download | musl-32de61e81a64c8bb2cd23e3476f00433692f8e59.tar.gz |
fix some symbol resolution issues in dynamic linker
1. search was wrongly beginning with lib itself rather than dso head
2. inconsistent resolution of function pointers for functions in plt
Diffstat (limited to 'src')
-rw-r--r-- | src/ldso/dynlink.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 472e389d..9e9415ca 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -114,7 +114,7 @@ static void do_relocs(unsigned char *base, size_t *rel, size_t rel_size, size_t sym = syms + sym_index; name = strings + sym->st_name; ctx = IS_COPY(type) ? dso->next : dso; - sym_val = (size_t)find_sym(ctx, name, 1); + sym_val = (size_t)find_sym(ctx, name, IS_PLT(type)); sym_size = sym->st_size; } do_single_reloc(reloc_addr, type, sym_val, sym_size, base, rel[2]); @@ -335,11 +335,11 @@ static void reloc_all(struct dso *p) if (p->relocated) continue; decode_vec(p->dynv, dyn, DYN_CNT); do_relocs(p->base, (void *)(p->base+dyn[DT_JMPREL]), dyn[DT_PLTRELSZ], - 2+(dyn[DT_PLTREL]==DT_RELA), p->syms, p->strings, p); + 2+(dyn[DT_PLTREL]==DT_RELA), p->syms, p->strings, head); do_relocs(p->base, (void *)(p->base+dyn[DT_REL]), dyn[DT_RELSZ], - 2, p->syms, p->strings, p); + 2, p->syms, p->strings, head); do_relocs(p->base, (void *)(p->base+dyn[DT_RELA]), dyn[DT_RELASZ], - 3, p->syms, p->strings, p); + 3, p->syms, p->strings, head); p->relocated = 1; } } |