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


12

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

Answers:


20

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

现在,我发现这篇文章很好地解释了所有这些内容:

静态和动态链接

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

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

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


3
第一次出现此“找不到文件”错误消息时,我也感到困惑,然后我理解这意味着该应用程序所需的某些文件丢失了。
Ramchandra Apte

@RaduRădeanu,您如何称呼帮助程序?我猜是一个动态链接的库。如果是这样,将其称为帮助程序只会使解释混乱。
golem 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.