Hello everybody,
CONFIG_EXAMPLES_MODULE and or CONFIG_EXAMPLES_ELF is enabled then
build fails (i.e. for tools/configure.sh lx_cpu:nsh) on my system.
I use Debian provided arm-none-eabi-gcc by default. The error reported:
-----------------------------------------------------------------------------------
make[5]: Entering
directory '/home/pi/repo/nuttx/src/apps/examples/module/drivers/chardev'
MODULECC: chardev.c
arm-none-eabi-gcc -c -fno-builtin -Wall -Wstrict-prototypes -Wshadow -Wundef
-Os -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -isystem
"/home/pi/repo/nuttx/src/nuttx/include" -D__NuttX__ -pipe -I
"/home/pi/repo/nuttx/src/apps/include" -mlong-calls -D__KERNEL__
chardev.c -o chardev.o
MODULELD: chardev.o
arm-none-eabi-gcc -r -e
module_initialize -T /home/pi/repo/nuttx/src/nuttx/libs/libc/modlib/gnu-elf.ld
-o
chardev chardev.o
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: error:
chardev.o uses VFP register arguments, chardev does not
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: failed to
merge target specific data of file chardev.o
collect2: error: ld returned 1 exit status
-----------------------------------------------------------------------------------
The cause is that LD has been changed to point to arm-none-eabi-gcc .
Use of GCC wrapper for the final image linking can probably help
with correct C++ libraries selection, possible link time optimizations
etc... But redefinition of LD symbol causes troubles when only
partial linking is required because GCC includes default libraries
even when -r relocatable output is required. Other problem is that
when GCC locates librares or even rebuilds machine code then same
set of arch flags should be specified, else mismatch of incompatible
codes is reported.
I have solved problem for LX_CPU by next change of flags used
for ELF loadable applications and modules
-----------------------------------------------------------------------------------
diff --git a/boards/arm/lpc17xx_40xx/lx_cpu/scripts/Make.defs
b/boards/arm/lpc17xx_40xx/lx_cpu/scripts/Make.defs
index de893534d8..fca2650e38 100644
--- a/boards/arm/lpc17xx_40xx/lx_cpu/scripts/Make.defs
+++ b/boards/arm/lpc17xx_40xx/lx_cpu/scripts/Make.defs
@@ -72,7 +72,7 @@ LDNXFLATFLAGS = -e main -s 2048
CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
-LDELFFLAGS = -r -e main
+LDELFFLAGS = $(CELFFLAGS) -nostartfiles -nodefaultlibs -r -e main
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
LDELFFLAGS += -T "${shell cygpath -w
$(BOARD_DIR)$(DELIM)scripts$(DELIM)gnu-elf.ld}"
else
@@ -83,7 +83,7 @@ endif
CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
-LDMODULEFLAGS = -r -e module_initialize
+LDMODULEFLAGS = $(CMODULEFLAGS) -nostartfiles -nodefaultlibs -r -e
module_initialize
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
LDMODULEFLAGS += -T "${shell cygpath -w
$(TOPDIR)/libs/libc/modlib/gnu-elf.ld}"
else
-----------------------------------------------------------------------------------
I expect that same adjustment is required for many other targets.
I can prepare patch for our board only or for all where I find
same LDMODULEFLAGS and LDELFFLAGS pattern.
Other option is to return back to plain LD and define LINK or other
symbol for linker which would point to GCC wrapper. But such change
would require probably changes in the APPS and user projects
using NuttX with own APPS or with export support.
I have not updated my OMK builds to link separately compiled applications
with NuttX exported link kit with GCC wrapper. If the libraries
are collected by export, is it still necessary to use GCC wrapper?
Or was LTO, whole program optimization, automatic C++ templates
instances generaton reason to switch to linking through GCC?
Best wishes,
Pavel
Pavel Pisa
==================================================
PiKRON s.r.o. Phone/Fax: +420 284684676
Kankovskeho 1235 Phone: +420 234697622
182 00 Praha 8 WWW: http://www.pikron.com/
Czech Republic e-mail: [email protected]
==================================================