Skip to main content
DShti
Associate
September 1, 2019
Question

Problem with linking my Nuttx application with touchgfx

  • September 1, 2019
  • 5 replies
  • 1626 views

Hi!

I am trying to build an application for STM32F429 written under Nuttx OS with touchgfx. I made stubs for oswrappers and hal to check the build. I have my own makefile and ld-script. The project compiles, but errors occur at the linking stage:

arm-none-eabi-ld: ./obj/display_main.o: in function `touchgfx :: HAL & touchgfx :: touchgfx_generic_init <NuttxHAL> (touchgfx :: DMA_Interface &, touchgfx :: LCD &, touchgfx :: TouchController &, short, short, unsigned short *, unsigned int, unsigned int) ': ./lib/touchgfx/framework/include/common/TouchGFXInit.hpp:89: undefined reference to `touchgfx :: Bitmap :: registerBitmapDatabase (touchgfx :: Bitmap :: BitmapData const *, unsigned short, unsigned short *, unsigned int, unsigned int) '

arm-none-eabi-ld: ./obj/NuttxHAL.o:(.rodata._ZTV8NuttxHAL+0x3c): undefined reference to `touchgfx :: HAL :: blockCopy (void *, void const *, unsigned int) '

arm-none-eabi-ld: ./obj/NuttxHAL.o:(.rodata._ZTV8NuttxHAL+0x60): undefined reference to `touchgfx :: HAL :: copyFBRegionToMemory (touchgfx :: Rect, unsigned short *, unsigned int) '

arm-none-eabi-ld: ./obj/NuttxHAL.o:(.rodata._ZTV8NuttxHAL+0x9c): undefined reference to `touchgfx :: HAL :: touch (int, int) '

arm-none-eabi-ld: ./lib/touchgfx/lib/core/cortex_m4f/gcc/libtouchgfx-float-abi-hard.a(AbstractPartition.o): in function `touchgfx :: AbstractPartition :: indexOf (void const *) ':

(.text._ZN8touchgfx17AbstractPartition7indexOfEPKv + 0x30): undefined reference to `__assert_func '

arm-none-eabi-ld: ./lib/touchgfx/lib/core/cortex_m4f/gcc/libtouchgfx-float-abi-hard.a(AbstractPartition.o): in function `touchgfx :: AbstractPartition :: allocate (unsigned short ) ':

(.text._ZN8touchgfx17AbstractPartition8allocateEt + 0x18): undefined reference to `__assert_func '

arm-none-eabi-ld: ./lib/touchgfx/lib/core/cortex_m4f/gcc/libtouchgfx-float-abi-hard.a(AbstractPartition.o): in function `touchgfx :: AbstractPartition :: allocateAt (unsigned short , unsigned short) ':

(.text._ZN8touchgfx17AbstractPartition10allocateAtEtt + 0x1a): undefined reference to `__assert_func '

arm-none-eabi-ld: ./lib/touchgfx/lib/core/cortex_m4f/gcc/libtouchgfx-float-abi-hard.a(CircleProgress.o): in function `touchgfx :: CircleProgress :: setStartEndAngle (int, int) ':

(.text._ZN8touchgfx14CircleProgress16setStartEndAngleEii + 0xe): undefined reference to `__assert_func '

arm-none-eabi-ld: ./lib/touchgfx/lib/core/cortex_m4f/gcc/libtouchgfx-float-abi-hard.a(AbstractProgressIndicator.o): in function `touchgfx :: AbstractProgressIndicator :: setRange (short, short, unsigned short, unsigned short) ':

(.text._ZN8touchgfx25AbstractProgressIndicator8setRangeEsstt + 0x1c): undefined reference to `__assert_func '

arm-none-eabi-ld: ./lib/touchgfx/lib/core/cortex_m4f/gcc/libtouchgfx-float-abi-hard.a(Container.o):(.text._ZN8touchgfx9Container3addERNS_8DrawableE+0 references `__assert_func 'follow

In this case, the rest of the touchgfx library is normally linked.

I use ld for linking with the following flags:

LD_FLAGS = --entry = __ start
LD_FLAGS + = -nostartfiles -nodefaultlibs
LD_FLAGS + = -Map = "$ (MAP)" --cref
LD_FLAGS + = --gc-sections
LD_FLAGS + = -T $ (LIBDIR) /nuttx-export/build/ld.script
LD_FLAGS + = -L $ (LIBDIR) / touchgfx / lib / core / cortex_m4f / gcc
LD_FLAGS + = -L $ (LIBDIR) / nuttx-export / libs
LD_FLAGS + = --start-group
LD_FLAGS + = -ltouchgfx-float-abi-hard
LD_FLAGS + = -lnuttx -lapps "$ (GCCLIB) /thumb/v7e-m/fpv4-sp/hard/libgcc.a"
LD_FLAGS + = --end-group
 
$ (LD) $ (OBJS) $ (LD_FLAGS) -o "$ (ELF)"

ld-script is as follows:

MEMORY
{
 flash (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
 sram (rwx) : ORIGIN = 0x20000000, LENGTH = 112K
}
OUTPUT_ARCH(arm)
EXTERN(_vectors)
ENTRY(_stext)
SECTIONS
{
 .text : {
 _stext = ABSOLUTE(.);
 *(.vectors)
 *(.text .text.*)
 *(.fixup)
 *(.gnu.warning)
 *(.rodata .rodata.*)
 *(.gnu.linkonce.t.*)
 *(.glue_7)
 *(.glue_7t)
 *(.got)
 *(.gcc_except_table)
 *(.gnu.linkonce.r.*)
	KEEP (*(.init))
	KEEP (*(.fini))
	KEEP (*(.dtors))
	. = ALIGN(4);
	PROVIDE_HIDDEN (__preinit_array_start = .);
	KEEP (*(.preinit_array*))
	PROVIDE_HIDDEN (__preinit_array_end = .);
 _etext = ABSOLUTE(.);
 } > flash
 . = ALIGN(4);
 .init_section : {
 _sinit = ABSOLUTE(.);
 *(.init_array .init_array.*)
 _einit = ABSOLUTE(.);
 } > flash
 . = ALIGN(4);
 .ARM.extab : {
 *(.ARM.extab*)
 } > flash
 . = ALIGN(4);
 .ARM.exidx : {
 __exidx_start = ABSOLUTE(.);
 *(.ARM.exidx*)
 __exidx_end = ABSOLUTE(.);
 } > flash
 _eronly = ABSOLUTE(.);
 /* The RAM vector table (if present) should lie at the beginning of SRAM */
 .ram_vectors : {
 *(.ram_vectors)
 } > sram
 . = ALIGN(4);
 .data : AT( _eronly ) {
 _sdata = ABSOLUTE(.);
 *(.data .data.*)
 *(.gnu.linkonce.d.*)
 CONSTRUCTORS
 _edata = ABSOLUTE(.);
 } > sram 
 .bss : {
 _sbss = ABSOLUTE(.);
 *(.bss .bss.*)
 *(.gnu.linkonce.b.*)
 *(COMMON)
 _ebss = ABSOLUTE(.);
 } > sram
 /* Stabs debugging sections. */
 .stab 0 : { *(.stab) }
 .stabstr 0 : { *(.stabstr) }
 .stab.excl 0 : { *(.stab.excl) }
 .stab.exclstr 0 : { *(.stab.exclstr) }
 .stab.index 0 : { *(.stab.index) }
 .stab.indexstr 0 : { *(.stab.indexstr) }
 .comment 0 : { *(.comment) }
 .debug_abbrev 0 : { *(.debug_abbrev) }
 .debug_info 0 : { *(.debug_info) }
 .debug_line 0 : { *(.debug_line) }
 .debug_pubnames 0 : { *(.debug_pubnames) }
 .debug_aranges 0 : { *(.debug_aranges) }
}

I tried using g++ for linking, but the result is the same.

Have you any ideas why this happens? I'm sure I forget to add something, but can't understand what exactly it should be.

Thanks.

This topic has been closed for replies.

5 replies

Martin KJELDSEN
Principal III
September 2, 2019

Hi @DShti​,

Anything else in that build log? Sure, definitely a linker issue, primarily related to HAL methods (Base HAL is closed source), while containers, widgets, etc, are in the lib but also present as source code.

I'm a bit concerned about the spaces in the following expression.

LD_FLAGS + = -L $ (LIBDIR) / touchgfx / lib / core / cortex_m4f / gcc

/Martin

DShti
DShtiAuthor
Associate
September 3, 2019

Hi, Martin. There are no spaces in actual makefile in LD_FLAGS, they were inserted when i pasted it as code snippet.

I added --trace and --no-demangle to ld flags and took a look at touchgfx.a contents. There is an interesting thing i found:

when ld works it is waitng for _ZN8touchgfx6Bitmap22registerBitmapDatabaseEPKNS0_10BitmapDataEtPtjj

but in touchgfx.a it see _ZN8touchgfx6Bitmap22registerBitmapDatabaseEPKNS0_10BitmapDataEtPtmm

The key of this problem is that when you built this lib uint32_t was defined as unsigned long, but when I compile my app I use <cstdint> from nuttx export, where it been defined as unsigned int. So mangling did his dirty deed.

Thanks for reply, i think this post may be closed.

Martin KJELDSEN
Principal III
September 4, 2019

Ahaaa, nice catch.

/Martin

JGonz.2
Associate II
January 5, 2020

Hi, DShti.

Could you share the steps you have taken to port your TouchGFX application to NuttX?

I want to create a STM32F746g-disco project running NuttX and there aren't many graphical frameworks available besides Nx and Lvgl that seem inferior to me compared to TouchGFX.

Thanks.

embeddedt
Visitor II
June 8, 2020

Hi,

The latest version of LVGL (7.0) was recently released. You can see some of the new demos here: https://lvgl.io/demos

What features in TouchGFX are important to you that you weren't able to find in NX or LVGL? We'd be happy to hear about them on our forum: https://forum.lvgl.io/