Add support uClibc++ excpetions. This involves additional handling for relative relation types, additional support for unwinding, as well as additional changes. The culmination of a big effort fromo Leo Aloe3132
This commit is contained in:
parent
73419e77f4
commit
280e2ee385
@ -106,6 +106,13 @@ config ARMV7M_OABI_TOOLCHAIN
|
|||||||
Most of the older buildroot toolchains are OABI and are named
|
Most of the older buildroot toolchains are OABI and are named
|
||||||
arm-nuttx-elf- vs. arm-nuttx-eabi-
|
arm-nuttx-elf- vs. arm-nuttx-eabi-
|
||||||
|
|
||||||
|
config ARMV7M_TARGET2_PREL
|
||||||
|
bool "R_ARM_TARGET2 is PC relative"
|
||||||
|
default n
|
||||||
|
depends on ELF
|
||||||
|
---help---
|
||||||
|
Perform a PC relative relocation for relocation type R_ARM_TARGET2
|
||||||
|
|
||||||
config ARMV7M_HAVE_STACKCHECK
|
config ARMV7M_HAVE_STACKCHECK
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
@ -48,6 +48,8 @@
|
|||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/binfmt/elf.h>
|
#include <nuttx/binfmt/elf.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ELF
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -60,6 +62,14 @@
|
|||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_UCLIBCXX_EXCEPTION
|
||||||
|
extern void init_unwind_exidx(Elf32_Addr start, Elf32_Addr end);
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -204,6 +214,18 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARMV7M_TARGET2_PREL
|
||||||
|
case R_ARM_TARGET2: /* TARGET2 is a platform-specific relocation: gcc-arm-none-eabi
|
||||||
|
* performs a self relocation */
|
||||||
|
{
|
||||||
|
bvdbg("Performing TARGET2 link at addr=%08lx [%08lx] to sym=%p st_value=%08lx\n",
|
||||||
|
(long)addr, (long)(*(uint32_t*)addr), sym, (long)sym->st_value);
|
||||||
|
|
||||||
|
*(uint32_t*)addr += sym->st_value - addr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case R_ARM_THM_CALL:
|
case R_ARM_THM_CALL:
|
||||||
case R_ARM_THM_JUMP24:
|
case R_ARM_THM_JUMP24:
|
||||||
{
|
{
|
||||||
@ -464,3 +486,14 @@ int up_relocateadd(FAR const Elf32_Rela *rel, FAR const Elf32_Sym *sym,
|
|||||||
bdbg("RELA relocation not supported\n");
|
bdbg("RELA relocation not supported\n");
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_UCLIBCXX_EXCEPTION
|
||||||
|
int up_init_exidx(Elf32_Addr address, Elf32_Word size)
|
||||||
|
{
|
||||||
|
init_unwind_exidx(address, size);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_ELF */
|
||||||
|
Loading…
Reference in New Issue
Block a user