我在我的主机 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 是默认设置)。
- 写入的数据是实际写入的数据
- 错误的 TCP 校验和
- 消息归零
- TCP 校验和成功
解决方案:
我根据 that procedure 禁用了卸载.我仍然需要了解细节,但最后我得到了一些功能。
PS:创建文件时发生了同样的行为,但从客户端来看,由于文件没有刷新,一切看起来都很好。但是在主机上,同一个文件已经被归零。
关于c - 在 VM 内的 nfs 共享目录中编译时出现 Exec 格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46449414/