linux'无法在我编译的每个可执行文件上执行二进制文件',chmod 777没有帮助

时间:2010-11-22 00:16:23

标签: linux assembly nasm

我正在使用linux 7.3(旧的,我知道),并且在过去的几个月里,我一直在学习汇编编程,编写小程序并使用nasm进行编译。几个月来,事情进展顺利,现在由于某种未知的原因,我无法执行我编译的任何程序。

nasm file.s //used to work just fine, then I'd execute ./file

现在,当我运行./file时,首先我得到“许可被拒绝”,这在以前从未发生过。然后,一旦我chmod +777文件,我得到“无法执行二进制文件”。

我没有IDEA为什么会这样,但是非常令人沮丧,因为我编译后不会再运行了。

以root用户身份登录不会改变任何内容。 欢迎提出所有建议,谢谢!!

6 个答案:

答案 0 :(得分:3)

nasm不会生成可执行文件,只会生成一个目标文件(如gcc -c)。您仍然需要在其上运行链接器。

N.B。:“0777几乎总是错的。”

答案 1 :(得分:2)

在二进制文件上运行file命令,并确保它们被正确识别为可执行文件。

同时尝试ldd命令。由于完全相同的原因,它很可能会失败,但值得一试。

答案 2 :(得分:1)

如果您操作的文件系统使用noexec选项挂载,则会发生这种情况。您可以通过执行mount | grep noexec来检查它,看看您当前的工作目录是否受此影响。

答案 3 :(得分:1)

“无法执行二进制文件”是错误代码strerror(3)的{​​{1}}消息。这有一个非常具体的含义:(引用ENOEXEC)的联机帮助页

execve(2)

那么这意味着,你的[ENOEXEC] The new process file has the appropriate access permission, but has an unrecognized format (e.g., an invalid magic number in its header). 调用不会产生可执行文件,而是产生其他东西。正如John Kugelman建议的那样,nasm命令将告诉你它是什么(user502515很可能是正确的,它是一个未链接的目标文件,但我自己从未使用过nasm,所以我不知道。)

顺便说一下,如果您现在学习GAS /“AT& T”汇编语法,而不是需要为不使用英特尔奇异世界语法的架构重写汇编代码,那么您将自己帮忙。我希望你只使用程序集用于实际需要进行手动优化的内循环子程序。

答案 4 :(得分:1)

这恰好发生在我身上。运行后

file <executable name>

输出<file name> ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

问题是我试图在 32位计算机上运行 64位应用程序!

答案 5 :(得分:0)

您可以尝试在/ var / log中查看从此开始到系统中的某些更改。