【发布时间】:2023-04-10 14:14:02
【问题描述】:
我已经从源代码构建并安装了另一个 glibc,并且我希望将现有的用 c++ 编写的可执行文件与自定义 glibc 一起运行以用于实验目的。为了做到这一点,我试图改变可执行文件的加载器。首先,在 /lib64 下创建了一个名为 ld_linux-x86-64.so.2 的链接,其路径指向新的加载器
sudo ln /home/ubuntu/glibc-2.27-amd64/lib/ld-2.27.so /lib64/ld_linux-x86-64.so.2
其次,通过文本编辑器修改了可执行文件中的加载程序路径,将“/lib64/ld-linux-x86-64.so.2”更改为“/lib64/ld_linux-x86-64.so.2”。我启动了可执行文件并收到以下错误:
./demo_cpp: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
修补后的 cpp 程序运行失败,似乎缺少 c++ std 库。但是,这种方法确实适用于纯 C 编写的程序。使用提到的方法here,我尝试了以下命令并得到完全相同的错误:
patchelf --set-interpreter /home/ubuntu/glibc-2.27-amd64/lib/ld-linux-x86-64.so.2 --set-rpath /home/ubuntu/glibc-2.27-amd64/lib demo_cpp
所以我想知道是否可以将 glibc 更改为 cpp 程序?我也需要从源代码构建 cpp 标准库吗?
【问题讨论】:
-
加载替代共享库不需要安装整个系统加载器。那是完全无关紧要的事情。
-
@SamVarshavchik 这是否意味着我可以在不更改可执行文件加载器的情况下加载修改后的 glibc?该怎么做?
-
这在
ld.so手册页中有解释。可执行文件不太可能在其DT_RPATH中显式包含默认库目录(/lib和/usr/lib),如果它有的话。因此,共享库的搜索路径是可覆盖的,如手册页中所述。唯一的例外是您没有提到的 suid 程序。 -
阅读GCC的文档,用
g++ -Wall -Wextra -g -H demo.cpp -o demo_cpp编译然后运行ldd ./demo_cpp -
我猜你想劫持一些库函数。这就是 LD_PRELOAD 的好处。这是很常见的话题,尤其是劫持 malloc/calloc/realloc/free
标签: c++ linux patch glibc libstdc++