无法在 64 位虚拟机上运行 32 位程序

Jay*_*Jay 12 64-bit virtualization

我在 Ubuntu 10.04 32 位机器上编译了一个小的“hello world”C 程序。然后我将可执行文件(a.out)放在 Ubuntu 12.10(64 位)VMWare 虚拟机上并尝试执行它(./a.out)。操作系统无法识别该文件并显示“没有这样的文件或目录”。但是,当我在 64 位笔记本电脑上运行的 Ubuntu 12.10(64 位)上放置相同的可执行文件时,它运行良好,我得到了所需的输出。VM 在 IBM 刀片服务器上运行。我想知道为什么 VM 的结果?

Rad*_*anu 20

该消息No such file or directory不涉及您的可执行文件:a.out. 相反,它指的是运行 32 位动态链接可执行文件所需的帮助程序a.out

现在,我发现所有这些都在这篇不错的文章中得到了很好的解释:

动静联动

有两种类型的二进制可执行文件:静态链接的和动态链接的。首先是静态链接的:当程序想要调用库函数时,它会通过名称来引用它。从源代码构建程序时,程序中使用的所有库函数都从库中复制到程序中。然后程序包含它自己的代码以及它使用的库函数的代码。然后在调用位置,名称更改为程序中相应函数的地址。这个过程称为链接,因为它将函数的名称与函数本身及其实现链接在一起。之所以称为static,是因为在程序构建后无法更改链接。

动态链接程序的工作方式不同:程序还按名称引用库函数。在构建程序时,两个列表会与程序一起组装和存储:一个是在哪些地方使用了哪些库函数的列表,以及一个包含程序使用的函数的库列表。这就是构建程序的全部内容。

稍后,在执行时,一个特殊的帮助程序,即所谓的动态链接器,会在文件系统中的特定位置查找库列表中的每个库并将其加载到内存中。现在动态链接器知道库函数可用的内存地址。它使用第一个列表在所有调用库函数的地方写入正确的地址。然后可以运行动态链接的程序。

  • 第一次°͜°时,这个“找不到文件”错误消息也让我感到困惑,然后我明白这意味着应用程序所需的某些文件丢失了。 (3认同)