在目标计算机中运行应用程序时出现的问题

Problems when running application in target machine

提问人:NCLibardi 提问时间:7/6/2023 更新时间:7/6/2023 访问量:38

问:

我有一个使用 c++20 std 的 c++ 项目,并使用 gcc11 在我的本地机器中编译(目标机器有 gcc8.5)。然后,我将可执行文件传输到目标计算机,并使用 ldd 命令检查目标计算机中的可执行文件是否具有所有必要的共享库。显然,输出如下:

./tests_ss_vs_ms: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./tests_ss_vs_ms)
./tests_ss_vs_ms: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by ./tests_ss_vs_ms)
./tests_ss_vs_ms: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by ./tests_ss_vs_ms)
    linux-vdso.so.1 (0x00007ffdfcff5000)
    libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f4aa5717000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f4aa5395000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f4aa4fd0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f4aa6139000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f4aa4dcc000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4aa4bac000)  

到目前为止,我尝试过:

  1. 使用 gcc8.5 进行交叉编译。问题:我的项目使用了 gcc8.5 无法识别的概念,因此会出现编译错误。
  2. 通过设置一些 cmake 环境变量(如: 或
    .问题:libm.so 和 libc.so 仍然是动态构建的,使用给我带来了问题,因为它试图静态链接 libgomp.so(libc.so 和 libm.so 有静态版本,但 libgomp.so 没有)。
    set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")set(CMAKE_EXE_LINKER_FLAGS 'static')-static
  3. 最后,将 libc.so.6 和 libm.so.6 传输到我的目标机器并使用LD_PRELOAD技巧。问题:在运行应用程序时会导致分段错误,当我在本地计算机中运行它时不会发生这种情况。

OBS:我只有权限在目标机器上运行东西,因此不允许在目标机器上更新 libc.so 和 libm.so。

有人知道我能做什么吗?提前致谢!

gcc 交叉编译 ld-preload cmakelists-options

评论

0赞 n. m. could be an AI 7/6/2023
简单的防弹方法:在目标计算机上构建 gcc11。您不必“安装”或“更新”任何东西,一切都可以在您的$HOME中发生。
0赞 n. m. could be an AI 7/6/2023
一种稍微不那么简单的方法,但不需要弄乱目标。在 VM 或 docker 或其他任何位置中构建目标的“克隆”。您真正需要的“克隆”中唯一需要的是与目标相同的 glibc 版本。然后从克隆上的源代码或存储库安装 gcc11 并启动。您可以静态构建,也可以动态构建并将 libstdc++.so 和好友传输到可执行文件可以找到的目标。
0赞 NCLibardi 7/6/2023
@n.m.willseey'allonReddit 我不会遇到与我尝试过的第三个选项相同的问题吗?
0赞 n. m. could be an AI 7/6/2023
不可以,您不能将 libc.so 复制到另一台计算机并期望它正常工作。

答: 暂无答案