編譯工具gcc
gcc是在linux開發(fā)環(huán)境中使用最多的命令,下面是一些常用的選項:
選項說明
編譯選項
-o: 指定目標(biāo)文件的名字;
-c: 只編譯成.o文件,不參與鏈接;
-D: 可以動態(tài)定義宏,和#define xxx效果是一樣的;
-L: 新增鏈接的依賴庫路徑,通常的形式是-Ldir -lxx來鏈接dir目錄下的libxx.so或libxx.a;
-I: 新增頭文件的搜索路徑;
調(diào)試及優(yōu)化選項
-v: 編譯的時候打印詳細(xì)信息;
-g: 增加gdb的調(diào)試信息;
-Wall: 編譯時打印出所有編譯器的警告;
-O1: 優(yōu)化目標(biāo)文件的大小;
-O2: 在O1的基礎(chǔ)上優(yōu)化編譯時間和執(zhí)行效率;
依賴關(guān)系選項
-M: 顯示所有依賴的.o、.c和.h文件,這里的頭文件包括系統(tǒng)頭文件;
-MD: 將-M的輸出重定向到.d文件;
-MM: 顯示所有依賴的.o、.c和.h文件,這里的頭文件不包括系統(tǒng)頭文件;
-MMD: 將-MM的輸出重定向到.d文件;
庫選項
-shared: 用于編譯生成庫文件;
-static: 在編譯時將庫鏈接到elf文件中,這樣運(yùn)行的時候就不需要依賴環(huán)境中是否有這個庫;
實例一
arm-linux-gcc -DDO_DEPS_ONLY -g -Os -fno-common -ffixed-r8 \
-msoft-float -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x47f00000 -I/xxxx/boot/include -fno-builtin \
-ffreestanding -nostdinc -pipe -DCONFIG_ARM -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux \
-march=armv5 -Wall -Wstrict-prototypes -fno-stack-protector \
-Wno-format-nonliteral -Wno-format-security -fstack-usage \
-o lib/asm-offsets.s lib/asm-offsets.c -c -S
選項解釋
-DDO_DEPS_ONLY: 等同于#define DO_DEPS_ONLY;
-g: 增加調(diào)試信息;
-Os: 優(yōu)化選項,相當(dāng)于-O2.5;
-fno-common: 對未定義全局變量的位置優(yōu)化;
-DCONFIG_SYS_TEXT_BASE=0x47f00000: 等同于#define CONFIG_SYS_TEXT_BASE 0x47f00000;
-I/xxxx/boot/include: 增加頭文件的搜索路徑/xxxx/boot/include;
鏈接工具ld
ld用于將多個目標(biāo)和庫文件鏈接成可執(zhí)行文件,利用-Ttext 0x30000000可以指定代碼段的起始地址,所有的指令都基于這個偏移。當(dāng)系統(tǒng)加載這個ELF文件時從0x30000000開始存放代碼段,對于u-boot而言,將bootloader讀取到內(nèi)存的動作是由前4k的代碼完成的。
-Ttext: 正文段起始地址(存儲運(yùn)行指令)
-Tdata: 數(shù)據(jù)段起始地址(存儲以初始化的全局變量)
-Tbss: bss段起始地址(存儲未初始化的全局變量)
ELF文件的內(nèi)部結(jié)構(gòu)
程序本身內(nèi)容包括
text: 存儲運(yùn)行指令
data: 存儲以初始化的全局變量,記錄變量標(biāo)示和內(nèi)容
bss: 存儲未初始化的全局變量,只記錄變量標(biāo)示
程序運(yùn)行依賴
stack: 系統(tǒng)分配,局部變量,用的不好會出現(xiàn)stack overflow
heap: 堆,由程序員使用malloc和free進(jìn)行操作
拷貝文件objcopy
裸板程序,包括bootloader都是需要手動將代碼從flash上拷貝到SDRAM中,而最初使用gcc或ld得到的ELF文件確包含的這里不需要的ELF頭以及相關(guān)的符號表信息,objcopy就時為了去除這些信息。
-O: 指定目標(biāo)文件的格式,二進(jìn)制文件是binary,s-record文件是srec;
-S: 不復(fù)制源文件的重定位信息和符號信息;
常用的形式是
objcopy -O binary -S elf_file bin_file
參考文獻(xiàn)