问题标签 [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.
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 以外的名称;没用)
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?
symlink - 使用 LD_PRELOAD 强制程序将符号链接视为真实文件
目标:我想强制 zpaq 备份符号链接,就好像它们是真实文件一样,可能是通过欺骗它(使用 LD_PRELOAD 或某种排序或 FUSE 系统)认为符号链接是实际文件。
我想创建/找到一个库,该库强制程序读取符号链接,因为它们是实际文件,然后使用 LD_PRELOAD (或类似的东西)在该环境中运行程序。
换句话说,当程序调用 readdir() [或其他] 时,符号链接显示为实际文件,而当程序调用 open() [或其他] 时,它打开实际目标文件,而不是符号链接。
有没有办法做到这一点?其他很棒的 zpaq 目前不支持符号链接,并且文件位于不同的驱动器上,所以我也不能使用硬链接。
c - LD_PRELOAD-ed 共享对象陷阱 read(),但不是 open().. 为什么?
我open()
在 Linux(在我的情况下为 Debian)上拦截时遇到了麻烦。这是一个内置到共享对象中的简约 C 源代码:
共享对象是使用以下方法构建的:
现在当我尝试
然后我只在输出中看到它的踪迹read()
是>>>>> in read <<<<<
. 我从来没有看到过一丝open()
。我检查了cat Makefile
使用的内容strace
,果然 - 两者open()
都read()
被称为:
顺便说一句,我还检查了其他程序,例如od
or bash
,从来没有拦截过open()
。这里发生了什么?提前致谢...
`
c++ - 使用 LD_PRELOAD 重定向 system() 函数调用
我想替换我的程序使用 LD_PRELOAD 对 system() 函数的调用。
所以我在一个共享库中创建了以下包装函数进行测试。
并使用 gcc 编译并链接到共享对象 libsyshook.so。
但是,当我使用 LD_PRELOAD 运行程序时,如下所示,我的 system() 包装函数没有被调用,而是 getenv() 的包装被调用。
当我附加调试器时,我可以看到 system() 调用,调用 libpthread.so 中的实现。那么为什么重定向 system() 不起作用。我认为这没有任何限制??
编辑:我上面编译到 myprog 的测试程序看起来像这样。评论表明了我的观察。
symbols - 在运行时动态修改符号表(在 C 中)
是否可以在运行时在 C 中动态修改符号表(在 Linux 上以 elf 格式)?
我的最终目标如下:
在某些函数中说foo
,我想将malloc
函数覆盖到我的自定义处理程序my_malloc
。但是在外面foo
,任何malloc
人仍然应该像在 glibc 中那样调用 malloc。
注意:这与在整个程序执行期间LD_PRELOAD
将覆盖的不同。malloc
android - LD_PRELOADING dlopen 在 android 上
我很好奇我的应用程序在运行时使用了哪些库和系统调用。所以我开始使用 LD_PRELOAD 和一些“系统调用”(如打开、访问和写入)调查我的应用程序。
但是,当我尝试预加载 dlopen 以找出加载了哪些库时,我收到了这个错误:找不到符号:
似乎是 dlsym 第二次找不到 dlopen 。我用 -ldl 和 android NDK 提供的 arm-gcc 编译了我的预加载 *.so 文件。使用 -rdynamic 也不起作用。
预加载工作正常,但不适用于 dlopen。也许你能帮我...
提前致谢
linux - linux中运行进程的覆盖函数
我很想知道,如何覆盖 Linux 中正在运行的进程的函数,以便该进程首先调用我的函数。
我们可以LD_PRELOAD
用于覆盖二进制文件中的函数,但在已经运行的进程的情况下它不起作用。请有任何建议。
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 堆泄漏检查”
c++ - C 编译的 .so 可以与 C++ 应用程序一起使用吗?
如果我想使用 LD_PRELOAD 为 C++ 应用程序(使用 g++ 构建)动态链接共享库 (.so),那么 .so 是从 C 源文件(使用 gcc)还是 C++ 源文件生成是否重要(使用 g++)?为什么或为什么不呢?
感谢您帮助我理解这一点。