[En-Nut-Discussion] Class constructor doesn't execute

Krzysztof Sawicki krzysztof.sawicki at mlabs.pl
Thu Dec 8 12:53:11 CET 2016


On 07.12.2016 17:19, Uwe Bonnes wrote:
>>>>>> "Krzysztof" == Krzysztof Sawicki <krzysztof.sawicki at mlabs.pl> writes:
>
>     Krzysztof> On 05.12.2016 14:59, Uwe Bonnes wrote:
>     >>>>>>> "Krzysztof" == Krzysztof Sawicki <krzysztof.sawicki at mlabs.pl>
>     >>>>>>> writes:
>     >>
>     Krzysztof> Hi, recently I tried some C++ with NutOS and realised that
>     Krzysztof> class' constructors are not executed. I did some research and
>     Krzysztof> realised that following code fixes this issue:
>
>     Krzysztof> app/cppdemo builds, but I tried such code:
>
> Does unmodified cppdemo work as expected? If it works, can you explain why
> it works? And can you then extend cppdemo in a sensible way to show your
> problem? An applicable patch is welcome!

Ok,
I checked out fresh NutOS from trunk and checked:

- app/cppdemo works ok
- app/cppdemo with modification:

---------------------------------------------------------------------------------
--- cppdemo.cc-orig	2016-12-08 11:57:23.000000000 +0100
+++ cppdemo.cc	2016-12-08 12:12:40.837170830 +0100
@@ -91,7 +91,7 @@
      m_value = initValue;
  }

-
+Counter counter2;

  int main(void) {
      u_long baud = 115200;
@@ -104,6 +104,7 @@

      Counter counter;
      counter.print(stream);
+    counter2.print(stream);

      for (;;) {
          char c;
---------------------------------------------------------------------------------

shows following output on terminal:

C++ Demo on Nut/OS 5.2.4.0 ready.
Counter value = 10
Counter value = 0

so, it seems like the constructor for counter2 wasn't executed. Why? No idea, probably of different way of calling constructors: when class is 
statically created and known at compile time and when class is dynamically created in runtime.

After googling for a while and some tests, following patch resolves problem:
Index: nut/arch/cm3/cmsis/cortex_init.c
===================================================================
--- nut/arch/cm3/cmsis/cortex_init.c	(revision 6567)
+++ nut/arch/cm3/cmsis/cortex_init.c	(working copy)
@@ -456,6 +456,10 @@
      __enable_irq();
  }

+
+void *__dso_handle = NULL;
+void _init(void){}
+
  /*!
   * \brief CortexM3 Startup.
   *
@@ -465,4 +469,7 @@
  {
      Cortex_MemInit();
      Cortex_IntInit();
+
+	/* Call static constructors */
+	asm("bl __libc_init_array");
  }
Index: nut/arch/cm3/ldscripts/stm32_flash.ld
===================================================================
--- nut/arch/cm3/ldscripts/stm32_flash.ld	(revision 6567)
+++ nut/arch/cm3/ldscripts/stm32_flash.ld	(working copy)
@@ -55,6 +55,30 @@
          *(..exidx* .gnu.linkonce.armexidx.*)
          __exidx_end = .;
      } > FLASH0
+
+ 	.preinit_array :
+  	{
+    	PROVIDE_HIDDEN (__preinit_array_start = .);
+    	KEEP (*(.preinit_array*))
+    	PROVIDE_HIDDEN (__preinit_array_end = .);
+  	} > FLASH0
+  	
+  	.init_array :
+  	{
+    	PROVIDE_HIDDEN (__init_array_start = .);
+    	KEEP (*(SORT(.init_array.*)))
+    	KEEP (*(.init_array*))
+    	PROVIDE_HIDDEN (__init_array_end = .);
+  	} > FLASH0
+  	
+  	.fini_array :
+  	{
+    	PROVIDE_HIDDEN (__fini_array_start = .);
+    	KEEP (*(SORT(.fini_array.*)))
+    	KEEP (*(.fini_array*))
+    	PROVIDE_HIDDEN (__fini_array_end = .);
+  	} > FLASH0
+
      _etext = .;

      .vtable (NOLOAD):




-- 
Krzysztof Sawicki
MLabs sp. z o.o.
ul. Kaliska 21
61-131 Poznań

tel. 61 646 84 27

KRS: 0000390306
NIP: 7822533401


More information about the En-Nut-Discussion mailing list