在虚拟机内的 nfs 共享目录中编译时执行格式错误
Posted
技术标签:
【中文标题】在虚拟机内的 nfs 共享目录中编译时执行格式错误【英文标题】:Exec format error when compiling in nfs shared directory inside a VM 【发布时间】:2017-09-27 13:39:58 【问题描述】:我在我的主机 64 位操作系统上设置了一个 32 位 Debian VM。我使用 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] 当来宾运行 Mint 64 位时,使用相同的架构没有问题。
【问题讨论】:
您是否在您正在运行的同一系统上进行编译?或者您在尝试在 VM 上运行(或反之亦然)时在主机上编译?在后一种情况下,您需要交叉编译。 @EugeneSh。我确实在尝试执行输出(来宾)的同一台机器上进行编译。 我很好奇 NFS 目录与 /tmp 中生成的可执行文件是否不同(在 cmp 或 diff 方面)。检查以确保您的 nfs 共享未挂载 noexec,但我认为这不会更改文件输出 有趣的编辑。您的主机是否在后台做一些有趣的事情? 你用什么来编辑?如果你用别的东西呢? 【参考方案1】:太棒了!我最终设法解决了这个问题。这与编译、编辑或其他任何事情无关。这是一个网络问题。
我在两边都 tcpdumped NFS 帧(顺便说一句,这让我注意到我的 NFS 正在使用 TCP——我确信 UDP 是默认的)。
来自客人:
写入的数据就是实际写入的内容 错误的 TCP 校验和来自主持人:
消息归零 TCP 校验和正常解决方案: 我根据that procedure 禁用了卸载。我仍然需要了解细节,但最后我得到了一些功能性的东西。
PS:创建文件时发生了相同的行为,但从客户端来看,由于文件未刷新,一切看起来都很好。但是在主机上,同一个文件已经被清零了。
【讨论】:
顺便说一句,我该怎么处理这个问题?删除?要求关闭?修改? 离开它。很有趣……也许应该迁移,但这不是你关心的问题。以上是关于在虚拟机内的 nfs 共享目录中编译时执行格式错误的主要内容,如果未能解决你的问题,请参考以下文章