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

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

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

答案1

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

现在,我发现这篇好文章对这些问题进行了很好的解释:

静态和动态链接

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

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

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

相关内容