【问题标题】:My C program fails to run with `cannot execute binary file: Exec format error`我的 C 程序无法运行,并出现“无法执行二进制文件:执行格式错误”
【发布时间】:2016-04-11 17:59:03
【问题描述】:

我刚从 C 开始。我正在尝试编译并执行以下代码,但出现错误。

同时运行 size 在 BS 或数据堆栈中没有显示任何内容?

#include<stdio.h>
/* test.c:  My first C program on a Linux */
int main(void)
{
 printf("Hello! This is a test prgoram.\n");
 return 0;
}

编译作品:

gcc -c test.c -o test

执行:

bash: ./test: cannot execute binary file: Exec format error

尺寸:

  text     data     bss     dec     hex filename
    108       0       0     108      6c test

【问题讨论】:

  • 移除 -c 选项。
  • 你可能打算使用-std=c11 或类似的,告诉编译器编译为标准c。

标签: c


【解决方案1】:

好的,因为没有人 想要 想说为什么...您需要删除 -c 选项 因为 according to the man:

-c 选项表示不运行链接器。然后输出由汇编器输出的目标文件组成。

所以基本上,您并没有创建一个完全可执行文件just object files

这里有一些关于编译工作原理的快速信息:http://courses.cms.caltech.edu/cs11/material/c/mike/misc/compiling_c.html

【讨论】:

    【解决方案2】:

    -c 标志在这种情况下不正确:

    gcc test.c -o test

    -c 该选项用于编译程序。

    【讨论】:

    • 进一步解释这一点,-c 表示生成一个目标文件,而不是可执行文件。
    【解决方案3】:

    使用gcc test.c -o test,然后使用./test

    -c 用于编译程序(创建不链接的目标文件)
    -o 用于编译和链接程序(创建可执行文件)并将生成的可执行文件保存在指定的输出文件中

    例如gcc test.c -o test 编译 test.c 并在链接后创建一个名为 test 的可执行文件(在 -o 标志后指定)

    没有 -o 标志 gcc 编译和链接以创建名为 a.out 的可执行文件(默认) 例如gcc test.c 将创建 a.out,您可以将其执行为 ./a.out

    更多详情请见man gcc

    【讨论】:

    • 不,-o 用于告诉输出文件的名称。这就是问题所在,他告诉编译器只需要在不链接的情况下进行编译并调用输出test(而不是习惯上的test.o)。如果没有-c,gcc 将编译和链接,-o test 会告诉编译器将输出放入test,而不是通常的a.out
    • -o 不是必需的。如果没有编译器,将只使用默认名称(例如,a.out 用于 Linux 上的可执行文件)
    • @Olaf:我现在在我的屏幕上显示 R(ing)TFM。请说明我错过了哪一点?指定“点”而不是等待额外的评论要求它可能会更有帮助。
    • 我已经说明了问题所在。你应该仔细阅读我的评论。 Anyw2ay,这里是 FM 的链接:gcc.gnu.org/onlinedocs/gcc-4.9.3/gcc/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多