我有一个小的 C++ 程序,正在 ubuntu 机器上编译。该程序在同一台机器上运行良好,但是当我复制并尝试在不同的 Linux 系统上运行时,它打印了
./prog1 : 没有这样的文件或目录。
进一步探测后,我意识到目标 Linux 机器上运行的内核上未启用 VDSO (linux-vdso.so.1) 支持。
下面是我的 Linux 机器上程序的 ldd 输出。
linux-vdso.so.1 => (0x00007fffda425000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6ce9114000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6ce8efe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6ce8b38000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6ce8832000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6ce9432000)
现在我想知道如何在 ubuntu 电脑中编译代码以在目标上运行它?
_______________________________________________-
新编辑
二进制文件被标记为执行,所以这不是问题。 VDSO 绝对不是问题,因为我发现目标内核支持它。
现在我发现目标内核和我的 ubuntu PC 上安装的内核之间存在差异。
来自目标 .... xmllint:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.32,BuildID[sha1]=9dc806b0866749772b0d2458ae74e7cea6e9a4aa,已剥离
来自 Ubuntu ----- prog1:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),对于 GNU/Linux 2.6.24,BuildID[sha1]=4ab095886f476674a7bf30c11d5479f7daa91001,不是剥离的
那么我应该使用更高的内核版本(即 2.6.32)编译我的代码吗?
答案1
linux-vdso.so 不是一个普通的共享库。它是一个虚拟库,内核自动映射到每个进程的地址空间,以提供一些系统调用,而无需完整的上下文切换,并总体上简化系统调用。您可以在联机帮助页上阅读更多信息(在线这里)。由于它不是从文件加载,ldd
因此不会向您显示路径,但由于它显示了它所映射的地址,因此您可以确保它已正确加载。
由于找到了所有库,最可能的原因是该文件根本没有标记为可执行 ( chmod +x
)。