c - 在 VM 内的 nfs 共享目录中编译时出现 Exec 格式错误

标签 c linux gcc virtual-machine nfs

我在我的主机 64 位操作系统上设置了一个 32 位的 Debian 虚拟机。我使用 NFS 共享源代码目录。

当我在那个共享文件夹中编译时,我无法运行可执行文件:

nicolas@vdeb32:~/Shared$ cc hello.c -o hello
nicolas@vdeb32:~/Shared$ ./hello
-bash: ./hello: cannot execute binary file: Exec format error
nicolas@vdeb32:~/Shared$ file hello
hello: data

但是当输出超出该共享文件夹时,一切正常:

nicolas@vdeb32:~/Shared$ cc hello.c -o /tmp/hello
nicolas@vdeb32:~/Shared$ /tmp/hello
hello
nicolas@vdeb32:~/Shared$ file /tmp/hello
/tmp/hello: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32

这种行为的原因是什么?我发现 askubuntu reply但没有任何解释,而且我的主机没有运行 Windows,我的可执行文件也不是链接。

谢谢。

[编辑] 我找到了无法执行文件的原因。编辑 hello.c,我注意到该文件在保存后仅包含零:

nicolas@vdeb32 ~/Shared $ xxd hello.c 
00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000                      ........

重试后:创建文件时,一切正常。但是当我编辑一个文件(在共享目录中)时,它被零覆盖(与原始文件的字节数相同)。编译时,生成的可执行文件也只包含零。我遇到了一个不同但同样的问题:这种行为的原因是什么?

[EDIT2] 当 guest 运行 Mint 64 位时,相同架构没有问题。

最佳答案

太棒了!我最终设法解决了这个问题。这与编译、编辑等无关。这是一个网络问题。

我在两侧 tcpdumped NFS 帧(顺便说一句,这让我注意到我的 NFS 使用的是 TCP——我确信 UDP 是默认设置)。

来自客人: Guest

  • 写入的数据是实际写入的数据
  • 错误的 TCP 校验和


来自主办方: Host

  • 消息归零
  • TCP 校验和成功


解决方案: 我根据 that procedure 禁用了卸载.我仍然需要了解细节,但最后我得到了一些功能。

PS:创建文件时发生了同样的行为,但从客户端来看,由于文件没有刷新,一切看起来都很好。但是在主机上,同一个文件已经被归零。

关于c - 在 VM 内的 nfs 共享目录中编译时出现 Exec 格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46449414/

相关文章:

linux - 笔记本电脑上 ubuntu 服务器上的 Apache 子域

c++ - 警告 : too many arguments for format - fprintf

c - -Wmissing-field-initializers 何时触发警告?

c++ - GCC 下的 2 字节 (UCS-2) 宽字符串

c - malloc mongoose webserver http post body 并将其传递给线程

c - 在 C 中使用 fscanf 扫描字符串

java - 多线程访问同一个文本文件

c - 是什么导致服务器一遍又一遍地读取客户端的最后一条消息?

linux - 如何使用 cal(1) 打印星期几?

linux - 如何在忽略某些目录的同时找到超过一定大小的所有文件(使用 bash 脚本)