2013-05-19 15 views
1

我試圖通過在LD腳本STARTUP指令的程序用我自己的啓動文件鏈接:與另一啓動文件鏈接

... 
ENTRY(_start) 
STARTUP(my_crt1.o) 
... 

GCC驅動程序用於程序鏈接(不要與庫路徑libgcc的一樣,等)理會:

gcc -T my_script.ld ... 

不幸的是,它只是編譯爲PowerPC目標的GCC的作品,而手臂或i686的目標不和仍然包括collect2 crt0.o中。例如:

arm-eabi-g++ -v -T my_script.ld ... 

給我:

collect2 ... /opt/lib/gcc/arm-eabi/4.8.0/../../../../arm-eabi/lib/crt0.o ... 

,因此:

crt0.S:101: multiple definition of `_start' 

看來STARTUP指令被完全忽略(PowerPC的目標使用它的默認信息crt0太除非STARTUP指令被指定)並且無法禁用默認的crt0。

有沒有一種便攜的方式來鏈接另一個啓動文件?

我的啓動文件使用libgcc功能(打電話給構建函數和dtors),因此crtbegin.ocrtend.o等需要,所以我想避免-nostartfiles選項,禁用crt*.o - 我只需要禁用crt0.o

謝謝

回答

0

此限制確實會強制您使用-nostartfiles(我更喜歡-nostdlib)禁用默認啓動文件。然後您需要自行構建運行時對象的列表。 gcc可以選擇-print-file-name來打印與(crtbegin.o,crtend.o,libgcc.a ...)一起編譯的庫的絕對路徑。例如:arm-eabi-g++ <FLAGS> -print-file-name=crtbegin.o

這裏是GNU讓宏我使用(提供gcc和CFLAGS):

define m.in/toolchain/gnu/locate = 
$(strip 
    $(shell $(m.in/toolchain/gnu/bin/gcc) $(m.in/toolchain/gnu/cflags) \ 
      -print-file-name=$(m.in/argv/1)) 
) 
endef 

crtn := $(call m.in/toolchain/gnu/locate, crtn.o) 
3

我想一個程序,我自己的啓動文件鏈接...
GCC驅動程序用於程序鏈接...

在這種情況下,你必須還提供-nostartfiles標誌GCC。

+0

我是在做夢另一種解決方案:(在這種情況下,你怎麼能知道如果目標libgcc的需要crti.o或crtn.o? –

+0

它並不能解釋爲什麼它可以與powerpc的交叉工具一起工作 –

+0

這可能是power pc的交叉工具會默默地忽略重複的符號,並且更喜歡你明確提供的那些。一個預感 – parvus