【问题标题】:Is it possible to change the libc for cpp program without source?是否可以在没有源代码的情况下更改 cpp 程序的 libc?
【发布时间】: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++


【解决方案1】:

您需要阅读有关操作系统、编译器和链接器的书籍。

推荐阅读

阅读完以上所有书籍后,请考虑阅读多个 Linux man 页面的文档,例如:

还要研究GNU libc 和Linux kernel 的文档和源代码

因为他们是free software

所以我想知道是否可以将 glibc 更改为 cpp 程序?

是的这是可能,不不容易容易!

另请参阅schrootLinuxFromScratch

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多