./abc.o:无法执行二进制文件:执行格式错误

Posted

技术标签:

【中文标题】./abc.o:无法执行二进制文件:执行格式错误【英文标题】:./abc.o: cannot execute binary file: Exec format error 【发布时间】:2020-03-09 12:46:05 【问题描述】:

我有一个 Linux 虚拟机。有一些信息。

uname -a: Linux 05d57a817610 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

cat /proc/version:Linux version 4.4.0-131-generic (buildd@lgw01-amd64-015) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018

cat /etc/issue:Ubuntu 18.04.2 LTS \n \l

/*abc.c*/
#include<stdio.h>
int main()

    printf("Hello World\n");
    return 0;

我使用了命令 gcc abc.c -o abc.o ,然后我得到了一个文件:abc.o 。它是可执行的。

当我使用命令:gcc abc.c -c 时,它生成了一个文件 abc.o 。然后我尝试使用命令:./abc.o,但它显示bash: ./abc.o: Permission denied。有了这个,我使用了命令chmod +x abc.o,然后我使用了命令./abc.o,它显示./abc.o: cannot execute binary file: Exec format error。 这个问题困扰了我很久,不知道为什么。谁能帮我?在此先感谢。对不起,我的英语不好。

当您解决问题时,您可能想知道一些信息。

file abc.o : abc.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

uname -m : x86_64

如果您想了解任何信息,请在评论中留言。非常感谢。

【问题讨论】:

为什么你希望能够执行一个目标文件?这不起作用,您必须先将这些链接到可执行二进制文件。 我认为 .o 文件不是您的可执行文件。我不知道Linux上的情况是否有所不同,所以我没有将其发布为答案。但在 Windows 上,.o 文件是链接到最终可执行文件的目标文件。你不能运行这些。 gcc abc.c -o abc 同时进行编译和链接,因此当只有一个源文件时这是合适的。 gcc abc.c -c 只做了第一步,将源文件编译成目标文件。如果您有多个源文件,您会这样做;编译每一个,然后在最后一步将它们链接在一起:gcc abc.o ... -o abc 以获取您的可执行文件。 您可能有一个abc.exe,Windows 会选择并执行。当您键入 abc 时,Windows 会自动查找要执行的 abc.exe。这可能会让您有些困惑。 【参考方案1】:

gcc -c 生成一个目标文件,不是一个可执行文件。要创建可执行文件,您需要链接目标文件:

gcc abc.c -c
gcc abc.o -o abc

作为捷径,您可以将源文件编译为临时目标文件并且也可以使用单个命令将该目标文件链接到可执行文件中:

gcc abc.c -o abc

gcc 用于编译和链接(它是一个前端工具,根据需要调用编译器或链接器。)

【讨论】:

我使用命令gcc abc.c -o abc.oabc.o 是可执行的。但是-c不能,它们的后缀是一样的.o,有区别吗? @guapi 在 Windows 上,gcc abc.c -o abc.o 将生成 abc.o.exe。当您键入abc.o 时,Windows 将执行abc.o.exe。正如我在回答中提到的,-c 生成目标文件,而不是可执行文件。 它在 Linux 上,而不是在 Windows 上。我明白你的意思。命令gcc abc.c -o abc.ogcc abc.c -c 可以生成具有相同名称的文件abc.o,当然还有相同的后缀.o。即使它们具有相同的后缀 .o ,它们也是不同的。你是这个意思吗? @guapi -c 生成目标文件。我不知道还能告诉你什么:-/ 当你使用-c 选项时,你会得到一个可执行文件。当您使用-c 选项时,您将获得一个目标文件。你如何命名该文件并不重要。 @guapi 文件扩展名不会告诉你文件的类型。甚至在 Windows 上也没有。您可以制作一个名为“baking recipes.txt”的EXE文件,也可以制作一个名为“cool game.exe”的文本文件

以上是关于./abc.o:无法执行二进制文件:执行格式错误的主要内容,如果未能解决你的问题,请参考以下文章

bin/python3:无法执行二进制文件:执行格式错误

使用 cygwin 的网络模拟器 2(ns2)给出错误:“无法在 cygwin 中执行二进制文件 exec 格式错误”

执行二进制文件时出现“exec格式错误”[重复]

Valgrind 错误 - 无法执行二进制文件

Centos 6.6 postgresql 错误:无法执行二进制文件

gdb 错误 - 文件不是可执行格式:文件格式无法识别