further refactoring of dynamic linker load address computations
authorRich Felker <dalias@aerifal.cx>
Thu, 17 Sep 2015 17:50:43 +0000 (17:50 +0000)
committerRich Felker <dalias@aerifal.cx>
Thu, 17 Sep 2015 17:50:43 +0000 (17:50 +0000)
these are in do_relocs. the first one was omitted in commit
301335a80b85f12c018e4acf1a2c28615e119f8d because it slightly changes
code (using dso->base rather than cached local var base) and would
have prevented easy verification. the other was an oversight.

src/ldso/dynlink.c

index 75fae76..6e79a77 100644 (file)
@@ -288,7 +288,7 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri
                type = R_TYPE(rel[1]);
                if (type == REL_NONE) continue;
                sym_index = R_SYM(rel[1]);
-               reloc_addr = (void *)(base + rel[0]);
+               reloc_addr = laddr(dso, rel[0]);
                if (sym_index) {
                        sym = syms + sym_index;
                        name = strings + sym->st_name;
@@ -322,7 +322,7 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri
                        addend = *reloc_addr;
                }
 
-               sym_val = def.sym ? (size_t)def.dso->base+def.sym->st_value : 0;
+               sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0;
                tls_val = def.sym ? def.sym->st_value : 0;
 
                switch(type) {