2015-10-22 16 views
0

我正在編譯「-nostdlib」下面的代碼。我的理解是,arm-none-eabi-gcc不會使用「crt0.o」中的_start,但它會使用用戶定義的_start來使用中的。爲此,我希望創建一個start.S文件並放置_start符號。爲什麼不用arm-none-eabi-gcc搜索我的自定義_start符號?

但是,如果我編譯下面顯示的代碼沒有從我身邊定義的_start符號,我沒有得到任何警告。我期待「警告:找不到入門標誌_start;」

問題:

1)爲什麼我沒有得到警告? GCC從哪裏獲得_start符號? 2)如果gcc從某個文件中得到了_start符號,你能讓我知道如何讓GCC從我的start.S文件中使用_start嗎?

$貓test.c的

int main() 
{ 
    volatile int i=0; 
    i = i+1; 

    return 0; 
} 

$貓linker.ld

MEMORY 
{ 
    ram : ORIGIN = 0x8000, LENGTH = 20K 
} 

SECTIONS 
{ 
    .text : { *(.text*) } > ram 
    .bss : { *(.bss*) } > ram 
} 

$手臂 - 無 - EABI - 海合會-Wall -Werror -O2 -mfpu = neon-vfpv4 -mfloat-abi = hard -march = armv7 -a -mtune = cortex-a7 -nostdlib -T linker.ld t est.c -o test.o

$臂無 - EABI - 海合會--version

臂無 - EABI-GCC(GNU工具ARM嵌入式處理器)4.9.3 20150529>(發佈) [ARM /嵌入4_9-分支修訂224288]

回答

3

編譯和鏈路arm-none-eabi-gcc -v -Wall -Werror -O2 ....理解編譯器正在做什麼(並且其crt0它是使用;該crt0可能有一個_start呼喚你main,也_start可能是您的連接器的默認入口點)

注意-nostdlib是關係到(缺乏)C standard library;也許你想在獨立環境下編譯(見this),然後use -ffreestanding(在這種情況下main沒有特別的含義,你需要定義你的啓動函數,並且沒有標準C函數,如mallocprintf除外也許setjmp)。

閱讀C99標準n1256草案。它解釋了第5.1.2.1節中的獨立方式

+0

-GCC中的-v選項沒有給出任何有關使用哪個crt0的信息。我搜索了crt0,crt1,* .S文件和_start。還有 - 很好,我沒有得到警告。 – robomon

+0

你用* arm-none-eabi-gcc -v -Wall -Werror -O2來鏈接*嗎? –

+0

是的我鏈接。因爲最後我定義了鏈接器文件,test.o也是我的最終輸出。在獨立模式下,這是「啓動功能」? – robomon

相關問題