Unified · Split
| @@ -46,6 +46,8 @@ int code_reloc (int reloc_type) · 45 unmodified lines | |||
| 46 | case R_ARM_GLOB_DAT: | 46 | case R_ARM_GLOB_DAT: |
| 47 | case R_ARM_NONE: | 47 | case R_ARM_NONE: |
| 48 | case R_ARM_TARGET1: | 48 | case R_ARM_TARGET1: |
| 49 | case R_ARM_MOVT_PREL: | ||
| 50 | case R_ARM_MOVW_PREL_NC: | ||
| 49 | return 0; | 51 | return 0; |
| 50 | 52 | ||
| 51 | case R_ARM_PC24: | 53 | case R_ARM_PC24: |
| @@ -89,6 +91,8 @@ int gotplt_entry_type (int reloc_type) · 37 unmodified lines | |||
| 89 | case R_ARM_REL32: | 91 | case R_ARM_REL32: |
| 90 | case R_ARM_V4BX: | 92 | case R_ARM_V4BX: |
| 91 | case R_ARM_TARGET1: | 93 | case R_ARM_TARGET1: |
| 94 | case R_ARM_MOVT_PREL: | ||
| 95 | case R_ARM_MOVW_PREL_NC: | ||
| 92 | return AUTO_GOTPLT_ENTRY; | 96 | return AUTO_GOTPLT_ENTRY; |
| 93 | 97 | ||
| 94 | case R_ARM_GOTPC: | 98 | case R_ARM_GOTPC: |
| @@ -332,6 +336,20 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t · 237 unmodified lines | |||
| 332 | *(int *)ptr += x; | 336 | *(int *)ptr += x; |
| 333 | } | 337 | } |
| 334 | return; | 338 | return; |
| 339 | case R_ARM_MOVT_PREL: | ||
| 340 | case R_ARM_MOVW_PREL_NC: | ||
| 341 | { | ||
| 342 | int insn = *(int *)ptr; | ||
| 343 | int addend = ((insn >> 4) & 0xf000) | (insn & 0xfff); | ||
| 344 | |||
| 345 | addend = (addend ^ 0x8000) - 0x8000; | ||
| 346 | val += addend - addr; | ||
| 347 | if (type == R_ARM_MOVT_PREL) | ||
| 348 | val >>= 16; | ||
| 349 | *(int *)ptr = (insn & 0xfff0f000) | | ||
| 350 | ((val & 0xf000) << 4) | (val & 0xfff); | ||
| 351 | } | ||
| 352 | return; | ||
| 335 | case R_ARM_THM_MOVT_ABS: | 353 | case R_ARM_THM_MOVT_ABS: |
| 336 | case R_ARM_THM_MOVW_ABS_NC: | 354 | case R_ARM_THM_MOVW_ABS_NC: |
| 337 | { | 355 | { |
| @@ -289,7 +289,7 @@ DLL_EXPORT char *__bound_strcat(char *dest, const char *src); · 288 unmodified lines | |||
| 289 | DLL_EXPORT char *__bound_strchr(const char *string, int ch); | 289 | DLL_EXPORT char *__bound_strchr(const char *string, int ch); |
| 290 | DLL_EXPORT char *__bound_strdup(const char *s); | 290 | DLL_EXPORT char *__bound_strdup(const char *s); |
| 291 | 291 | ||
| 292 | #if defined(__arm__) | 292 | #if defined(__arm__) && defined(TCC_ARM_EABI) |
| 293 | DLL_EXPORT void *__bound___aeabi_memcpy(void *dst, const void *src, size_t size); | 293 | DLL_EXPORT void *__bound___aeabi_memcpy(void *dst, const void *src, size_t size); |
| 294 | DLL_EXPORT void *__bound___aeabi_memmove(void *dst, const void *src, size_t size); | 294 | DLL_EXPORT void *__bound___aeabi_memmove(void *dst, const void *src, size_t size); |
| 295 | DLL_EXPORT void *__bound___aeabi_memmove4(void *dst, const void *src, size_t size); | 295 | DLL_EXPORT void *__bound___aeabi_memmove4(void *dst, const void *src, size_t size); |
| @@ -1738,7 +1738,7 @@ void *__bound_memset(void *s, int c, size_t n) · 1442 unmodified lines | |||
| 1738 | return memset(s, c, n); | 1738 | return memset(s, c, n); |
| 1739 | } | 1739 | } |
| 1740 | 1740 | ||
| 1741 | #if defined(__arm__) | 1741 | #if defined(__arm__) && defined(TCC_ARM_EABI) |
| 1742 | void *__bound___aeabi_memcpy(void *dest, const void *src, size_t n) | 1742 | void *__bound___aeabi_memcpy(void *dest, const void *src, size_t n) |
| 1743 | { | 1743 | { |
| 1744 | dprintf(stderr, "%s, %s(): %p, %p, 0x%lx\n", | 1744 | dprintf(stderr, "%s, %s(): %p, %p, 0x%lx\n", |
| @@ -1387,6 +1387,8 @@ ST_FUNC void tcc_add_btstub(TCCState *s1) · 1386 unmodified lines | |||
| 1387 | CString cstr; | 1387 | CString cstr; |
| 1388 | 1388 | ||
| 1389 | s = data_section; | 1389 | s = data_section; |
| 1390 | /* Align to PTR_SIZE */ | ||
| 1391 | section_ptr_add(s, -s->data_offset & (PTR_SIZE - 1)); | ||
| 1390 | o = s->data_offset; | 1392 | o = s->data_offset; |
| 1391 | /* create (part of) a struct rt_context (see tccrun.c) */ | 1393 | /* create (part of) a struct rt_context (see tccrun.c) */ |
| 1392 | put_ptr(s1, stab_section, 0); | 1394 | put_ptr(s1, stab_section, 0); |