diff --git a/arch/arm/src/cmake/elf.cmake b/arch/arm/src/cmake/elf.cmake index 2a0b3f61ccb..465f442ae3f 100644 --- a/arch/arm/src/cmake/elf.cmake +++ b/arch/arm/src/cmake/elf.cmake @@ -56,14 +56,17 @@ if(CONFIG_FDPIC) "${FDPIC_LD}" CACHE INTERNAL "Linker for FDPIC modules") - nuttx_elf_compile_options(-mfdpic -fPIC -Wa,--noexecstack) + # GCC before 14 does not pass --fdpic to the assembler for -mfdpic, and the + # assembler then rejects the FDPIC relocations, so pass it here. + + nuttx_elf_compile_options(-mfdpic -fPIC -Wa,--noexecstack -Wa,--fdpic) nuttx_elf_link_options(-m armelf_linux_fdpiceabi -shared -z now) # A shared library is an FDPIC shared object too, as LDMODULEFLAGS makes it in # common/Toolchain.defs - nuttx_mod_compile_options(-mfdpic -fPIC -Wa,--noexecstack) + nuttx_mod_compile_options(-mfdpic -fPIC -Wa,--noexecstack -Wa,--fdpic) nuttx_mod_link_options(-m armelf_linux_fdpiceabi -shared -z now) diff --git a/arch/arm/src/common/Toolchain.defs b/arch/arm/src/common/Toolchain.defs index 6325df91cb7..d681cd17278 100644 --- a/arch/arm/src/common/Toolchain.defs +++ b/arch/arm/src/common/Toolchain.defs @@ -684,8 +684,11 @@ ifeq ($(CONFIG_FDPIC),y) MODULELD = $(SHELL) -c 'echo "ERROR: $(FDPIC_NO_LD_MSG)" 1>&2; exit 1' -- endif - CELFFLAGS += -mfdpic -fPIC -Wa,--noexecstack - CXXELFFLAGS += -mfdpic -fPIC -Wa,--noexecstack + # GCC before 14 does not pass --fdpic to the assembler for -mfdpic, and the + # assembler then rejects the FDPIC relocations, so pass it here. + + CELFFLAGS += -mfdpic -fPIC -Wa,--noexecstack -Wa,--fdpic + CXXELFFLAGS += -mfdpic -fPIC -Wa,--noexecstack -Wa,--fdpic LDELFFLAGS += -m armelf_linux_fdpiceabi -shared -z now @@ -697,8 +700,8 @@ ifeq ($(CONFIG_FDPIC),y) # The entry point is left to the caller: a module is entered at _start, # a library is only called into. - CMODULEFLAGS += -mfdpic -fPIC -Wa,--noexecstack - CXXMODULEFLAGS += -mfdpic -fPIC -Wa,--noexecstack + CMODULEFLAGS += -mfdpic -fPIC -Wa,--noexecstack -Wa,--fdpic + CXXMODULEFLAGS += -mfdpic -fPIC -Wa,--noexecstack -Wa,--fdpic LDMODULEFLAGS = -m armelf_linux_fdpiceabi -shared -z now \ -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)