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

c - 用 LD_PRELOAD 覆盖 mkdir

我正在尝试修改系统调用 mkdir(),以过滤一些我不希望他们创建目录的用户,也许这不是最优雅的方法,但我想知道它为什么不起作用。

mkdir() 替换代码是:

使用 -Wall -std=c99 -fPIC -lconfig -ldl -shared 编译

当我使用 mkdir 二进制文件时,它可以完美运行

LD_PRELOAD=wrapper.so /bin/mkdir aDirectory

但是当我使用这种方式时:

LD_PRELOAD=wrapper.so bindfs AB 我的 mkdir() 没有被使用。

我已经尝试过这个实现,它不能满足我的需求,但可以与 binfs 一起使用

0 投票
2 回答
197 浏览

c - LD_PRELOAD 和弱引用最小示例不起作用

这可能会很尴尬:

我在其他项目中使用库预加载,但我无法让这个最小的例子工作:

弱引用.h:

弱引用.c:

test_weakref.c:

这是我所做的:

最后一个命令的预期输出是

我错过了什么?

0 投票
1 回答
155 浏览

c++ - 将 LD_PRELOAD 与 fstream 一起使用

我正在使用 LD_PRELOAD 来重载system()fopen(),现在我想用我自己的实现替换 fstream 但我不知道从哪里开始。我在网上搜索,但找不到任何关于重载部分或整个类的好例子。任何帮助,将不胜感激。

谢谢。

0 投票
0 回答
101 浏览

linux - 如何透明地调整硬编码文件系统路径?

我需要执行一个已编译的程序,该程序对各种文件系统路径进行硬编码,这些路径具有不同的值。出于实际原因,调整程序的源代码并重新编译它不是一种选择。此外,用符号链接替换硬编码文件或以任何其他方式更改硬编码文件是不可接受的。

我只能想到两个解决方案:LD_PRELOAD 挂钩和修补二进制文件。前者似乎更容易,更可靠。有没有更好的解决方案,或者可能有一些旨在解决这个问题的现有软件?

PS我知道我说的是可怕的黑客。有问题的硬编码软件广泛分布在 Linux 发行版上,但它似乎完全没有维护,而且我认为在我认为可以接受的时间内,没有任何机会获得补丁,更不用说让它进入发行版了。

0 投票
1 回答
974 浏览

linux - Linux:LD_PRELOAD + -z,initfirst

我正在编写一个应该被LD_PRELOAD编入进程的共享对象。
在那个共享对象中,我有一些初始化,例如

我想在流程中的任何其他代码之前被调用。
对于只是一个可执行文件的进程,这可以正常工作,但是如果该进程本身依赖于其他一些共享对象,则这些会在我的LD_PRELOAD共享对象之前被初始化。

我尝试为链接器提供选项-Wl,-z,initfirst,但这似乎根本没有任何效果。当我运行该过程时,LD_DEBUG=files我仍然看到应用程序在我之前如此启动。

我正在运行 CentOS 5.5

0 投票
2 回答
3417 浏览

macos - 是否可以让任意程序忽略信号?

特别是在 Mac OS X 上,是否可以通过 DYLD_INSERT_LIBRARIES 使程序忽略 SIGTERM,以适用于任何或大多数程序的方式?

我尝试编译并插入:

然而,

能够毫无问题地杀死-15。

0 投票
3 回答
6161 浏览

linux - 需要 Packet Tracer 库 (Debian)

我能够轻松地使用 .deb 文件在 Ubuntu 上下载并安装它。我目前正在使用 Crunchbang,但我根本无法安装它。

运行它,我在一个又一个库后请求库时出错。

在安装了所有这些以及更多之后,我能够清理 libQt4* 库。

我目前的错误:

我找不到包含此内容的包裹,也无法在网上找到它。我已经下载了库和LD_PRELOAD库。

ldd 输出:

0 投票
0 回答
313 浏览

c - LD_PRELOAD free/malloc/realloc/calloc free 不起作用

我正在重新编码 malloc/calloc/realloc/free 函数。现在,我完成了 malloc 和测试,我只写了“免费”函数,如:

我用不同的软件测试我的功能,使用 ls/firefox/man ...

但是,对于像 GIMP 这样的软件,我有:

所以,我不明白为什么我有这个问题,免费的什么都不做。(我的自由函数被调用,我用“printf”测试过)

有人知道它来自哪里吗?

感谢阅读希望听到你的声音

0 投票
1 回答
555 浏览

linux - 如何使用 LD_PRELOAD 将后台线程注入应用程序?

我知道 LD_PRELOAD 可用于拦截对共享库中函数的调用(如果应用程序不是静态链接的)。但是,我不知道如何使用它向应用程序添加附加功能或后台线程。

例如,我认为 Berkeley labs checkpoint/restart 使用此方法将后台线程添加到稍后可能会被检查点的应用程序。

所以,现在的问题是,如何在事先不知道从该应用程序调用共享库的哪些函数的情况下,如何使用 LD_PRELOAD 将线程注入到已编译的应用程序中?

0 投票
1 回答
11470 浏览

c++ - 将静态库链接到共享库并隐藏导出的符号

我的链接器有一个烦人的问题。我想将一些符号从共享库链接到静态库,但不导出它的符号(即,我不能简单地合并库或链接--whole-archive)。我想要的是链接(如链接可执行文件,解决未定义的符号)我的共享库到静态库并删除未定义的符号。

我正在寻找的东西可能只是一个链接器选项,但我不能指望它。

我会尽力描述这个问题(这并不容易),然后提供一个玩具最小的例子来玩。

编辑:问题已经解决,解决方案贴在问题的底部

快速说明:

我想使用这个LD_PRELOAD技巧来捕获可执行文件中的一些函数调用。这个可执行文件链接到第三方共享库,其中包含我要捕获的函数的函数定义。

这个第三方库还包含来自另一个库的符号,我也在我的库中使用它,但版本不同(不兼容)。

我想要做的是编译我的共享库并在编译时将它与最后一个(静态)库的定义链接,而不导出符号,以便我的共享库使用与我想要捕获的版本不同的版本。

简化的问题描述

我有一个名为 的第三方库libext.so,我没有它的源代码。这定义了一个函数bar并使用foo另一个库中的函数,但符号都在那里定义:

正如我所提到的,foo是一个外部依赖项,我想使用更新的版本。我有一个更新的库,我们称之为libfoo.a

现在的问题是我想创建一个重新定义的动态库bar,但我希望我的库使用foofrom的定义,libfoo.a并且我希望函数 fromlibext.so调用函数foofrom libext.so。换句话说,我希望我的库的编译时链接到libfoo.a.

我正在寻找的是定义一个使用libfoo.a但不导出其符号的库。如果我将我的图书馆链接到libfoo.a,我会得到:

这意味着我都超载了fooand bar(我不想覆盖foo)。如果我不将我的图书馆链接到libfoo.a,我会得到:

所以我的图书馆将使用他们的版本foo,我也不想要。我想要的是:

Wherefoo在编译时被链接并且它的符号没有被导出。

最小的例子

您不需要阅读此内容,但您可以使用它来玩转并找到解决方案。

bar.cpp: 代表我没有代码的第三方应用程序:

foo.cpp: 代表我的库和第三方都使用的函数的更新版本:

trap.cpp:我的库中的代码,它捕获bar,调用 newfoo并转发:

exec.cpp:要调用的虚拟可执行文件bar

Makefile: 仅限 Unix,对不起

在这种情况下,bar调用foo; 正常的执行是:

预加载我的库拦截bar,调用我foo和转发bar,当前执行是:

最后一行是错误的,所需的输出是:


解决方案

1)正如在接受的答案中指出的那样,我们可以使用链接器版本脚本将不需要的符号的范围从全局更改为本地:

使用链接器版本进行编译显示foo是本地的,程序现在按预期运行:

libfoo.a2)另一种方法是使用属性重新编译-fvisibility=hidden并链接到该属性。导出符号的可见性也是本地的,行为与上述相同。