编译的C文件不可执行

时间:2014-02-17 05:50:47

标签: c linux unix compilation

因此,当我尝试在我学校的“hercules”服务器上运行已编译的C程序时,它会像我通常期望的那样运行。但是,我有一个需要使用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程序的环境无法运行它们?任何可能的解决方法?

2 个答案:

答案 0 :(得分:2)

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

然后,可能解释为什么二进制程序无法在目标计算机上运行,​​可能是libc版本不匹配。或者一个系统可能是32位,另一个是64位。使用file shell2查找。

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

了解如何use the gdb debugger

答案 1 :(得分:1)

如果您正在运行在不同(不兼容)架构上编译的程序,那么您几乎肯定会遇到麻烦。

关于您是否正在传输并尝试运行可执行文件或尝试在新计算机上从头开始构建可执行文件,这一点有点不清楚。还不清楚你的make(如果你在新机器上运行它)是否完全重建了所有内容。

但是,考虑到"Exec format error",可以肯定前一种情况是您遇到的情况,尝试运行不兼容的可执行文件。

所以,这是我的建议。将所有内容传输到新计算机并执行:

make clean all

确保重建所有