refactor to remove arch-specific relocation code from dynamic linker
this was one of the main instances of ugly code duplication: all archs use basically the same types of relocations, but roughly equivalent logic was duplicated for each arch to account for the different naming and numbering of relocation types and variation in whether REL or RELA records are used. as an added bonus, both REL and RELA are now supported on all archs, regardless of which is used by the standard toolchain.
This commit is contained in:
parent
94cf991bf4
commit
adf94c1966
9 changed files with 189 additions and 210 deletions
|
|
@ -3,39 +3,27 @@
|
|||
|
||||
#define LDSO_ARCH "powerpc"
|
||||
|
||||
#define IS_COPY(x) ((x)==R_PPC_COPY)
|
||||
#define IS_PLT(x) ((x)==R_PPC_JMP_SLOT)
|
||||
#define TPOFF_K (-0x7000)
|
||||
|
||||
// see linux' arch/powerpc/include/asm/elf.h
|
||||
static inline int do_single_reloc(
|
||||
struct dso *self, unsigned char *base_addr,
|
||||
size_t *reloc_addr, int type, size_t addend,
|
||||
Sym *sym, size_t sym_size,
|
||||
struct symdef def, size_t sym_val)
|
||||
static int remap_rel(int type)
|
||||
{
|
||||
switch(type) {
|
||||
case R_PPC_GLOB_DAT:
|
||||
case R_PPC_JMP_SLOT:
|
||||
case R_PPC_ADDR32:
|
||||
*reloc_addr = sym_val + addend;
|
||||
break;
|
||||
case R_PPC_COPY:
|
||||
memcpy(reloc_addr, (void *)sym_val, sym_size);
|
||||
break;
|
||||
return REL_SYMBOLIC;
|
||||
case R_PPC_GLOB_DAT:
|
||||
return REL_GOT;
|
||||
case R_PPC_JMP_SLOT:
|
||||
return REL_PLT;
|
||||
case R_PPC_RELATIVE:
|
||||
*reloc_addr = (size_t)base_addr + addend;
|
||||
break;
|
||||
return REL_RELATIVE;
|
||||
case R_PPC_COPY:
|
||||
return REL_COPY;
|
||||
case R_PPC_DTPMOD32:
|
||||
*reloc_addr = def.dso ? def.dso->tls_id : self->tls_id;
|
||||
break;
|
||||
return REL_DTPMOD;
|
||||
case R_PPC_DTPREL32:
|
||||
*reloc_addr = def.sym->st_value + addend;
|
||||
break;
|
||||
return REL_DTPOFF;
|
||||
case R_PPC_TPREL32:
|
||||
*reloc_addr = (def.sym
|
||||
? def.sym->st_value + def.dso->tls_offset
|
||||
: self->tls_offset) - 0x7000 + addend;
|
||||
break;
|
||||
return REL_TPOFF;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue