2017-07-08 632 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格式中创建。就像你看到的链接器我只是在我的原始版本中添加标题,所以当我这样做时它会被重叠,我只是想以二进制格式创建 –