Re: Class constructor doesn't execute
Krzysztof Sawicki <[email protected]> Tue, 6 Dec 2016 10:12:36 +0100
| Newsgroups | gmane.comp.hardware.microcontrollers.ethernut |
|---|---|
| Organization | Mlabs sp. z o.o. |
| Message-ID | <[email protected]> |
On 05.12.2016 14:59, Uwe Bonnes wrote: >>>>>> "Krzysztof" == Krzysztof Sawicki <[email protected]> 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> in linker script add: .preinit_array : { PROVIDE_HIDDEN > Krzysztof> (__preinit_array_start = .); KEEP (*(.preinit_array*)) > Krzysztof> PROVIDE_HIDDEN (__preinit_array_end = .); } > FLASH0 > > Krzysztof> .init_array : { PROVIDE_HIDDEN (__init_array_start = > Krzysztof> .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) > Krzysztof> PROVIDE_HIDDEN (__init_array_end = .); } > FLASH0 > > Krzysztof> .fini_array : { PROVIDE_HIDDEN (__fini_array_start = > Krzysztof> .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) > Krzysztof> PROVIDE_HIDDEN (__fini_array_end = .); } > FLASH0 > > Krzysztof> in main() at the beginning add: /* Call static constructors > Krzysztof> */ asm("bl __libc_init_array"); > > > Krzysztof> and anywhere in the code: > > Krzysztof> extern "C" { void *__dso_handle = NULL; void _init(void){} } > > > Why does app/cppdemo build? > > What of these prerequisites is Gnu specific, what is processor specific and > what is generic. I think anything generic can be added guarded with > #if defined(__cpluplus) > > Any ideas? app/cppdemo builds, but I tried such code: ... class A { public: A() {ab=123;} void print(FILE *stream) {fprintf(stream,"ab=%d\n",ab);} int ab; }; A A1; int main(void) { u_long baud = 115200; NutRegisterDevice(&DEV_CONSOLE, 0, 0); FILE *stream = fopen(DEV_CONSOLE.dev_name, "r+"); _ioctl(_fileno(stream), UART_SETSPEED, &baud); fprintf(stream, "\n\nC++ Demo on Nut/OS %s ready.\n", NutVersionString()); Counter counter(58); counter.print(stream); A A2; A1.print(stream); A2.print(stream); ... and got on terminal: C++ Demo on Nut/OS 5.2.4.0 ready. Counter value = 58 ab=0 ab=123 How to solve this problem, any ideas? greetings -- Krzysztof Sawicki MLabs sp. z o.o. ul. Kaliska 21 61-131 PoznaĆ tel. 61 646 84 27 KRS: 0000390306 NIP: 7822533401 _______________________________________________ http://lists.egnite.de/mailman/listinfo/en-nut-discussion