gcc有两种方法向待编译源文件传入参数
第一种 利用–Dmacro=name 编译选项,详见gcc -D选项
第二种 利用链接脚本(*.lds)传入参数,类似于ADS的编译器参数可以被待编译源文件调用
举例:
SECTIONS { . = 0x00000000; .init : AT(0){ head.o init.o nand.o} . = 0x30000000; .text : AT(4096) { *(.text) } .rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)&~(0x03)) {*(.rodata*)} .data ALIGN(4) : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+3)&~(0x03)) { *(.data) } __bss_start = .; .bss ALIGN(4) : { *(.bss) *(COMMON) } __bss_end = .; }
程序的启动阶段要对bss段进行初始化,在程序的源文件中需要调用编译器产生的与之相关的两个参数__bss_start 、__bss_end才能确定bss段的区域进而进行初始化清零工作,如下边的源程序。
void clean_bss(void) { extern int __bss_start, __bss_end; int *p = &__bss_start; for (; p < &__bss_end; p++) *p = 0; }
总结这种方法的使用:
1、 在连接脚本中定义需要调用的编译器参数
2、 在程序的源文件中,编译器参数可以作为全局的常数使用