From 6e7a3d52201a3b624265a3d843d85cd6e025c7b8 Mon Sep 17 00:00:00 2001 From: Abhishek Akkabathula Date: Mon, 19 Feb 2024 17:45:33 +0530 Subject: [PATCH] apps/platform, os/binfmt: add exceptions support in loadable Add support for cpp exceptions in loadable for RTL8730E and RTL8721CSM. Signed-off-by: Abhishek Akkabathula --- apps/platform/gnu/Make.defs | 4 ++ apps/platform/gnu/gnu_unwind_find_exidx.c | 50 +++++++++++++++++++ build/configs/rtl8721csm/Make.defs | 12 ++++- .../configs/rtl8721csm/cpp_loadable/defconfig | 45 +++++++++++++---- build/configs/rtl8730e/Make.defs | 12 ++++- .../configs/rtl8730e/loadable_apps/defconfig | 12 ++++- lib/libc/machine/arm/armv7-a/arch_elf.c | 13 ++++- lib/libc/machine/arm/armv7-m/arch_elf.c | 2 +- loadable_apps/loadable.mk | 18 +++++-- os/Makefile.unix | 2 +- os/arch/arm/src/armv7-a/Kconfig | 6 +++ os/binfmt/libelf/Kconfig | 2 +- os/binfmt/libelf/libelf_load.c | 6 +-- os/include/tinyara/elf.h | 20 -------- os/include/wctype.h | 8 +++ os/userspace/userspace_apps.ld | 12 +++++ 16 files changed, 175 insertions(+), 49 deletions(-) create mode 100644 apps/platform/gnu/gnu_unwind_find_exidx.c diff --git a/apps/platform/gnu/Make.defs b/apps/platform/gnu/Make.defs index b9b4ba1c5f..ef7980715e 100644 --- a/apps/platform/gnu/Make.defs +++ b/apps/platform/gnu/Make.defs @@ -56,6 +56,10 @@ ifeq ($(CONFIG_HAVE_CXXINITIALIZE),y) CSRCS += gnu_cxxinitialize.c endif +ifeq ($(CONFIG_LIBCXX_EXCEPTION),y) +CSRCS += gnu_unwind_find_exidx.c +endif + # Add the gnu/ sub-directory to the build VPATH += :gnu diff --git a/apps/platform/gnu/gnu_unwind_find_exidx.c b/apps/platform/gnu/gnu_unwind_find_exidx.c new file mode 100644 index 0000000000..14b237611a --- /dev/null +++ b/apps/platform/gnu/gnu_unwind_find_exidx.c @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * Copyright 2024 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +extern void *__exidx_start; +extern void *__exidx_end; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: __gnu_Unwind_Find_exidx + * + * Description: + * This function is called (if exists) by the gcc generated unwind + * run-time in order to retrieve an alternative .ARM.exidx Exception + * index section. + * + ****************************************************************************/ + +volatile _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr return_address, int *nrecp) +{ + *nrecp = &__exidx_end - &__exidx_start; + return (_Unwind_Ptr)&__exidx_start; +} diff --git a/build/configs/rtl8721csm/Make.defs b/build/configs/rtl8721csm/Make.defs index 487dd9c9d5..3122cd6102 100644 --- a/build/configs/rtl8721csm/Make.defs +++ b/build/configs/rtl8721csm/Make.defs @@ -170,7 +170,7 @@ else ifeq ($(CONFIG_CXX_VERSION_14),y) else CXXFLAGS += -std=c++11 endif - CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__ + CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__ -DCONFIG_WCHAR_BUILTIN endif ifeq ($(CONFIG_EXTERNAL_TFMICRO),y) @@ -249,7 +249,8 @@ ifeq ($(CONFIG_APP_BINARY_SEPARATION),y) CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs -LDELFFLAGS = -r -e main +LDELFFLAGS = -r +LDELFENTRY = -e main ifeq ($(WINTOOL),y) LDELFFLAGS += -T "${shell cygpath -w $(TOPDIR)/userspace/userspace_apps.ld}" @@ -258,6 +259,13 @@ else endif endif +ifeq ($(CONFIG_LIBCXX_EXCEPTION),y) +#this symbol __gnu_Unwind_Find_exidx should be present in all the cpp binaries (apps, common) +#as it is used to decide which exception table. Also, --force-group-allocation flag is required +#to not generate additional sections with group flag, as we dont support loading such sections. +LDELFFLAGS += --require-defined __gnu_Unwind_Find_exidx --force-group-allocation +endif + LDFLAGS += --gc-sections LDFLAGS += --defsym=CONFIG_IDLETHREAD_STACKSIZE=$(CONFIG_IDLETHREAD_STACKSIZE) diff --git a/build/configs/rtl8721csm/cpp_loadable/defconfig b/build/configs/rtl8721csm/cpp_loadable/defconfig index 98c0a1c92a..0d37205143 100644 --- a/build/configs/rtl8721csm/cpp_loadable/defconfig +++ b/build/configs/rtl8721csm/cpp_loadable/defconfig @@ -65,13 +65,20 @@ CONFIG_ARCH="arm" # CONFIG_ARCH_CHIP_LM is not set # CONFIG_ARCH_CHIP_S5J is not set # CONFIG_ARCH_CHIP_BCM4390X is not set +# CONFIG_ARCH_CHIP_IMX6 is not set # CONFIG_ARCH_CHIP_STM32 is not set # CONFIG_ARCH_CHIP_IMXRT is not set # CONFIG_ARCH_CHIP_STM32L4 is not set CONFIG_ARCH_CHIP_AMEBAD=y # CONFIG_ARCH_CHIP_STM32H745 is not set # CONFIG_ARCH_CHIP_AMEBALITE is not set +# CONFIG_ARCH_CHIP_AMEBASMART is not set CONFIG_ARCH_CHIP="amebad" +# CONFIG_ARM_THUMB is not set +# CONFIG_ARM_HAVE_DPFPU32 is not set +# CONFIG_ARM_HAVE_NEON is not set +# CONFIG_ARM_FPU_ABI_SOFT is not set +# CONFIG_ARM_HAVE_MPCORE is not set # # ARM Options @@ -81,10 +88,13 @@ CONFIG_ARCH_CHIP="amebad" # CONFIG_ARCH_CORTEXM7 is not set CONFIG_ARCH_CORTEXM33=y # CONFIG_ARCH_CORTEXM55 is not set +# CONFIG_ARCH_CORTEXA9 is not set # CONFIG_ARCH_CORTEXR4 is not set +# CONFIG_ARCH_CORTEXA32 is not set # CONFIG_ARCH_ARMV7M_FAMILY is not set CONFIG_ARCH_ARMV8M_FAMILY=y # CONFIG_ARCH_ARMV7R_FAMILY is not set +# CONFIG_ARCH_ARMV7A_FAMILY is not set CONFIG_ARCH_FAMILY="armv8-m" CONFIG_ARCH_HAVE_CMNVECTOR=y CONFIG_ARM_CMNVECTOR=y @@ -124,7 +134,7 @@ CONFIG_ARMV8M_DCACHE=y # CONFIG_ARMV8M_TOOLCHAIN_CODESOURCERYL is not set CONFIG_ARMV8M_TOOLCHAIN_GNU_EABIL=y # CONFIG_ARMV8M_TOOLCHAIN_CLANGL is not set -# CONFIG_ARMV8M_TARGET2_PREL is not set +CONFIG_ARMV8M_TARGET2_PREL=y # CONFIG_ARMV8M_HAVE_STACKCHECK is not set # CONFIG_ARMV8M_ITMSYSLOG is not set @@ -146,11 +156,7 @@ CONFIG_RTL8721D_UART2=y CONFIG_AMEBAD_I2CTIMEOSEC=0 CONFIG_AMEBAD_I2CTIMEOMS=500 CONFIG_AMEBAD_I2CTIMEOTICKS=500 -CONFIG_RTL8721D_SPI=y -CONFIG_SPI1_MASTER=y -# CONFIG_CONFIG_SPI_CS is not set -CONFIG_CONFIG_SPI_EXCHANGE=y -CONFIG_CONFIG_SPI_CMDDATA=y +# CONFIG_AMEBAD_SPI is not set # # Realtek RTL8721D WIFI Support @@ -168,6 +174,11 @@ CONFIG_AMEBAD_WIFI=y CONFIG_AMEBAD_TRUSTZONE=y # CONFIG_AMEBAD_RDP is not set +# +# Realtek RTL8721D CMSIS_NN Support +# +# CONFIG_AMEBAD_CMSIS_NN is not set + # # Architecture Options # @@ -179,6 +190,8 @@ CONFIG_ARCH_HAVE_IRQPRIO=y # CONFIG_ARCH_HAVE_COHERENT_DCACHE is not set # CONFIG_ARCH_HAVE_ADDRENV is not set # CONFIG_ARCH_NEED_ADDRENV_MAPPING is not set +# CONFIG_ARCH_HAVE_MULTICPU is not set +# CONFIG_ARCH_HAVE_TESTSET is not set CONFIG_ARCH_HAVE_VFORK=y # CONFIG_ARCH_HAVE_MMU is not set CONFIG_ARCH_HAVE_MPU=y @@ -186,9 +199,12 @@ CONFIG_ARCH_HAVE_MPU=y # CONFIG_ARCH_HAVE_EXTCLK is not set # CONFIG_ARCH_HAVE_POWEROFF is not set CONFIG_ARCH_HAVE_RESET=y +# CONFIG_ARCH_HAVE_FETCHADD is not set CONFIG_ARCH_USE_MPU=y CONFIG_ARCH_IRQPRIO=y +# CONFIG_ARCH_TASKDUMP is not set CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_STACKDUMP_MAX_LENGTH=0 # CONFIG_ENDIAN_BIG is not set # CONFIG_ARCH_IDLE_CUSTOM is not set # CONFIG_ARCH_HAVE_RAMFUNCS is not set @@ -225,6 +241,8 @@ CONFIG_BOOT_RUNFROMFLASH=y # # Boot Memory Configuration # +CONFIG_RAM_START=0x0 +CONFIG_RAM_SIZE=0 CONFIG_RAM_KREGIONx_START="0x10005000,0x02000000,0x02100000" CONFIG_RAM_KREGIONx_SIZE="466944,1048576,2859008," CONFIG_RAM_KREGIONx_HEAP_INDEX="0,0,1," @@ -285,6 +303,7 @@ CONFIG_FLASH_PART_NAME="bl1,bl2,reserved,ss,system_data,kernel,kernel,common,com # CONFIG_ARCH_BOARD_HAVE_SECOND_FLASH is not set CONFIG_AUTOMOUNT=y CONFIG_AUTOMOUNT_USERFS=y +# CONFIG_BOARD_USBDEV_SERIALSTR is not set # # SE Selection @@ -339,7 +358,10 @@ CONFIG_PREALLOC_TIMERS=8 # # Tasks and Scheduling # +# CONFIG_SPINLOCK is not set CONFIG_INIT_ENTRYPOINT=y +# CONFIG_IRQCOUNT is not set +# CONFIG_SCHED_RESUMESCHEDULER is not set CONFIG_RR_INTERVAL=10 CONFIG_TASK_NAME_SIZE=31 CONFIG_MAX_TASKS=32 @@ -977,9 +999,9 @@ CONFIG_MTD_SMART_JOURNALING=y # CONFIG_ARASTORAGE is not set # -# Light Weight AI Framework +# AI Framework # -# CONFIG_LW_AIFW is not set +# CONFIG_AIFW is not set # # AraUI Framework @@ -1181,7 +1203,7 @@ CONFIG_CXX_VERSION_11=y # LLVM C++ Library (libcxx) # CONFIG_LIBCXX=y -# CONFIG_LIBCXX_EXCEPTION is not set +CONFIG_LIBCXX_EXCEPTION=y CONFIG_LIBCXX_IOSTREAM_BUFSIZE=32 CONFIG_LIBCXX_HAVE_LIBSUPCXX=y @@ -1225,6 +1247,7 @@ CONFIG_ELF_ALIGN_LOG2=2 CONFIG_ELF_STACKSIZE=2048 CONFIG_ELF_BUFFERSIZE=32 CONFIG_ELF_BUFFERINCR=32 +CONFIG_ELF_EXIDX_SECTNAME=".ARM.exidx" CONFIG_ELF_EXCLUDE_SYMBOLS=y CONFIG_ELF_CACHE_READ=y CONFIG_ELF_CACHE_BLOCK_SIZE=2048 @@ -1268,6 +1291,7 @@ CONFIG_BUILTIN_APPS=y # # Board Specific Demos # +# CONFIG_EXAMPLES_AMEBA_MIPI is not set # CONFIG_EXAMPLES_SSTORAGE is not set # CONFIG_EXAMPLES_SECURE_WORLD is not set # CONFIG_EXAMPLES_WIFICSI is not set @@ -1301,8 +1325,8 @@ CONFIG_EXAMPLES_HELLOXX=y # # CONFIG_EXAMPLES_LIBTUV is not set # CONFIG_EXAMPLES_LWNL_SAMPLE is not set -# CONFIG_EXAMPLES_MEMORY_FRAGMENTATION_TEST is not set CONFIG_EXAMPLES_MEM_PROTECT_TEST=y +# CONFIG_EXAMPLES_MEMORY_FRAGMENTATION_TEST is not set # CONFIG_EXAMPLES_NETTEST is not set # @@ -1462,7 +1486,6 @@ CONFIG_EXAMPLES_WIFIMANAGER_AP_LIST_ITEMS_COUNT=10 # Platform-specific Support # # CONFIG_PLATFORM_CONFIGDATA is not set -# CONFIG_HAVE_CXXINITIALIZE is not set # # Shell diff --git a/build/configs/rtl8730e/Make.defs b/build/configs/rtl8730e/Make.defs index ab6f4823d4..06bfc6f301 100755 --- a/build/configs/rtl8730e/Make.defs +++ b/build/configs/rtl8730e/Make.defs @@ -168,7 +168,7 @@ else ifeq ($(CONFIG_CXX_VERSION_14),y) else CXXFLAGS += -std=c++11 endif - CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__ + CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__ -DCONFIG_WCHAR_BUILTIN endif ifeq ($(CONFIG_LIBCXX_EXCEPTION),y) @@ -241,7 +241,8 @@ ifeq ($(CONFIG_APP_BINARY_SEPARATION),y) CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs -LDELFFLAGS = -r -e main +LDELFFLAGS = -r +LDELFENTRY = -e main ifeq ($(WINTOOL),y) LDELFFLAGS += -T "${shell cygpath -w $(TOPDIR)/userspace/userspace_apps.ld}" @@ -250,6 +251,13 @@ else endif endif +ifeq ($(CONFIG_LIBCXX_EXCEPTION),y) +#this symbol __gnu_Unwind_Find_exidx should be present in all the cpp binaries (apps, common) +#as it is used to decide which exception table. Also, --force-group-allocation flag is required +#to not generate additional sections with group flag, as we dont support loading such sections. +LDELFFLAGS += --require-defined __gnu_Unwind_Find_exidx --force-group-allocation +endif + LDFLAGS += --gc-sections LDFLAGS += --defsym=CONFIG_IDLETHREAD_STACKSIZE=$(CONFIG_IDLETHREAD_STACKSIZE) diff --git a/build/configs/rtl8730e/loadable_apps/defconfig b/build/configs/rtl8730e/loadable_apps/defconfig index 40bc5c174b..b72886bd6e 100644 --- a/build/configs/rtl8730e/loadable_apps/defconfig +++ b/build/configs/rtl8730e/loadable_apps/defconfig @@ -140,6 +140,7 @@ CONFIG_ARMV7A_WAYSIZE_16KB=y # CONFIG_ARMV7A_TOOLCHAIN_BUILDROOT is not set CONFIG_ARMV7A_TOOLCHAIN_GNU_EABI=y # CONFIG_ARMV7A_TOOLCHAIN_GNU_OABI is not set +# CONFIG_ARMV7A_TARGET2_PREL is not set # CONFIG_ARMV7A_DECODEFIQ is not set # @@ -161,6 +162,7 @@ CONFIG_AMEBASMART_SPI=y CONFIG_AMEBASMART_SPI0=y CONFIG_AMEBASMART_SPI1=y CONFIG_AMEBASMART_SPI_EXCHANGE=y +# CONFIG_SPI_CS is not set # CONFIG_AMEBASMART_MIPI is not set # CONFIG_AMEBASMART_I2C is not set # CONFIG_AMEBASMART_I2S is not set @@ -216,6 +218,7 @@ CONFIG_ARCH_STACKDUMP=y CONFIG_ARCH_STACKDUMP_MAX_LENGTH=0 # CONFIG_ENDIAN_BIG is not set # CONFIG_ARCH_IDLE_CUSTOM is not set +# CONFIG_ARCH_CUSTOM_PMINIT is not set # CONFIG_ARCH_HAVE_RAMFUNCS is not set # CONFIG_ARCH_HAVE_RAMVECTORS is not set # CONFIG_SUPPRESS_INTERRUPTS is not set @@ -968,6 +971,7 @@ CONFIG_FS_AUTOMOUNT_PROCFS=y # CONFIG_FS_PROCFS_EXCLUDE_MTD is not set # CONFIG_FS_PROCFS_EXCLUDE_PARTITIONS is not set # CONFIG_FS_PROCFS_EXCLUDE_SMARTFS is not set +# CONFIG_FS_PROCFS_EXCLUDE_POWER is not set # CONFIG_FS_ROMFS is not set # CONFIG_FS_TMPFS is not set @@ -1082,7 +1086,7 @@ CONFIG_PM_DEVNAME_LEN=32 CONFIG_PM_SLICEMS=100 CONFIG_PM_NDOMAINS=1 CONFIG_PM_MEMORY=2 -# CONFIG_PM_DVFS is not set +CONFIG_PM_DVFS=y CONFIG_PM_COEFN=1 CONFIG_PM_COEF1=1 CONFIG_PM_COEF2=1 @@ -1123,6 +1127,7 @@ CONFIG_DEBUG_FS_ERROR=y CONFIG_DEBUG_BLE=y CONFIG_DEBUG_BLE_ERROR=y CONFIG_DEBUG_PM=y +# CONFIG_DEBUG_PM_ERROR is not set # CONFIG_DEBUG_SCHED is not set # CONFIG_DEBUG_SYSCALL is not set # CONFIG_DEBUG_TASH is not set @@ -1260,7 +1265,7 @@ CONFIG_CXX_NEWLONG=y # LLVM C++ Library (libcxx) # CONFIG_LIBCXX=y -# CONFIG_LIBCXX_EXCEPTION is not set +CONFIG_LIBCXX_EXCEPTION=y CONFIG_LIBCXX_IOSTREAM_BUFSIZE=32 CONFIG_LIBCXX_HAVE_LIBSUPCXX=y @@ -1319,6 +1324,7 @@ CONFIG_ELF_ALIGN_LOG2=2 CONFIG_ELF_STACKSIZE=8192 CONFIG_ELF_BUFFERSIZE=32 CONFIG_ELF_BUFFERINCR=32 +CONFIG_ELF_EXIDX_SECTNAME=".ARM.exidx" CONFIG_ELF_EXCLUDE_SYMBOLS=y CONFIG_ELF_CACHE_READ=y CONFIG_ELF_CACHE_BLOCK_SIZE=2048 @@ -1387,6 +1393,7 @@ CONFIG_EXAMPLES_HELLO=y # CONFIG_EXAMPLES_IOTJS_STARTUP is not set # CONFIG_EXAMPLES_KERNEL_SAMPLE is not set # CONFIG_EXAMPLES_KERNEL_UPDATE is not set +# CONFIG_EXAMPLES_LCD is not set # # Libcoap @@ -1407,6 +1414,7 @@ CONFIG_EXAMPLES_HELLO=y # CONFIG_EXAMPLES_TLS_BENCHMARK is not set # CONFIG_EXAMPLES_TLS_HANDSHAKE is not set # CONFIG_EXAMPLES_TLS_SECLINK is not set +# CONFIG_EXAMPLES_POWER is not set # # Protocol Buffer diff --git a/lib/libc/machine/arm/armv7-a/arch_elf.c b/lib/libc/machine/arm/armv7-a/arch_elf.c index e072e42bdc..dcaf0115ac 100644 --- a/lib/libc/machine/arm/armv7-a/arch_elf.c +++ b/lib/libc/machine/arm/armv7-a/arch_elf.c @@ -352,6 +352,17 @@ int up_relocate(const Elf32_Rel *rel, const Elf32_Sym *sym, uintptr_t addr) } break; +#if defined(CONFIG_ARMV7A_TARGET2_PREL) + case R_ARM_TARGET2: /* TARGET2 is a platform-specific relocation: gcc-arm-none-eabi + * performs a self relocation */ + { + binfo("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_JUMP24: { @@ -483,7 +494,7 @@ int up_relocate(const Elf32_Rel *rel, const Elf32_Sym *sym, uintptr_t addr) #endif /* CONFIG_ARM_THUMB */ default: - berr("ERROR: Unsupported relocation: %\n", + berr("ERROR: Unsupported relocation: %d\n", ELF32_R_TYPE(rel->r_info)); return -EINVAL; } diff --git a/lib/libc/machine/arm/armv7-m/arch_elf.c b/lib/libc/machine/arm/armv7-m/arch_elf.c index c006ac1ce1..d70c710229 100644 --- a/lib/libc/machine/arm/armv7-m/arch_elf.c +++ b/lib/libc/machine/arm/armv7-m/arch_elf.c @@ -193,7 +193,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym, uintptr_t ad } break; -#ifdef CONFIG_ARMV7M_TARGET2_PREL +#if defined(CONFIG_ARMV7M_TARGET2_PREL) || defined(CONFIG_ARMV8M_TARGET2_PREL) case R_ARM_TARGET2: /* TARGET2 is a platform-specific relocation: gcc-arm-none-eabi * performs a self relocation */ { diff --git a/loadable_apps/loadable.mk b/loadable_apps/loadable.mk index ccd25eefa1..e3172a5013 100644 --- a/loadable_apps/loadable.mk +++ b/loadable_apps/loadable.mk @@ -35,7 +35,14 @@ APPDEFINE = ${shell $(TOPDIR)/tools/define.sh "$(CC)" __APP_BUILD__} SRCS += $(USERSPACE).c +ifeq ($(CONFIG_LIBCXX_EXCEPTION),y) +ifeq ($(CONFIG_SUPPORT_COMMON_BINARY),y) +SRCS += $(TOPDIR)/../apps/platform/gnu/gnu_unwind_find_exidx.c +endif +endif + OBJS = $(SRCS:.c=$(OBJEXT)) +CPPOBJS = $(patsubst %.cpp,%$(OBJEXT),$(filter %.cpp,$(CXXSRCS))) prebuild: $(call DELFILE, $(USERSPACE)$(OBJEXT)) @@ -47,13 +54,16 @@ $(OBJS): %$(OBJEXT): %.c @echo "CC: $<" $(Q) $(CC) $(APPDEFINE) -c $(CELFFLAGS) $< -o $@ -$(BIN): $(OBJS) +$(CPPOBJS): %$(OBJEXT): %.cpp + $(call COMPILEXX, $<, $@) + +$(BIN): $(OBJS) $(CPPOBJS) @echo "LD: $<" ifeq ($(CONFIG_SUPPORT_COMMON_BINARY),y) - $(Q) $(LD) $(LDELFFLAGS) -o $@ $(ARCHCRT0OBJ) $^ --start-group $(LIBGCC) --end-group - $(Q) $(NM) -u $(BIN) | awk -F"U " '{print "--require-defined "$$2}' >> $(USER_BIN_DIR)/lib_symbols.txt + $(Q) $(LD) $(LDELFENTRY) $(LDELFFLAGS) -o $@ $(ARCHCRT0OBJ) $^ --start-group $(LIBGCC) $(LIBSUPXX) --end-group + $(Q) $(NM) -u $(BIN) | awk -F"[Uw] " '{print "--require-defined "$$2}' >> $(USER_BIN_DIR)/lib_symbols.txt else - $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $@ $(ARCHCRT0OBJ) $^ --start-group $(LDLIBS) $(LIBSUPXX) --end-group + $(Q) $(LD) $(LDELFENTRY) $(LDELFFLAGS) $(LDLIBPATH) -o $@ $(ARCHCRT0OBJ) $^ --start-group $(LIBSUPXX) $(LDLIBS) --end-group endif clean: diff --git a/os/Makefile.unix b/os/Makefile.unix index 755505411b..affc689009 100644 --- a/os/Makefile.unix +++ b/os/Makefile.unix @@ -450,7 +450,7 @@ pass1: pass1deps ifeq ($(CONFIG_BUILD_2PASS),y) $(Q) $(MAKE) -C $(LOADABLE_APPDIR) TOPDIR="$(TOPDIR)" LOADABLEDIR="${LOADABLE_APPDIR}" LIBRARIES_DIR="$(LIBRARIES_DIR)" USERLIBS="$(USERLIBS)" all KERNEL=n ifeq ($(CONFIG_SUPPORT_COMMON_BINARY),y) - $(Q) $(LD) -r -o $(OUTBIN_DIR)/$(CONFIG_COMMON_BINARY_NAME) -T $(TOPDIR)/userspace/userspace_apps.ld -L $(LIBRARIES_DIR) --start-group $(USERLIBS) $(LIBGCC) $(LIBSUPXX) --end-group $$(cat $(OUTBIN_DIR)/lib_symbols.txt) + $(Q) $(LD) $(LDELFFLAGS) -o $(OUTBIN_DIR)/$(CONFIG_COMMON_BINARY_NAME) -L $(LIBRARIES_DIR) --start-group $(USERLIBS) $(LIBGCC) $(LIBSUPXX) --end-group $$(cat $(OUTBIN_DIR)/lib_symbols.txt) endif endif diff --git a/os/arch/arm/src/armv7-a/Kconfig b/os/arch/arm/src/armv7-a/Kconfig index 40eedb3887..8ddf567a03 100644 --- a/os/arch/arm/src/armv7-a/Kconfig +++ b/os/arch/arm/src/armv7-a/Kconfig @@ -153,6 +153,12 @@ config ARMV7A_TOOLCHAIN_GNU_OABI endchoice # Toolchain Selection +config ARMV7A_TARGET2_PREL + bool "R_ARM_TARGET2 is PC relative" + depends on ELF + ---help--- + Perform a PC relative relocation for relocation type R_ARM_TARGET2 + config ARMV7A_OABI_TOOLCHAIN bool "OABI (vs EABI)" default n diff --git a/os/binfmt/libelf/Kconfig b/os/binfmt/libelf/Kconfig index fac9304f60..329c016e98 100644 --- a/os/binfmt/libelf/Kconfig +++ b/os/binfmt/libelf/Kconfig @@ -42,7 +42,7 @@ config ELF_DUMPBUFFER config ELF_EXIDX_SECTNAME string "ELF Section Name for Exception Index" default ".ARM.exidx" - depends on CXX_EXCEPTION + depends on LIBCXX_EXCEPTION ---help--- Set the name string for the exception index section on the ELF modules to be loaded by the ELF binary loader. diff --git a/os/binfmt/libelf/libelf_load.c b/os/binfmt/libelf/libelf_load.c index b989aff4e4..eb926d11c8 100644 --- a/os/binfmt/libelf/libelf_load.c +++ b/os/binfmt/libelf/libelf_load.c @@ -272,7 +272,7 @@ static inline int elf_loadfile(FAR struct elf_loadinfo_s *loadinfo) int elf_load(FAR struct elf_loadinfo_s *loadinfo) { -#ifdef CONFIG_CXX_EXCEPTION +#ifdef CONFIG_LIBCXX_EXCEPTION int exidx; #endif int ret; @@ -324,12 +324,10 @@ int elf_load(FAR struct elf_loadinfo_s *loadinfo) } #endif -#ifdef CONFIG_CXX_EXCEPTION +#ifdef CONFIG_LIBCXX_EXCEPTION exidx = elf_findsection(loadinfo, CONFIG_ELF_EXIDX_SECTNAME); if (exidx < 0) { binfo("elf_findsection: Exception Index section not found: %d\n", exidx); - } else { - up_init_exidx(loadinfo->shdr[exidx].sh_addr, loadinfo->shdr[exidx].sh_size); } #endif diff --git a/os/include/tinyara/elf.h b/os/include/tinyara/elf.h index bf9c0346f7..32a54dc134 100644 --- a/os/include/tinyara/elf.h +++ b/os/include/tinyara/elf.h @@ -110,24 +110,4 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym, uintptr_t ad int up_relocateadd(FAR const Elf32_Rela *rel, FAR const Elf32_Sym *sym, uintptr_t addr); #endif -/**************************************************************************** - * Name: up_init_exidx - * - * Description: - * Initialize the exception index section. - * - * Input Parameters: - * address - The exception index section address. - * size - The exception index section size. - * - * Returned Value: - * Zero (OK) if the initialization was successful. Otherwise, a negated errno - * value indicating the cause of the failure. - * - ****************************************************************************/ - -#ifdef CONFIG_CXX_EXCEPTION -int up_init_exidx(Elf32_Addr address, Elf32_Word size); -#endif - #endif /* __INCLUDE_TINYARA_ELF_H */ diff --git a/os/include/wctype.h b/os/include/wctype.h index ab4ab4a336..a8b06e14c4 100644 --- a/os/include/wctype.h +++ b/os/include/wctype.h @@ -92,6 +92,11 @@ * character mappings. */ +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" { +#endif + typedef int wctrans_t; /**************************************************************************** @@ -124,4 +129,7 @@ wint_t towupper(wint_t); wctrans_t wctrans(FAR const char *); wctype_t wctype(FAR const char *); +#if defined(__cplusplus) +} +#endif #endif /* INCLUDE_WTYPE_H */ diff --git a/os/userspace/userspace_apps.ld b/os/userspace/userspace_apps.ld index 5c76b05a8c..efa9949fce 100644 --- a/os/userspace/userspace_apps.ld +++ b/os/userspace/userspace_apps.ld @@ -128,6 +128,18 @@ SECTIONS _edtors = . ; } + .ARM.extab : + { + *(.ARM.extab*) + } + + .ARM.exidx : + { + __exidx_start = . ; + *(.ARM.exidx*) + __exidx_end = . ; + } + .bss : { _sbss = . ;