2017-07-08 50 views
1

使用像gcc -march i486 -m32 -e Harimain -o bootpack.hrb bootpack.c hankaku.c naskfunc.o這樣的GCC時,編譯器運行良好。但是,當我加-T link.ls它告訴我:libgcc_s.so:添加符號時出錯:錯誤格式的文件

libgcc_s.so:Error添加符號:文件格式錯誤

我創建64位PC上的32位二進制文​​件。這是我的連接腳本:

OUTPUT_FORMAT("binary"); 
SECTIONS 
{ 
    .head 0x0 : { 
     LONG(0x64 * 1024) /* 0 : stack+.data+heap の大きさ(4KBの倍數) */ 
     LONG(0x69726148)  /* 4 : シグネチャ "Hari" */ 
     LONG(0)    /* 8 : mmarea の大きさ(4KBの倍數) */ 
     LONG(0x310000)  /* 12 : スタック初期値&.data転送先 */ 
     LONG(SIZEOF(.data)) /* 16 : .dataサイズ */ 
     LONG(LOADADDR(.data)) /* 20 : .dataの初期値列のファイル位置 */ 
     LONG(0xE9000000)  /* 24 : 0xE9000000 */ 
     LONG(main - 0x20) /* 28 : エントリアドレス - 0x20 */ 
     LONG(0)    /* 32 : heap領域(malloc領域)開始アドレス */ 
} 
    .text : { *(.text) } 
    .data 0x310000 : AT (ADDR(.text) + SIZEOF(.text)) { 
     *(.data) 
     *(.rodata*) 
     *(.bss) 
} /DISCARD/ : { *(.eh_frame) } 
} 

操作系統是Ubuntu 16.04 64-bit,GCC版本是5.4.0。

問題是什麼,如何解決?

+0

也許[我如何安裝同一個-dev軟件包的32位和64位版本?](https://askubuntu.com/q/254754)和[儘管多種設置,Ubuntu 16.04無法同時保留32位和64位庫安裝在操作系統](https://askubuntu.com/q/813125) – jww

+0

sudo apt-get install glibc-devel.i686 –

+0

你應該發佈這個答案。另請參閱Meta上的[接受自己的答案](https://stackoverflow.blog/2009/01/06/accept-your-own-answers/)。 – jww

回答

0

GCC默認構建共享程序。因此請嘗試將-static添加到您的命令行中。你可能也想要-ffreestanding

我這樣做的建議是將編譯和鏈接器命令分開,並使用ld而不是gcc來執行鏈接器。在執行鏈接器階段時,假設有太多的事情。

+0

但是當我使用ld時,我無法將它們編譯爲32位二進制文​​件。我想將其構建爲32位二進制格式。我該如何做? –

+0

@石原秀一:哦,是的......我認爲你需要在鏈接器命令中使用'-m elf_i386'來切換到32位。或者也許'-m i386linux'?我認爲它們只是在鏈接器腳本中有所不同,並且您正在替換它,所以它並不重要。 – rodrigo

+0

謝謝,我不想在elf格式中創建。就像你看到的鏈接器我只是在我的原始版本中添加標題,所以當我這樣做時它會被重疊,我只是想以二進制格式創建 –

相關問題