xref: /nrf52832-nimble/rt-thread/components/cplusplus/README.md (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero# C++ support for RT-Thread #
2*10465441SEvalZero
3*10465441SEvalZeroThis is the C++ component in RT-Thread RTOS. In order to support C++ language, this component
4*10465441SEvalZeroimplement a basic environment, such as new/delete operators.
5*10465441SEvalZero
6*10465441SEvalZeroBecause RT-Thread RTOS is used in embedded system mostly, there are some rules for C++ applications:
7*10465441SEvalZero
8*10465441SEvalZero1. DOES NOT use exception.
9*10465441SEvalZero2. DOES NOT use Run-Time Type Information (RTTI).
10*10465441SEvalZero3. Template is discouraged and it easily causes code text large.
11*10465441SEvalZero4. Static class variables are discouraged. The time and place to call their constructor function could not be precisely controlled and make multi-threaded programming a nightmare.
12*10465441SEvalZero5. Multiple inheritance is strongly discouraged, as it can cause intolerable confusion.
13*10465441SEvalZero
14*10465441SEvalZero*NOTE*: The libc (RT_USING_LIBC in rtconfig.h) must be enable.
15*10465441SEvalZero
16*10465441SEvalZeroAbout GNU GCC compiler
17*10465441SEvalZero
18*10465441SEvalZeroplease add following string in your ld link script:
19*10465441SEvalZero
20*10465441SEvalZero    // in your .text section
21*10465441SEvalZero    PROVIDE(__ctors_start__ = .);
22*10465441SEvalZero    /* old GCC version uses .ctors */
23*10465441SEvalZero    KEEP(*(SORT(.ctors.*)))
24*10465441SEvalZero    KEEP(*(.ctors))
25*10465441SEvalZero    /* new GCC version uses .init_array */
26*10465441SEvalZero    KEEP (*(SORT(.init_array.*)))
27*10465441SEvalZero    KEEP (*(.init_array))
28*10465441SEvalZero    PROVIDE(__ctors_end__ = .);
29*10465441SEvalZero
30*10465441SEvalZero    . = ALIGN(4);
31*10465441SEvalZero
32*10465441SEvalZero    // as a standalone section if you use ARM target.
33*10465441SEvalZero
34*10465441SEvalZero    /* The .ARM.exidx section is used for C++ exception handling. */
35*10465441SEvalZero    /* .ARM.exidx is sorted, so has to go in its own output section.  */
36*10465441SEvalZero    __exidx_start = .;
37*10465441SEvalZero    ARM.exidx :
38*10465441SEvalZero    {
39*10465441SEvalZero        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
40*10465441SEvalZero
41*10465441SEvalZero        /* This is used by the startup in order to initialize the .data secion */
42*10465441SEvalZero        _sidata = .;
43*10465441SEvalZero    } > CODE
44*10465441SEvalZero    __exidx_end = .;
45*10465441SEvalZero
46*10465441SEvalZero    /* .data section which is used for initialized data */
47*10465441SEvalZero
48*10465441SEvalZero    // in your .data section
49*10465441SEvalZero    PROVIDE(__dtors_start__ = .);
50*10465441SEvalZero    KEEP(*(SORT(.dtors.*)))
51*10465441SEvalZero    KEEP(*(.dtors))
52*10465441SEvalZero    PROVIDE(__dtors_end__ = .);
53*10465441SEvalZero
54*10465441SEvalZero    . = ALIGN(4);
55