问题标签 [ld-preload]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
241 浏览

linux - dlopen 的优先级高于 linux 上的链接时间

我正在使用 gcc 在 linux 上编译 C 程序。该程序本身在构建时链接 libc(而不是其他),因此 ldd 给出以下输出:

在运行时,这个程序 dlopen() 的库 B,它依赖于库 A,当然 dlopen 在返回之前也会加载。A 导出一个名为 re_exec 的函数,B 调用该函数(B 与 A 链接)。libc 还导出了一个名为 re_exec 的函数。自述输出:

问题是当 B 调用 re_exec 时,调用的是 libc 中的 re_exec,而不是 A 中的 re_exc。

如果,当我调用程序时,我包含 LD_LIBRARY_PRELOAD=/path/to/A.so,那么一切都按预期工作:Bs 调用 re_exec 正确调用 A,而不是 libc。

dlopen 调用通过 RTLD_NOW | RTLD_GLOBAL。我尝试过使用和不使用 DEEPBIND,并且在任何一种情况下都得到相同的行为。

我还尝试在 B 之前直接 dlopen()ing A,无论是否使用 DEEPBIND,这都不会影响行为。

问题:是否可以比链接时包含的库(在本例中为 libc)具有更高优先级的 dlopen A/B?

(请不要建议我将调用重命名为 re_exec 以外的名称;没用)

0 投票
2 回答
2439 浏览

c - How to wrap ioctl(int d, unsigned long request, ...) using LD_PRELOAD?

Here's the template I use for wrapping a function using LD_PRELOAD:

I realized though that ioctl seems to have the following signature:

How could I wrap it in a similar way, given the ... that's in the signature?

0 投票
1 回答
336 浏览

symlink - 使用 LD_PRELOAD 强制程序将符号链接视为真实文件

目标:我想强制 zpaq 备份符号链接,就好像它们是真实文件一样,可能是通过欺骗它(使用 LD_PRELOAD 或某种排序或 FUSE 系统)认为符号链接是实际文件。

我想创建/找到一个库,该库强制程序读取符号链接,因为它们是实际文件,然后使用 LD_PRELOAD (或类似的东西)在该环境中运行程序。

换句话说,当程序调用 readdir() [或其他] 时,符号链接显示为实际文件,而当程序调用 open() [或其他] 时,它打开实际目标文件,而不是符号链接。

有没有办法做到这一点?其他很棒的 zpaq 目前不支持符号链接,并且文件位于不同的驱动器上,所以我也不能使用硬链接。

0 投票
2 回答
688 浏览

c - LD_PRELOAD-ed 共享对象陷阱 read(),但不是 open().. 为什么?

open()在 Linux(在我的情况下为 Debian)上拦截时遇到了麻烦。这是一个内置到共享对象中的简约 C 源代码:

共享对象是使用以下方法构建的:

现在当我尝试

然后我只在输出中看到它的踪迹read()>>>>> in read <<<<<. 我从来没有看到过一丝open()。我检查了cat Makefile使用的内容strace,果然 - 两者open()read()被称为:

顺便说一句,我还检查了其他程序,例如odor bash,从来没有拦截过open()。这里发生了什么?提前致谢...

`

0 投票
1 回答
1202 浏览

c++ - 使用 LD_PRELOAD 重定向 system() 函数调用

我想替换我的程序使用 LD_PRELOAD 对 system() 函数的调用。

所以我在一个共享库中创建了以下包装函数进行测试。

并使用 gcc 编译并链接到共享对象 libsyshook.so。

但是,当我使用 LD_PRELOAD 运行程序时,如下所示,我的 system() 包装函数没有被调用,而是 getenv() 的包装被调用。

当我附加调试器时,我可以看到 system() 调用,调用 libpthread.so 中的实现。那么为什么重定向 system() 不起作用。我认为这没有任何限制??

编辑:我上面编译到 myprog 的测试程序看起来像这样。评论表明了我的观察。

0 投票
1 回答
1646 浏览

symbols - 在运行时动态修改符号表(在 C 中)

是否可以在运行时在 C 中动态修改符号表(在 Linux 上以 elf 格式)?

我的最终目标如下:

在某些函数中说foo,我想将malloc函数覆盖到我的自定义处理程序my_malloc。但是在外面foo,任何malloc人仍然应该像在 glibc 中那样调用 malloc。

注意:这与在整个程序执行期间LD_PRELOAD将覆盖的不同。malloc

0 投票
1 回答
559 浏览

android - LD_PRELOADING dlopen 在 android 上

我很好奇我的应用程序在运行时使用了哪些库和系统调用。所以我开始使用 LD_PRELOAD 和一些“系统调用”(如打开、访问和写入)调查我的应用程序。

但是,当我尝试预加载 dlopen 以找出加载了哪些库时,我收到了这个错误:找不到符号:

似乎是 dlsym 第二次找不到 dlopen 。我用 -ldl 和 android NDK 提供的 arm-gcc 编译了我的预加载 *.so 文件。使用 -rdynamic 也不起作用。

预加载工作正常,但不适用于 dlopen。也许你能帮我...

提前致谢

0 投票
1 回答
156 浏览

linux - linux中运行进程的覆盖函数

我很想知道,如何覆盖 Linux 中正在运行的进程的函数,以便该进程首先调用我的函数。

我们可以LD_PRELOAD用于覆盖二进制文件中的函数,但在已经运行的进程的情况下它不起作用。请有任何建议。

0 投票
1 回答
372 浏览

c++ - 为什么 tcmalloc 不打印通过 dlopen 提供的函数名称

我有下一个项目:main.cpp

共享.cpp:

和生成文件:

我使用 tcmalloc 调试这个测试程序,它动态加载 libshared.so:foo 并执行 it.run 命令: LD_PRELOAD=/usr/local/lib/libtcmalloc.so HEAPCHECK=normal ./a.out

1 最大的泄漏:

  • 使用本地文件 ./a.out。
  • 从以下位置分配的 1 个对象中泄漏 40 个字节:
  • @ 7fe3460bd9ba 0x00007fe3460bd9ba
  • @ 400b43 主要
  • @ 7fe346c33ec5 __libc_start_main
  • @ 400999 _开始
  • @0 _init

为什么我在 foo 函数中得到地址 0x00007fe3460bd9ba 而不是 line?请帮忙

Ps 我尝试将 gdb 与 LD_PRELOAD=.../tcmalloc.so 一起使用,但我得到:“有人正在 ptrace() 向我们发送消息;将自行关闭关闭 perftools 堆泄漏检查”

0 投票
2 回答
67 浏览

c++ - C 编译的 .so 可以与 C++ 应用程序一起使用吗?

如果我想使用 LD_PRELOAD 为 C++ 应用程序(使用 g++ 构建)动态链接共享库 (.so),那么 .so 是从 C 源文件(使用 gcc)还是 C++ 源文件生成是否重要(使用 g++)?为什么或为什么不呢?

感谢您帮助我理解这一点。