diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 93595a0..485bd4f 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -280,12 +280,17 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri def.dso = dso; } - int gotplt = (type == REL_GOT || type == REL_PLT); - if (dso->rel_update_got && !gotplt && stride==2) continue; - - addend = stride>2 ? rel[2] - : gotplt || type==REL_COPY ? 0 - : *reloc_addr; + if (stride > 2) { + addend = rel[2]; + } else if (type==REL_GOT || type==REL_PLT || type==REL_COPY) { + addend = 0; + } else { + addend = *reloc_addr; + if (dso->rel_update_got) { + struct symdef old = find_sym(&ldso, name, 0); + addend -= (size_t)ldso.base+old.sym->st_value; + } + } sym_val = def.sym ? (size_t)def.dso->base+def.sym->st_value : 0; tls_val = def.sym ? def.sym->st_value : 0;