1. 程式人生 > >自己學驅動10——arm-linux-選項

自己學驅動10——arm-linux-選項

1、arm-linux-gcc選項
總體選項
(1)-E:預處理之後立即停止,不進行編譯。
(2)-S:編譯後停止,不進行彙編。
(3)-c:預處理、編譯和彙編原始檔,但是不作連結,編譯器根據原始檔生成obj檔案。
(4)-o:指定輸出檔名。這個選項可以使用在預處理、編譯、彙編以及連線中,需要注意的是obj檔案字尾為.o,而彙編檔案的字尾為.s。
(5)-v:顯示製作GCC工具自身時的配置命令:同時顯示編譯器驅動程式、前處理器、編譯器的版本號。
預處理:處理巨集定義以及#include語句。
編譯:將C等程式碼翻譯為彙編程式碼。
彙編:將彙編程式碼翻譯為機器碼。
連線:將obj檔案和系統庫檔案、obj檔案連線起來,最終生成可執行檔案。
補充:在編寫程式時,有時候查詢某個巨集定義是非常繁瑣的事,可以使用-dM -E選項來幫助查詢。
例如:gcc -dM -E test.c | grep -n 'MAX'
-dM為前處理器選項,這條語句將編譯test.c用到的所有巨集捕捉出來作為grep命令的輸入,最終在裡面搜尋MAX。這條語句就能夠找出MAX巨集定義的行。

警告選項
-Wall:該選項加上基本上打開了所有的需要注意的警告資訊,比如沒有指定型別的宣告、在宣告之前就使用的函式、區域性變數未使用等。

除錯選項
-g:以作業系統的本地格式產生除錯資訊,GDB能夠使用這些除錯資訊。

優化選項
-O、-O1、-O2、-O3、-O0:不同的優化程度,優化編譯的過程將佔用較長的時間和較大的記憶體,不使用-O選項的目的是為了減少編譯的開銷,使編譯結果能夠除錯、語句是獨立的。

聯結器選項
(1)object-file-name:如果某些檔案沒有特別明確的字尾,編譯器就認為它們是obj檔案或者庫檔案(聯結器根據檔案內容區分)。
gcc -o test test.o中的test.o就是這裡的object-file-name。
(2)-llibrary:連線名為library的庫檔案,聯結器會搜尋名為liblibrary.a的庫檔案,-l就相當於lib的縮寫。指定-l選項和指定檔名的區別是:-l選項用lib和字尾.a將給定的名字展開並且搜尋一些目錄。
(3)-nostartfiles:不連線系統標準啟動檔案,標準庫檔案仍然可以正常使用。
(4)-nostdlib:不連線系統標準啟動檔案和標準庫檔案,只把指定的檔案傳遞給聯結器。
(5)-static:在支援動態連線的系統上阻止連線共享庫。
(6)-shared:生成一個obj檔案,它可以和其他obj檔案連線產生可執行檔案。
gcc -c -o sub.o sub.c
gcc -shared -o sub.a sub.o

目錄選項
(1)-Idir:在標頭檔案的搜尋路徑中新增dir目錄,這個dir目錄生效在" "包含的標頭檔案搜尋時,而<>包含的標頭檔案還是隻在標準庫中搜索。
(2)-I-:如果用-I指定的搜尋路徑位於-I-選項後面,那麼<>包含的標頭檔案也會在-I指定的路徑中搜索。
(3)-Ldir:在-I選項的搜尋路徑列表中新增dir目錄。
(4)-Bprefix:這個選項指出在何處尋找可執行檔案、庫檔案以及編譯器自己的資料檔案。

2.arm-linux-ld選項

    該選項用於將多個目標檔案、庫檔案連線成可執行檔案。-T選項可以直接指定程式碼段、資料段、bss段的起始地址,也可以用來指定一個連線指令碼,在連線指令碼中進行更為複雜的地址設定。
    -T選項只用於連線Bootloader、核心等“沒有底層軟體支援”的軟體,連線運行於作業系統之上的應用程式時,無需指定-T選項,它們使用預設的方式進行連線。
(1)-Ttext startaddr:其中的startaddr是一個十六進位制的起始地址值。
(2)連線指令碼:arm-linux-ld -Ttimer.lds -o timer_elf $^

3.arm-linux-objcopy選項
    arm-linux-objcopy被用來複制一個目標檔案的內容到另一個檔案中,可以使用不同於原始檔的格式來輸出目的檔案,即可以進行格式轉換。
    在編譯bootloader、核心時,常用arm-linux-objcopy命令將ELF格式的生成結果轉換為二進位制檔案,例如:
arm-linux-objcopy -o binary -S elf_file bin_file
-o:用來指定輸出檔案的格式,這裡後面跟的是binary。
-S:不從原始檔中複製重定位資訊和符號資訊到目標檔案中去。

4.arm-linux-objdump選項

編譯、連線、反彙編過程(以link.s舉例)
arm-linux-gcc -c -o link.o link.s
arm-linux-ld -Ttext 0x000000000 link.o -o link_elf
arm-linux-objdump -D link_elf > link_dump.dis
-D:反彙編所有段。