dynamic-linked TLS support for everything but dlopen'd libs
currently, only i386 is tested. x86_64 and arm should probably work. the necessary relocation types for mips and microblaze have not been added because I don't understand how they're supposed to work, and I'm not even sure if it's defined yet on microblaze. I may be able to reverse engineer the requirements out of gcc/binutils output.
This commit is contained in:
parent
c91aa03d24
commit
9c74856af7
6 changed files with 121 additions and 43 deletions
|
|
@ -6,7 +6,11 @@
|
|||
#define IS_COPY(x) ((x)==R_ARM_COPY)
|
||||
#define IS_PLT(x) ((x)==R_ARM_JUMP_SLOT)
|
||||
|
||||
static inline void do_single_reloc(size_t *reloc_addr, int type, size_t sym_val, size_t sym_size, unsigned char *base_addr, size_t addend)
|
||||
static inline void 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)
|
||||
{
|
||||
switch(type) {
|
||||
case R_ARM_ABS32:
|
||||
|
|
@ -22,5 +26,16 @@ static inline void do_single_reloc(size_t *reloc_addr, int type, size_t sym_val,
|
|||
case R_ARM_COPY:
|
||||
memcpy(reloc_addr, (void *)sym_val, sym_size);
|
||||
break;
|
||||
case R_ARM_TLS_DTPMOD32:
|
||||
*reloc_addr = def.dso ? def.dso->tls_id : self->tls_id;
|
||||
break;
|
||||
case R_ARM_TLS_DTPOFF32:
|
||||
*reloc_addr += def.sym->st_value;
|
||||
break;
|
||||
case R_ARM_TLS_TPOFF32:
|
||||
*reloc_addr += def.sym
|
||||
? def.sym->st_value - def.dso->tls_offset
|
||||
: 0 - self->tls_offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue