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