编译的C文件不可执行

标签 c linux unix compilation

因此,当我尝试在学校的“hercules”服务器上运行已编译的 C 程序时,它的运行方式与我通常预期的一样。但是,我有一个任务需要使用 fork ,并且禁止在该服务器上运行 fork 的程序,相反,我将通过远程连接到多台 Linux 机器中的一台并在那里运行它们来运行它们,从命令行

但是,任何这样做的尝试都会给我这个错误:

shell2: Exec format error. Binary file not executable.

总而言之,我的命令提示符如下所示:

a049403[8]% shell2
shell2: Exec format error. Binary file not executable.

我在工作目录中有 shell2 文件,当我键入“ls”时,它会显示带有 * 字符的文件,表明它在理论上是一个可执行文件。我已经尝试将其权限设置为 777。它对我一直在使用和运行的其他 C 程序产生相同的错误,并且“hercules”可以运行完全相同的文件而没有任何困难或提示。我的这个特定程序的 make 文件如下所示:

all: shell2

Basics.o: Basics.c Basics.h
    cc -c Basics.c

doublinked.o: doublelinked.c doublelinked.h
    cc -c doublelinked.c

main.o: main.c Basics.h doublelinked.h
    cc -c main.c

shell2: main.o Basics.o doublelinked.o
    cc main.o Basics.o doublelinked.o -o shell2

clean:
    rm -f *o shell2

...如果我重新运行 makefile,似乎可以毫无困难地构建程序。

那么,可以编译 C 程序的环境无法运行它们的原因是什么?任何可能的解决方法?

最佳答案

首先,您的Makefile 不是很好。参见 this examplethis one改进它。编译一些家庭作业时,始终将 -Wall -g 标志(以获取所有警告和调试信息)传递给 gcc

然后,为什么您的二进制程序不能在目标机器上运行的可能解释可能是 libc 版本不匹配。或者一个系统是 32 位,另一个是 64 位。使用 file shell2 找出答案。

我建议在目标机器上make clean然后再次重新编译(例如使用make all)。

了解如何 use the gdb debugger .

关于编译的C文件不可执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21821720/

相关文章:

linux - 是否可以为 Linux 终端即时生成字形?

c - Discrete Wavelet Transform LeGal 5/3 with Lifting(负值,可视化,LH HL混淆)

c - 尝试计算两点之间的距离

我可以在包含的代码中设置断点吗?

linux - awk 提供额外空间?

linux - awk 比较两个文件的列,如果在文件 1 中没有看到,则打印文件 2 的列

C - 新声明的数组被其他变量的值污染

linux - Arch Linux 上的 Intellij Idea 14 打开灰屏

linux - 有没有类似于 PS 但记录进程事件的 Linux 命令?

linux - 我应该为 Linux 上最长的用户名或组名创建多大的缓冲区?