libgcc_.so:添加符号时出错:文件格式错误

libgcc_.so:添加符号时出错:文件格式错误,c,linux,ubuntu,gcc,linker,C,Linux,Ubuntu,Gcc,Linker,当使用类似于GCC的GCC-march i486-m32-e Harimain-o bootpack.hrb bootpack.c hankaku.c naskfunc.o时,编译器运行良好。但当我添加-T link.ls时,它告诉我: libgcc_.so:添加符号时出错:文件格式错误 我正在64位PC上创建32位二进制文件。这是我的链接器脚本: OUTPUT_FORMAT("binary"); SECTIONS { .head 0x0 : { LONG(0x64 *

当使用类似于GCC的
GCC-march i486-m32-e Harimain-o bootpack.hrb bootpack.c hankaku.c naskfunc.o
时,编译器运行良好。但当我添加
-T link.ls
时,它告诉我:

libgcc_.so:添加符号时出错:文件格式错误

我正在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位,GCC版本是5.4.0


问题是什么?我如何解决它?

默认情况下,GCC构建共享程序。因此,请尝试将
-static
添加到命令行中。您可能还需要
-f重建


在执行此类操作时,我的建议是将compile和linker命令分开,并使用
ld
而不是
gcc
来执行链接器
gcc
在执行链接器阶段时假设了太多的事情。

可能和sudo apt get install glibc-devel.i686您可能应该将此作为一个答案发布。也可以在Meta上看到。谢谢你的建议!但当我使用ld时,我无法将它们编译为32位二进制文件。我想构建为32位的二进制格式。我该怎么做@石原秀一: 哦,是的。。。我认为在linker命令中需要
-melf_i386
来切换到32位。或者可能是
-m i386linux
?我认为它们只是在链接器脚本中有所不同,而您正在替换它,所以这无关紧要。谢谢,我不想以elf格式创建链接器。就像您看到的链接器一样,我只是在原始版本中添加标题,所以当我这样做时,它将重叠,我只想以二进制格式创建@石原秀一: 使用链接器选项
-m elf_i386-T link.ls
将不会创建elf文件,而是创建一个32位二进制文件,正如您所希望的那样。
-m
选项选择仿真模式,该模式提供CPU、体系结构、默认格式和其他选项,然后您的链接器脚本将格式更改为二进制,所有内容都应符合您的要求。它表示找不到lc