remove init/fini array asm from arm crti/crtn files
[musl] / arch / arm / reloc.h
1 #include <string.h>
2 #include <elf.h>
3 #include <endian.h>
4
5 #if __BYTE_ORDER == __BIG_ENDIAN
6 #define ENDIAN_SUFFIX "eb"
7 #else
8 #define ENDIAN_SUFFIX ""
9 #endif
10
11 #if __SOFTFP__
12 #define FP_SUFFIX ""
13 #else
14 #define FP_SUFFIX "hf"
15 #endif
16
17 #define LDSO_ARCH "arm" ENDIAN_SUFFIX FP_SUFFIX
18
19 #define IS_COPY(x) ((x)==R_ARM_COPY)
20 #define IS_PLT(x) ((x)==R_ARM_JUMP_SLOT)
21
22 static inline void do_single_reloc(
23         struct dso *self, unsigned char *base_addr,
24         size_t *reloc_addr, int type, size_t addend,
25         Sym *sym, size_t sym_size,
26         struct symdef def, size_t sym_val)
27 {
28         switch(type) {
29         case R_ARM_ABS32:
30                 *reloc_addr += sym_val;
31                 break;
32         case R_ARM_GLOB_DAT:
33         case R_ARM_JUMP_SLOT:
34                 *reloc_addr = sym_val;
35                 break;
36         case R_ARM_RELATIVE:
37                 *reloc_addr += (size_t)base_addr;
38                 break;
39         case R_ARM_COPY:
40                 memcpy(reloc_addr, (void *)sym_val, sym_size);
41                 break;
42         case R_ARM_TLS_DTPMOD32:
43                 *reloc_addr = def.dso ? def.dso->tls_id : self->tls_id;
44                 break;
45         case R_ARM_TLS_DTPOFF32:
46                 *reloc_addr += def.sym->st_value;
47                 break;
48         case R_ARM_TLS_TPOFF32:
49                 *reloc_addr += def.sym
50                         ? def.sym->st_value + def.dso->tls_offset + 8
51                         : self->tls_offset + 8;
52                 break;
53         }
54 }