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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,11 @@
|
|||
#define IS_COPY(x) ((x)==R_386_COPY)
|
||||
#define IS_PLT(x) ((x)==R_386_JMP_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_386_32:
|
||||
|
|
@ -25,5 +29,21 @@ static inline void do_single_reloc(size_t *reloc_addr, int type, size_t sym_val,
|
|||
case R_386_COPY:
|
||||
memcpy(reloc_addr, (void *)sym_val, sym_size);
|
||||
break;
|
||||
case R_386_TLS_DTPMOD32:
|
||||
*reloc_addr = def.dso ? def.dso->tls_id : self->tls_id;
|
||||
break;
|
||||
case R_386_TLS_DTPOFF32:
|
||||
*reloc_addr = def.sym->st_value;
|
||||
break;
|
||||
case R_386_TLS_TPOFF:
|
||||
*reloc_addr += def.sym
|
||||
? def.sym->st_value - def.dso->tls_offset
|
||||
: 0 - self->tls_offset;
|
||||
break;
|
||||
case R_386_TLS_TPOFF32:
|
||||
*reloc_addr += def.sym
|
||||
? def.dso->tls_offset - def.sym->st_value
|
||||
: self->tls_offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,11 @@
|
|||
#define IS_COPY(x) ((x)==R_MICROBLAZE_COPY)
|
||||
#define IS_PLT(x) ((x)==R_MICROBLAZE_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_MICROBLAZE_32:
|
||||
|
|
|
|||
|
|
@ -6,7 +6,11 @@
|
|||
#define IS_COPY(x) ((x)==R_MIPS_COPY)
|
||||
#define IS_PLT(x) 1
|
||||
|
||||
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_MIPS_JUMP_SLOT:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,11 @@
|
|||
#define IS_COPY(x) ((x)==R_X86_64_COPY)
|
||||
#define IS_PLT(x) ((x)==R_X86_64_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_X86_64_GLOB_DAT:
|
||||
|
|
@ -27,5 +31,16 @@ static inline void do_single_reloc(size_t *reloc_addr, int type, size_t sym_val,
|
|||
case R_X86_64_COPY:
|
||||
memcpy(reloc_addr, (void *)sym_val, sym_size);
|
||||
break;
|
||||
case R_X86_64_TLS_DTPMOD64:
|
||||
*reloc_addr = def.dso ? def.dso->tls_id : self->tls_id;
|
||||
break;
|
||||
case R_X86_64_TLS_DTPOFF64:
|
||||
*reloc_addr = def.sym->st_value + addend;
|
||||
break;
|
||||
case R_X86_64_TLS_TPOFF64:
|
||||
*reloc_addr = (def.sym
|
||||
? def.sym->st_value - def.dso->tls_offset
|
||||
: 0 - self->tls_offset) + addend;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue