我在Ubuntu 10.04 32位计算机上编译了一个小的“ hello world” C程序。然后,我将可执行文件(a.out)放在Ubuntu 12.10(64位)VMWare虚拟机上,并尝试执行它(./a.out)。操作系统无法识别文件,并显示“无此文件或目录”。但是,当我将相同的可执行文件放在64位笔记本电脑上运行的Ubuntu 12.10(64位)上时,它运行良好,并且得到了所需的输出。VM正在IBM刀片服务器上运行。我想知道为什么虚拟机的结果?
该消息No such file or directory
不涉及您的可执行文件:a.out
。相反,它是指运行32位动态链接的可执行文件所需的帮助程序。a.out
现在,我在这篇不错的文章中对所有这些进行了很好的解释:
静态和动态链接
二进制可执行文件有两种类型:静态链接的可执行文件和动态链接的可执行文件。首先是关于静态链接的函数:当程序要调用库函数时,它通过名称来引用它。从源代码构建程序时,程序中使用的所有库函数都将从库复制到程序中。然后,程序包含其自己的代码以及所使用的库函数的代码。然后在调用位置将名称更改为程序中相应功能的地址。此过程称为链接,因为它会将函数名称与函数本身及其实现链接在一起。之所以称为static,是因为在构建程序后无法更改链接。
动态链接程序的工作方式不同:该程序还通过名称引用库函数。在构建程序时,将组装两个列表并将其与该程序一起存储:在哪个位置使用哪些库函数的列表,以及包含该程序使用的函数的库的列表。这就是构建程序的全部。
稍后,在执行时,一个特殊的帮助程序,即所谓的动态链接程序,在文件系统中的库列表中的每个库中查找特定位置,并将其加载到内存中。现在,动态链接器知道库函数在哪些内存地址可用。它使用第一个列表在调用库函数的所有位置写入正确的地址。然后可以运行动态链接的程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句