问题标签 [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.
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 中的系统调用包装器(虽然不确定这是否会对问题产生影响)..
linux - 将虚拟文件系统呈现给没有 root 访问权限的 Linux 进程
我正在寻找一种将用户空间文件系统呈现给特定 Linux 进程的方法,但我没有 root 访问权限。
显而易见的答案是 FUSE 但没有 root 访问权限我无法加载内核模块,因此 FUSE 似乎是不可能的(除非有办法 LD_PRELOAD 它?)。
下一个最好的东西似乎是 LD_PRELOAD,它可以拦截相关的 FS 调用,然后对其进行转换,就像 FUSE 在 VFS 层所做的那样。
所以我的问题是:
- 是否存在像 FUSE 这样的支持 LD_PRELOAD 的文件系统?
- 如果我 LD_PRELOAD 某个进程的某些 FS 调用拦截,是否有任何陷阱,例如 FS 拦截可能不是由叉子或子代继承?
r - RStudio - LD_PREOAD 问题
我在 RStudio 中收到 RDOBC 错误,当我在服务器本身上使用 R 时不会发生该错误。
R -
工作室 -
我检查了环境变量并确保以下内容对所有用户都是正确的
知道为什么这将在 R 而不是在具有相同环境设置的 RStudio 中工作吗?
rust - 文件范围可变静态 HashSet/Vec/etc
我想创建 C 链接函数来拦截我的程序调用,LD_PRELOAD
但我正在 Rust 中实现拦截函数。
我创建拦截调用没有问题,pub extern fn
但我想在某处从程序的全局状态读取/写入,因为我无法更改我正在拦截的函数的签名以接受元数据。我不一定需要堆分配,我可以使用一些大型静态初始化池HashSet
或Vec
条目。但我确实需要能够在程序运行期间添加和删除集合的元素。
我认识到这种模式与许多 Rust 设计目标背道而驰,但对我来说它似乎是一个合理的用例。
我是 Rust 的新手,所以我希望有一个unsafe
选项可以做到这一点。
如果查看代码示例有用:
...失败,因为您不能拥有static
需要析构函数或进行堆分配的存储。并且lazy_static!
不允许有mut
能力的结构。
理想情况下,我更喜欢HashSet<c_int>
. 如果我不能让它工作,我想我可以尝试一个Vec::from_elem(100, 0)
. 这并不理想,因为我需要指定某种哨兵值,但如果它有效,我想我会很满意。
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 吗?如果是,那么如何配置呢?
c - 共享库重新编码 malloc 时出错
我正在尝试实现我自己malloc
的共享库版本,但我遇到了问题。当我运行我malloc
的LD_PRELOAD
这条消息时出现:
ld.so 检测到不一致:dl-load.c:2325:_dl_map_object:断言 nsid < _rtld_local._dl_nns 失败!
这出现在我启动命令时ls -lRa /home
我的LD_PRELOAD
路径没问题,因为命令 ls 有效。谢谢你帮助我!
c - 如何 LD_PRELOAD 我自己的编译库?
我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是 include 语句中的那个。
这就是我正在做的事情,到目前为止还没有工作。
然后在终端:
最后
不打印 33,只是随机数...
c++ - 多个 LD_REPLOAD 共享变量
我的目的很简单:当我启动猫鼬服务器时,服务器将初始化一个由我定义的变量。为此,我上瘾了__libc_start_main
。然后当服务器收到请求时,它会打印出初始化的变量。为此,我上瘾了recv
。下面是我的代码。
但是,当我生成文件时,我收到错误:invalid conversion from ‘void*’ to ‘ssize_t (*)(int, void*, size_t, int)
来自dlsym(RTLD_NEXT, "recv");
. 我的另一个问题是我能以这种方式实现我的目标吗?如果没有,正确的方法是什么?
gcc - 无法加载 LD_PRELOAD 指定的库
我在使用 LD_PRELOAD 加载我的 so 时遇到了一些麻烦。
步骤如下:
libtest.c:
/li>gcc -o libtest.so libtest.c -fPIC --shared
导出 LD_PRELOAD=
pwd
/libtest.so主程序
extern void fun(); void main() { fun() }
gcc -o 主 -L。main.c -ltest
然后
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)
- 执行
./main
它促进的main:加载共享库时出错:libtest.so。无法打开共享对象文件:没有这样的文件或目录。
我想知道为什么在我导出 LD_PRELOAD 变量后提示找不到 libtest.so。但是,我也尝试使用 LD_PRELOAD 指定不同的共享库(不是“libc.so”)来注入 malloc 函数,它有效!为什么 LD_PRELOAD 仅适用于链接时未使用的共享库???
c - 如何覆盖 C 中的断言宏?
我想创建自己的版本,assert
以防在NDEBUG
模式下调用 assert 时它会打印一些日志。
我试图做到这一点LD_PRELOAD
并重新定义 assert 宏,但它似乎完全忽略了宏定义并且覆盖__assert_fail
是无关紧要的,因为在NDEBUG
.
如何覆盖libc
assert
宏?
我不想创建不同的函数,因为 assert 已经在项目中大量使用。