问题标签 [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 投票
3 回答
3834 浏览

c - LD_PRELOAD 不能拦截系统调用,只能拦截 libcalls?

我的代码适用于malloc,但不适用于mmap. 代码如下:

主程序

预加载.c

编译它

运行它LD_PRELOAD

用 strace 运行它

来自的打印输出LD_PRELOAD不会挂钩对 的调用mmap,而只会调用对 的调用malloc。同时,当运行时strace,打印输出确实显示mmap被多次调用。

这个结果让我感到困惑;假设mmap确实是由main.c(我猜是通过malloc)调用的,怎么preload.c不能拦截mmap

PS:我的平台是 Ubuntu 14.04,Linux 内核 3.13

PS2:通过系统调用,我的意思是 libc 中的系统调用包装器(虽然不确定这是否会对问题产生影响)..

0 投票
1 回答
788 浏览

linux - 将虚拟文件系统呈现给没有 root 访问权限的 Linux 进程

我正在寻找一种将用户空间文件系统呈现给特定 Linux 进程的方法,但我没有 root 访问权限。

显而易见的答案是 FUSE 但没有 root 访问权限我无法加载内核模块,因此 FUSE 似乎是不可能的(除非有办法 LD_PRELOAD 它?)。

下一个最好的东西似乎是 LD_PRELOAD,它可以拦截相关的 FS 调用,然后对其进行转换,就像 FUSE 在 VFS 层所做的那样。

所以我的问题是:

  1. 是否存在像 FUSE 这样的支持 LD_PRELOAD 的文件系统?
  2. 如果我 LD_PRELOAD 某个进程的某些 FS 调用拦截,是否有任何陷阱,例如 FS 拦截可能不是由叉子或子代继承?
0 投票
1 回答
463 浏览

r - RStudio - LD_PREOAD 问题

我在 RStudio 中收到 RDOBC 错误,当我在服务器本身上使用 R 时不会发生该错误。

R -

工作室 -

我检查了环境变量并确保以下内容对所有用户都是正确的

知道为什么这将在 R 而不是在具有相同环境设置的 RStudio 中工作吗?

0 投票
0 回答
35 浏览

rust - 文件范围可变静态 HashSet/Vec/etc

我想创建 C 链接函数来拦截我的程序调用,LD_PRELOAD但我正在 Rust 中实现拦截函数。

我创建拦截调用没有问题,pub extern fn但我想在某处从程序的全局状态读取/写入,因为我无法更改我正在拦截的函数的签名以接受元数据。我不一定需要堆分配,我可以使用一些大型静态初始化池HashSetVec条目。但我确实需要能够在程序运行期间添加和删除集合的元素。

我认识到这种模式与许多 Rust 设计目标背道而驰,但对我来说它似乎是一个合理的用例。

我是 Rust 的新手,所以我希望有一个unsafe选项可以做到这一点。

如果查看代码示例有用:

...失败,因为您不能拥有static需要析构函数或进行堆分配的存储。并且lazy_static!不允许有mut能力的结构。

理想情况下,我更喜欢HashSet<c_int>. 如果我不能让它工作,我想我可以尝试一个Vec::from_elem(100, 0). 这并不理想,因为我需要指定某种哨兵值,但如果它有效,我想我会很满意。

0 投票
0 回答
138 浏览

php - 使用 mod_php 覆盖在 Apache 上运行的 PHP 脚本中的 connect()

当通过 mod_php 启用 PHP 时,如何在 Apache 请求中覆盖从 PHP 脚本中调用的 connect() 系统调用?

我在custom-connect.c中定义了我的自定义 connect() 版本:

我编译它:

我有一个简单的脚本curl-test.php,它在内部调用了 connect():

当我从命令行使用 LD_PRELOAD 运行我的脚本时:

然后看起来不错,我可以看到我的自定义 connect() 将某些内容记录到/tmp/connect.log

看起来它在命令行中工作正常。但是,当我从 Apache 运行脚本并通过 mod_php 启用 PHP 时,如何用我自己的版本覆盖 connect()?我还应该使用 LD_PRELOAD 吗?如果是,那么如何配置呢?

0 投票
0 回答
79 浏览

c - 共享库重新编码 malloc 时出错

我正在尝试实现我自己malloc的共享库版本,但我遇到了问题。当我运行我mallocLD_PRELOAD这条消息时出现:

ld.so 检测到不一致:dl-load.c:2325:_dl_map_object:断言 nsid < _rtld_local._dl_nns 失败!

这出现在我启动命令时ls -lRa /home
我的LD_PRELOAD路径没问题,因为命令 ls 有效。谢谢你帮助我!

0 投票
1 回答
885 浏览

c - 如何 LD_PRELOAD 我自己的编译库?

我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是 include 语句中的那个。

这就是我正在做的事情,到目前为止还没有工作。

然后在终端:

最后

不打印 33,只是随机数...

0 投票
1 回答
61 浏览

c++ - 多个 LD_REPLOAD 共享变量

我的目的很简单:当我启动猫鼬服务器时,服务器将初始化一个由我定义的变量。为此,我上瘾了__libc_start_main。然后当服务器收到请求时,它会打印出初始化的变量。为此,我上瘾了recv。下面是我的代码。

但是,当我生成文件时,我收到错误:invalid conversion from ‘void*’ to ‘ssize_t (*)(int, void*, size_t, int)来自dlsym(RTLD_NEXT, "recv");. 我的另一个问题是我能以这种方式实现我的目标吗?如果没有,正确的方法是什么?

0 投票
2 回答
1631 浏览

gcc - 无法加载 LD_PRELOAD 指定的库

我在使用 LD_PRELOAD 加载我的 so 时遇到了一些麻烦。

步骤如下:

  1. libtest.c:

    /li>
  2. gcc -o libtest.so libtest.c -fPIC --shared

  3. 导出 LD_PRELOAD= pwd/libtest.so

  4. 主程序

    extern void fun(); void main() { fun() }

  5. gcc -o 主 -L。main.c -ltest

  6. 然后ldd main

    ldd main linux-vdso.so.1=>(0x00007ffff7ffd000) /home/shiyanlou/Code/libtest.so(0x00007ffff7df9000) libtest.so=>not found libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6 (0x00007ffffa29000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

  7. 执行./main 它促进的main:加载共享库时出错:libtest.so。无法打开共享对象文件:没有这样的文件或目录。

我想知道为什么在我导出 LD_PRELOAD 变量后提示找不到 libtest.so。但是,我也尝试使用 LD_PRELOAD 指定不同的共享库(不是“libc.so”)来注入 malloc 函数,它有效!为什么 LD_PRELOAD 仅适用于链接时未使用的共享库???

0 投票
5 回答
5123 浏览

c - 如何覆盖 C 中的断言宏?

我想创建自己的版本,assert以防在NDEBUG模式下调用 assert 时它会打印一些日志。

我试图做到这一点LD_PRELOAD并重新定义 assert 宏,但它似乎完全忽略了宏定义并且覆盖__assert_fail是无关紧要的,因为在NDEBUG.

如何覆盖libc assert宏?

我不想创建不同的函数,因为 assert 已经在项目中大量使用。