diff options
Diffstat (limited to 'cpukit/libdl/rtl-mdreloc-aarch64.c')
-rw-r--r-- | cpukit/libdl/rtl-mdreloc-aarch64.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/cpukit/libdl/rtl-mdreloc-aarch64.c b/cpukit/libdl/rtl-mdreloc-aarch64.c index 46f87e9178..1eb1d1e87d 100644 --- a/cpukit/libdl/rtl-mdreloc-aarch64.c +++ b/cpukit/libdl/rtl-mdreloc-aarch64.c @@ -78,9 +78,11 @@ __RCSID("$NetBSD: mdreloc.c,v 1.14 2020/06/16 21:01:30 joerg Exp $"); #include "rtl-elf.h" #include "rtl-error.h" #include <rtems/rtl/rtl-trace.h> -#include "rtl-unwind-arm.h" #include <rtems/score/tls.h> +#include "rtl-unwind.h" +#include "rtl-unwind-dw2.h" + struct tls_data { size_t td_tlsindex; Elf_Addr td_tlsoffs; @@ -161,6 +163,12 @@ get_veneer_size(int type) return 16; } +uint32_t rtems_rtl_obj_tramp_alignment (const rtems_rtl_obj* obj) +{ + (void) obj; + return sizeof(uint64_t); +} + size_t rtems_rtl_elf_relocate_tramp_max_size (void) { @@ -309,11 +317,7 @@ rtems_rtl_elf_reloc_rela (rtems_rtl_obj* obj, } if (!parsing) { - target = (Elf_Addr)symvalue + rela->r_addend; - /* Calculate offset accounting for the DTV */ - target -= (uintptr_t)_TLS_Data_begin; - target += sizeof(TLS_Dynamic_thread_vector); - + target = (Elf_Addr)symvalue; target >>= shift; target &= WIDTHMASK(12); if (of_check && target >= of_check) { @@ -388,6 +392,7 @@ rtems_rtl_elf_reloc_rela (rtems_rtl_obj* obj, target -= (uintptr_t)where >> 12; if (checkoverflow(target, 21, raddr, " x 4k", where, off)) { + printf("]] %d\n", __LINE__); return rtems_rtl_elf_rel_failure; } @@ -418,6 +423,13 @@ rtems_rtl_elf_reloc_rela (rtems_rtl_obj* obj, return rtems_rtl_elf_rel_failure; } + if (rtems_rtl_trace (RTEMS_RTL_TRACE_RELOC)) + printf ( + "rtl: JUMP26/PC26/CALL: insn=%p where=%p target=%p raddr=%p parsing=%d\n", + insn, (void*) where, (void*)(uintptr_t) target, (void*)(uintptr_t) raddr, + parsing + ); + target = (intptr_t)target >> 2; if (((Elf_Sword)target > 0x1FFFFFF) || ((Elf_Sword)target < -0x2000000)) { @@ -437,9 +449,8 @@ rtems_rtl_elf_reloc_rela (rtems_rtl_obj* obj, return rtems_rtl_elf_rel_failure; } - tramp_addr = ((Elf_Addr)(uintptr_t)obj->tramp_brk) | (symvalue & 1); + tramp_addr = ((Elf_Addr)(uintptr_t) obj->tramp_brk) | (symvalue & 1); obj->tramp_brk = set_veneer(obj->tramp_brk, symvalue); - target = tramp_addr + rela->r_addend - (uintptr_t)where; target = (uintptr_t)target >> 2; } @@ -464,6 +475,7 @@ rtems_rtl_elf_reloc_rela (rtems_rtl_obj* obj, raddr = (Elf_Addr)symvalue + rela->r_addend; target = raddr - (uintptr_t)where; if (checkoverflow(target, 32, raddr, "", where, off)) { + printf("]] %d\n", __LINE__); return rtems_rtl_elf_rel_failure; } *where32 = target; @@ -561,3 +573,20 @@ rtems_rtl_elf_relocate_rel (rtems_rtl_obj* obj, rtems_rtl_set_error (EINVAL, "rela type record not supported"); return rtems_rtl_elf_rel_failure; } + +bool +rtems_rtl_elf_unwind_parse (const rtems_rtl_obj* obj, + const char* name, + uint32_t flags) { + return rtems_rtl_elf_unwind_dw2_parse (obj, name, flags); +} + +bool +rtems_rtl_elf_unwind_register (rtems_rtl_obj* obj) { + return rtems_rtl_elf_unwind_dw2_register (obj); +} + +bool +rtems_rtl_elf_unwind_deregister (rtems_rtl_obj* obj) { + return rtems_rtl_elf_unwind_dw2_deregister (obj); +} |