问题标签 [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 回答
214 浏览

c - 如何从加载了 LD_PRELOAD 的库构造函数调用可执行文件?

我希望能够从我预加载的库中调用可执行文件。去做这个 -

我有一个简单的可执行文件

主程序

这是用

我现在想预加载一个库,以便callme在之前调用它main

预加载.c

这是用

所以现在我a.outlibpreload.so

当我尝试运行它时

为了调试这个我试过

此的输出包括这一行

所以看起来它在寻找 callme 符号的正确位置。

的输出nm a.out包括以下行

我是否必须以使 callme 可以从 a.out 外部访问的方式进行编译?

任何帮助,将不胜感激。

0 投票
1 回答
210 浏览

cython - Cython GIL SIGSEGV

尝试通过 Cython 的 LD_PRELOAD 拦截呼叫时,我遇到了分段违规。我不明白为什么?

带有示例测试用例的项目可在https://github.com/CraigJPerry/pyshim/blob/master/pyshim/pyshim.pyx获得

我相信python运行时可能没有正确初始化,这是我问题的根源吗?

0 投票
2 回答
249 浏览

c - 用我自己的 close() 函数替换 Linux 中的 close() 函数

我正在尝试close()在 Linux 中提供我自己的功能实现。为什么?因为我刚刚发现你可以这样做,而且听起来很有趣。

这是myclose.c:

这是我的生成文件:

编译后,我运行:

然后我运行:

我得到的输出是:

耶!工作正常吗?几乎。多次cat调用,但我们只看到一行输出。close()根据strace(和常识),close()也应该为文件描述符 1 和 2 调用。如果我运行cat *并 cat 目录中的所有文件,我会看到“Closing fd: 3”、“Closing fd: 4”等,直到目录中的最后一个文件。由于所有这些文件描述符都大于 2,我认为关闭特殊文件描述符(stdout 和 stderr)可能存在问题。但是,当我运行时,ls我只看到常规输出,没有“Closing fd:”行,这意味着它对任何一个都不起作用ls,即使在运行时strace显示。close(3)ls

关于什么可能是错误的任何想法?

0 投票
1 回答
560 浏览

c - LD_PRELOAD 从根本上降低了 Linux 下 C 的进程创建性能?

UNIXBENCH我正在调查衡量进程创建速度的基准的spawn.c一部分中的严重性能损失:

https://code.google.com/p/byte-unixbench/source/browse/trunk/UnixBench/src/spawn.c

我不明白为什么在 centos 下运行时我的数字非常低(甚至进程停止或停止),然后如果我暂时启动到 debian,性能会成倍提高。

我最终追查到我正在预加载jemalloc3.6的事实,/etc/ld.so.preload这是一个替代的高性能内存分配器:

https://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919

这种性能是否受到影响,因为每个生成的进程都在加载它自己的 jemalloc 副本?

有没有办法避免这种情况并且仍然有 jemalloc 自动加载?为什么不共享库?

0 投票
1 回答
1506 浏览

android - Android LD_PRELOAD 等效

我有一个用 C 编写的客户端和一个服务器。为了保护我实现的连接:

  • 我自己的连接并接受 Diffie-Hellman 密钥。
  • 我自己的发送和接收,以便使用 AES 加密流量。基本上,我用数据加密缓冲区并在加密缓冲区上调用原始发送。解密也一样。

当我运行一个程序时,我使用:

  • LD_PRELOAD:my_socket.so ./client
  • LD_PRELOAD:my_socket.so ./server
  • 客户端和服务器可以是任何使用套接字的程序。

稍后编辑:LD_PRELOAD 强制加载程序使用我自己的接受、连接、发送和接收版本加载我的库:http: //www.catonmat.net/blog/simple-ld-preload-tutorial/

现在,我想在 Android 上移动我的图书馆。如何模拟 LD_PRELOAD 的行为,以使我的库对 Android 上的客户端尽可能透明?

谢谢你,多鲁

0 投票
1 回答
725 浏览

c++ - c如何为常量字符串分配内存?

我想更改mallocmemcpyfree函数并将这个 libhooker 与 LD_PRELOAD 一起使用。
我更改它们,并针对一些测试用例对其进行测试。但在其中一个中,我的代码不能正常工作,也不知道为什么。
测试用例:

我的代码输出:

我不知道 c 如何为常量字符串分配内存以及为什么我的代码是错误的。
提前致谢。

0 投票
3 回答
3536 浏览

c++ - LD_PRELOAD 未按预期工作

考虑以下可以在任何程序执行之前预加载的库:

问题是,虽然goodbye始终调用全局变量的构造函数,但某些程序不调用析构函数,例如ls

对于其他一些程序,析构函数按预期调用:

你能解释一下为什么在第一种情况下不调用析构函数吗?编辑:上面的问题已经回答了,也就是说一个程序很可能使用_exit(), abort() 来退出。

然而:

有没有办法在预加载的程序退出时强制调用给定的函数?

0 投票
1 回答
136 浏览

c++ - C++ 在另一个线程中观察 main() 的结尾

我希望能够在 C++ 中的进程终止之前捕获主函数的结尾并在另一个线程中执行其他操作。

我一直在尝试获取主线程的句柄,然后加入它,但似乎 std::this_thread/boost::this_thread 不允许您访问当前线程的句柄。

我想做的基本上如下:

在我的场景中,这两个函数没有共享状态,因为 thread_function 线程是在共享库中使用 LD_PRELOAD 调用的,但我可以从稍后调用main()的线程中传递任何东西。很可能不可能赶上主要功能的结尾,但我想如果有人知道这一点,我会问。

0 投票
0 回答
861 浏览

c++ - 如何在运行时检查类方法是否存在

我正在编写一个库,该库使用 LD_PRELOAD 预加载到其他代码的不同版本(我不想/不能更改)。在以前的版本中,存在类 A 的类方法 A::foo() ,而在以后的版本中,则不存在。

对于全局(类C)函数,我使用属性((弱))机制来检查运行代码时是否实际定义了函数:

这似乎不适用于班级成员。

编译时错误是:

有没有办法检查是否存在不依赖于编译时已知的定义?

我不能使用模板,如是否可以编写模板来检查函数是否存在?因为我的模板是在编译期间评估的。

此外,如何检查 C/C++中是否存在该函数也无济于事。

0 投票
1 回答
162 浏览

c - 如何找到函数原型?(需要 LD_PRELOAD)

我有一些闭源库。我需要围绕draw_something在这个库中定义和调用的函数创建一个钩子(LD_PRELOAD)。我想禁用它(不做任何动作而不是它的动作)。objdump很好地为我反汇编了一个函数,但我完全是 asm 中的菜鸟。库是为 MIPS 架构构建的。

我不知道如何从程序集中提取 C 函数原型。可能吗?你能说一个函数有多少个参数,它返回什么?如果你有这个主题的一些文档/博客的链接,请给我链接。

UPD:编译器是mips-linux-gnu-gcc (Sourcery G++ Lite 4.3-51) 4.3.2

反汇编功能: