浏览代码

Merge pull request #362 from BernardXiong/master

[C++] fix GCC compiling issue.
Bernard Xiong 10 年之前
父节点
当前提交
16ff73b51b

+ 1 - 0
bsp/lpc176x/SConstruct

@@ -14,6 +14,7 @@ TARGET = 'rtthread-lpc17xx.' + rtconfig.TARGET_EXT
 env = Environment(tools = ['mingw'],
 	AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
 	CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+	CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
 	AR = rtconfig.AR, ARFLAGS = '-rc',
 	LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
 

+ 2 - 2
bsp/lpc176x/rtconfig.h

@@ -90,8 +90,8 @@
 // </section>
 
 // <section name="LIBC" description="C Runtime library setting" default="always" >
-// <bool name="RT_USING_NEWLIB" description="Using newlib library, only available under GNU GCC" default="true" />
-// #define RT_USING_NEWLIB
+// <bool name="RT_USING_LIBC" description="Using C library" default="true" />
+// #define RT_USING_LIBC
 // <bool name="RT_USING_PTHREADS" description="Using POSIX threads library" default="true" />
 // #define RT_USING_PTHREADS
 // </section>

+ 5 - 1
bsp/lpc176x/rtconfig.py

@@ -26,7 +26,8 @@ BUILD = 'debug'
 if PLATFORM == 'gcc':
     # toolchains
     PREFIX = 'arm-none-eabi-'
-    CC = PREFIX + 'gcc'
+    CC  = PREFIX + 'gcc'
+    CXX = PREFIX + 'g++'
     AS = PREFIX + 'gcc'
     AR = PREFIX + 'ar'
     LINK = PREFIX + 'gcc'
@@ -37,6 +38,7 @@ if PLATFORM == 'gcc':
 
     DEVICE = ' -mcpu=cortex-m3 -mthumb'
     CFLAGS = DEVICE
+    CXXFLAGS = CFLAGS
     AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp'
     LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-lpc17xx.map,-cref,-u,Reset_Handler -T rtthread-lpc17xx.ld'
 
@@ -54,6 +56,7 @@ if PLATFORM == 'gcc':
 elif PLATFORM == 'armcc':
     # toolchains
     CC = 'armcc'
+    CXX = 'armcc'
     AS = 'armasm'
     AR = 'armar'
     LINK = 'armlink'
@@ -65,6 +68,7 @@ elif PLATFORM == 'armcc':
     LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers --list rtthread-lpc17xx.map --scatter rtthread-lpc17xx.sct'
 
     CFLAGS += ' -I' + EXEC_PATH + '/ARM/RV31/INC'
+    CXXFLAGS = CFLAGS
     LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/RV31/LIB'
 
     EXEC_PATH += '/arm/bin40/'

+ 22 - 20
bsp/lpc408x/Libraries/Device/NXP/LPC407x_8x_177x_8x/Source/Templates/GCC/startup_LPC407x_8x_177x_8x.s

@@ -102,18 +102,18 @@ __cs3_interrupt_vector_cortex_m:
     .long   DMA_IRQHandler              /* 42: General Purpose DMA          */
     .long   I2S_IRQHandler              /* 43: I2S                          */
     .long   ENET_IRQHandler             /* 44: Ethernet                     */
-    .long   MCI_IRQHandler              /* 45: SD/MMC Card					*/
+    .long   MCI_IRQHandler              /* 45: SD/MMC Card		    */
     .long   MCPWM_IRQHandler            /* 46: Motor Control PWM            */
     .long   QEI_IRQHandler              /* 47: Quadrature Encoder Interface */
     .long   PLL1_IRQHandler             /* 48: PLL1 Lock (USB PLL)          */
-    .long	USBActivity_IRQHandler		/* 49: USB Activity 				*/
-    .long 	CANActivity_IRQHandler		/* 50: CAN Activity					*/
-    .long	UART4_IRQHandler            /* 51: UART4						*/
-    .long	SSP2_IRQHandler				/* 52: SSP2							*/
-    .long 	LCD_IRQHandler				/* 53: LCD							*/
-    .long	GPIO_IRQHandler				/* 54: GPIO							*/
-    .long 	PWM0_IRQHandler				/* 55: PWM0							*/
-    .long 	EEPROM_IRQHandler			/* 56: EEPROM						*/
+    .long   USBActivity_IRQHandler	/* 49: USB Activity 		    */
+    .long   CANActivity_IRQHandler	/* 50: CAN Activity		    */
+    .long   UART4_IRQHandler            /* 51: UART4			    */
+    .long   SSP2_IRQHandler		/* 52: SSP2			    */
+    .long   LCD_IRQHandler		/* 53: LCD			    */
+    .long   GPIO_IRQHandler		/* 54: GPIO			    */
+    .long   PWM0_IRQHandler		/* 55: PWM0			    */
+    .long   EEPROM_IRQHandler		/* 56: EEPROM			    */
 
     .size   __cs3_interrupt_vector_cortex_m, . - __cs3_interrupt_vector_cortex_m
 
@@ -130,22 +130,24 @@ CRP_Value:
     .section .cs3.reset,"x",%progbits
     .thumb_func
     .globl  __cs3_reset_cortex_m
+    .globl  Reset_Handler
     .type   __cs3_reset_cortex_m, %function
 __cs3_reset_cortex_m:
+Reset_Handler:
     .fnstart
 .ifdef RAM_MODE
 /* Clear .bss section (Zero init) */
-	MOV     R0, #0
-	LDR     R1, =__bss_start__
-	LDR     R2, =__bss_end__
-	CMP     R1,R2
-	BEQ     BSSIsEmpty
+    MOV     R0, #0
+    LDR     R1, =__bss_start__
+    LDR     R2, =__bss_end__
+    CMP     R1,R2
+    BEQ     BSSIsEmpty
 LoopZI:
-	CMP     R1, R2
-	BHS		BSSIsEmpty
-	STR   	R0, [R1]
-	ADD		R1, #4
-	BLO     LoopZI
+    CMP     R1, R2
+    BHS	    BSSIsEmpty
+    STR     R0, [R1]
+    ADD	    R1, #4
+    BLO     LoopZI
 BSSIsEmpty:
     LDR     R0, =SystemInit
     BLX     R0
@@ -154,7 +156,7 @@ BSSIsEmpty:
 .else
     LDR     R0, =SystemInit
     BLX     R0
-	LDR     R0,=_start
+    LDR     R0,=main
     BX      R0
 .endif
     .pool

+ 1 - 0
bsp/lpc408x/SConstruct

@@ -15,6 +15,7 @@ TARGET = 'rtthread-%s.%s' % (rtconfig.BOARD_NAME, rtconfig.TARGET_EXT)
 env = Environment(tools = ['mingw'],
 	AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
 	CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+	CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
 	AR = rtconfig.AR, ARFLAGS = '-rc',
 	LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)

+ 2 - 2
bsp/lpc408x/rtconfig.h

@@ -104,8 +104,8 @@
 // </section>
 
 // <section name="LIBC" description="C Runtime library setting" default="always" >
-// <bool name="RT_USING_NEWLIB" description="Using newlib library, only available under GNU GCC" default="true" />
-// #define RT_USING_NEWLIB
+// <bool name="RT_USING_LIBC" description="Using C library" default="true" />
+// #define RT_USING_LIBC
 // <bool name="RT_USING_PTHREADS" description="Using POSIX threads library" default="true" />
 #define RT_USING_PTHREADS
 // </section>

+ 7 - 2
bsp/lpc408x/rtconfig.py

@@ -29,10 +29,11 @@ BUILD = 'debug'
 if PLATFORM == 'gcc':
     # toolchains
     PREFIX = 'arm-none-eabi-'
-    CC = PREFIX + 'gcc'
+    CC  = PREFIX + 'gcc'
+    CXX = PREFIX + 'g++'
     AS = PREFIX + 'gcc'
     AR = PREFIX + 'ar'
-    LINK = PREFIX + 'gcc'
+    LINK = PREFIX + 'g++'
     TARGET_EXT = 'elf'
     SIZE = PREFIX + 'size'
     OBJDUMP = PREFIX + 'objdump'
@@ -52,11 +53,14 @@ if PLATFORM == 'gcc':
     else:
         CFLAGS += ' -O2'
 
+    CXXFLAGS = CFLAGS
+
     POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'
 
 elif PLATFORM == 'armcc':
     # toolchains
     CC = 'armcc'
+    CXX = 'armcc'
     AS = 'armasm'
     AR = 'armar'
     LINK = 'armlink'
@@ -70,6 +74,7 @@ elif PLATFORM == 'armcc':
 
     CFLAGS += ' -I' + EXEC_PATH + '/ARM/RV31/INC'
     LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/RV31/LIB'
+    CXXFLAGS = CFLAGS
 
     EXEC_PATH += '/arm/bin40/'
 

+ 22 - 1
bsp/lpc408x/rtthread-lpc408x.ld

@@ -38,10 +38,25 @@ SECTIONS
         __vsymtab_end = .;
         . = ALIGN(4);
 
+        PROVIDE(__ctors_start__ = .);
+        /* old GCC version uses .ctors */
+        KEEP(*(SORT(.ctors.*)))
+        KEEP(*(.ctors))
+        /* new GCC version uses .init_array */
+        KEEP (*(SORT(.init_array.*)))
+        KEEP (*(.init_array))
+        PROVIDE(__ctors_end__ = .);
+
         . = ALIGN(4);
         _etext = .;
     } > CODE = 0
 
+    .ARM.extab : 
+    { 
+        *(.ARM.extab*) 
+    } > CODE
+
+    /* The .ARM.exidx section is used for C++ exception handling. */
     /* .ARM.exidx is sorted, so has to go in its own output section.  */
     __exidx_start = .;
     .ARM.exidx :
@@ -57,6 +72,12 @@ SECTIONS
 
     .data : AT (_sidata)
     {
+        . = ALIGN(4);
+        PROVIDE(__dtors_start__ = .);
+        KEEP(*(SORT(.dtors.*)))
+        KEEP(*(.dtors))
+        PROVIDE(__dtors_end__ = .);
+
         . = ALIGN(4);
         /* This is used by the startup in order to initialize the .data secion */
         _sdata = . ;
@@ -68,7 +89,7 @@ SECTIONS
         . = ALIGN(4);
         /* This is used by the startup in order to initialize the .data secion */
         _edata = . ;
-    } >DATA
+    } > DATA
 
     .stack : 
     {

+ 41 - 1
components/cplusplus/README.md

@@ -10,4 +10,44 @@ Because RT-Thread RTOS is used in embedded system mostly, there are some rules f
 4. 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.
 5. Multiple inheritance is strongly discouraged, as it can cause intolerable confusion.
 
-*NOTE*: For armcc compiler, the libc must be enable.
+*NOTE*: The libc must be enable.
+
+About GNU GCC compiler
+
+please add following string in your ld link script:
+// in your .text section
+        PROVIDE(__ctors_start__ = .);
+        /* old GCC version uses .ctors */
+        KEEP(*(SORT(.ctors.*)))
+        KEEP(*(.ctors))
+        /* new GCC version uses .init_array */
+        KEEP (*(SORT(.init_array.*)))
+        KEEP (*(.init_array))
+        PROVIDE(__ctors_end__ = .);
+
+        . = ALIGN(4);
+
+// as a standalone section if you use ARM target.
+
+    /* The .ARM.exidx section is used for C++ exception handling. */
+    /* .ARM.exidx is sorted, so has to go in its own output section.  */
+    __exidx_start = .;
+    .ARM.exidx :
+    {
+        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+
+        /* This is used by the startup in order to initialize the .data secion */
+        _sidata = .;
+    } > CODE
+    __exidx_end = .;
+
+    /* .data section which is used for initialized data */
+
+// in your .data section
+        PROVIDE(__dtors_start__ = .);
+        KEEP(*(SORT(.dtors.*)))
+        KEEP(*(.dtors))
+        PROVIDE(__dtors_end__ = .);
+
+        . = ALIGN(4);
+

+ 2 - 2
components/cplusplus/SConscript

@@ -3,9 +3,9 @@
 from building import *
 
 cwd = GetCurrentDir()
-src = Glob('*.cpp')
+src = Glob('*.cpp') + Glob('*.c')
 CPPPATH = [cwd]
 
-group = DefineGroup('CPlusPlus', src, depend = ['RT_USING_CPLUSPLUS'], CPPPATH = CPPPATH)
+group = DefineGroup('CPlusPlus', src, depend = ['RT_USING_CPLUSPLUS', 'RT_USING_LIBC'], CPPPATH = CPPPATH)
 
 Return('group')

+ 1 - 0
components/cplusplus/crt.h

@@ -11,5 +11,6 @@ void operator delete(void * ptr);
 void operator delete[] (void *ptr);
 
 extern "C" void __cxa_pure_virtual(void);
+extern "C" int  cplusplus_system_init(void);
 
 #endif

+ 24 - 0
components/cplusplus/crt_init.c

@@ -0,0 +1,24 @@
+#include <rtthread.h>
+
+int cplusplus_system_init(void)
+{
+#if defined(__GNUC__) && !defined(__CC_ARM)
+    extern unsigned char __ctors_start__;
+    extern unsigned char __ctors_end__;
+    typedef void (*func)(void);
+
+    /* .ctors initalization */
+    func *ctors_func;
+
+    for (ctors_func = (func *)&__ctors_start__;
+         ctors_func < (func *)&__ctors_end__;
+         ctors_func ++)
+    {
+        (*ctors_func)();
+    }
+#endif
+
+    return 0;
+}
+INIT_COMPONENT_EXPORT(cplusplus_system_init);
+