无法在64位VM上运行32位程序

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

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

现在,我在这篇很好的文章中发现了所有这些内容:

  • 关于在64位Ubuntu和共享库上运行32位程序

静态和动态联动

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

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

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