问题标签 [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 的情况下动态加载共享库?
我正在使用 C++ 应用程序。我想在将任何共享库加载到我的应用程序之前加载要加载的共享库。
一种方法是LD_PRELOAD
在代码中使用。但是是否可以在不使用的情况下完成上述场景LD_PRELOAD
?
c - C中的隐藏函数
我有一个具有 f1 功能的应用程序 void f1 ()
此外,我有一个库,我使用LD_PRELOAD
.
该库有几个代码文件和几个头文件,并编译为.so文件。
f1
其中一个头文件也使用了一个与上面签名相同的函数。最新f1
的仅在库中使用。(我无法将其更改为静态方法)
问题是当我从应用程序的库覆盖中加载库(使用LD_PRELOAD
)时。f1
f1
有没有办法将库配置f1
为仅对库可见?
c++ - 如何使用 LD_PRELOAD 拦截 dlsym 调用?
我想拦截应用程序对 dlsym 的调用。我曾尝试在 .so 中声明我正在预加载 dlsym ,并使用 dlsym 本身来获取它的真实地址,但由于非常明显的原因,这不起作用。
有没有比获取进程的内存映射并使用 libelf 在加载的 libdl.so 中找到 dlsym 的真实位置更容易的方法?
opengl - LD_PRELOAD 麻烦
我一直在 OpenGL 接口中使用一些方法来添加一些附加功能(在这种情况下,将 OpenGL 转换为 TCP/UDP 协议)。
我一直在使用一个简单的共享库,它是用 GCC 和 LD_Preload 构建的来修改现有函数。这种技术似乎对某些方法很有效,我有 dlsym 和 glBegin 等方法的工作版本。
但是,我在挂钩某些 glx 函数时遇到了麻烦,例如glXSwapBuffers
和glXMakeCurrent
。
谁能解释为什么我可以挂钩常规的openGL方法而不是glx?
linux - 为什么堆栈上的LD_PRELOAD的值
我正在研究缓冲区溢出并解决一些兵棋推演。存在一个问题,缓冲区上方的所有堆栈内存都设置为 0,除了 main 的返回地址,它将是:
我可以覆盖那个 RET。所以我找到了一些解决这个问题的提示。这是使用 LD_PRELOAD。有人说 LD_PRELOAD 的值不仅在堆栈的环境变量区域中,而且在堆栈的某个地方。所以我设置了 LD_PRELOAD 并搜索它并使用 gdb 找到它。
所以有!现在我知道 LD_PRELOAD 的值在缓冲区下面的堆栈上,现在我可以利用了!
但我想知道为什么 LD_PRELOAD 会加载到该内存地址上。该值也在堆栈的环境变量区域!
这样做的目的是什么?谢谢。
java - 现有 java 应用程序上的 SO_KEEPALIVE
我需要在现有的商业 Java 应用程序上激活 SO_KEEPALIVE,因为我的防火墙在一些不活动后会断开连接。我不拥有源代码,所以我无法更改它(当我拥有源代码时会很容易,只需添加 socket.setKeepAlive(true) )。所以我一直在寻找一些替代方案:
首先,我尝试使用 libkeepalive.so ( http://libkeepalive.sourceforge.net/ ),将其放入 de LD_PRELOAD 似乎适用于 telnet 和 nc 之类的东西,但是当我将它与我的 jrockit jvm 一起使用时,这个 LD_PRELOAD 是完全被忽略,并且每个套接字对象仍然在没有 SO_KEEPALIVE 的情况下被创建
然后我尝试在操作系统级别搜索是否有一个选项可以为所有 TCP 连接默认激活此 SO_KEEPALIVE:不幸的是,在 redhat 6 企业版上没有这样的选项,尽管我找到了一个用于 freebsd 的选项(net.inet.tcp .always_keepalive)
修补 linux 内核以添加此功能对我的系统管理员来说是一个很大的问题;)
搜索任何 java 命令行参数均不成功
所以最后一个选项:通过添加 setOption(SocketOptions.SO_KEEPALIVE, Boolean.valueOf(true)) 来修补现有 JVM 的 java.net.PlainSocketImpl;在受保护的同步 void create(boolean stream) 方法中,并通过 -Xbootclasspath/p 将其放在 rt.jar 之前
到目前为止,最后一个选项有效,但我有点沮丧,因为我不得不为此更改 JVM!任何人都知道其他/更好的方法来处理这样的问题?为什么没有另一种简单的方法可以在所有(java)应用程序上默认激活 SO_KEEPALIVE?
最后一个问题:为什么 java API 不允许您在 serverSockets 对象上设置 keepAlive?它只适用于 Socket 对象,但实际上它也适用于 serverSockets
linux - 在 Linux x86 上调用 backtrace() 时出现分段错误
我正在尝试执行以下操作 - 为 pthreads 库编写一个包装器,该包装器将在它调用的每个 API 时记录一些信息。我想记录的一条信息是堆栈跟踪。
以下是可以按原样编译和运行的原始代码的最小片段。
初始化(文件libmutex.c
):
包装器和对回溯的调用。我已经尽可能多地从方法中删除了,所以是的,我知道我从不调用原始的 pthread_mutex_lock 例如。
为了测试这一点,我使用了这个二进制文件(文件tst_mutex.c
):
这是所有这些的编译方式:
并运行
这会在 Linux x86 上因分段错误而崩溃。在 Linux PPC 上,一切都完美无缺。我尝试了几个版本的 GCC 编译器、GLIBC 库和 Linux 发行版 - 都失败了。
输出是
暗示这里有递归。我查看了源代码backtrace()
- 其中没有调用锁定机制。它所做的只是简单地遍历堆栈帧链表。我也用 objdump 检查了库代码,但这并没有发现任何异常。
这里发生了什么?任何解决方案/解决方法?
哦,也许是最重要的事情。这只发生在 pthread_mutex_lock 函数中!!从任何其他重写的 pthread_* 函数打印堆栈都可以正常工作...
linux - dlopening a library that has dependencies
I have a program that calls dlopen (with RTLD_NOW) to dynamically load a library whose full path is specified during run time, but is not known when the program is first executed. The specified library was dynamically linked against ANOTHER .so file whose location also is not known until after the program is started, but is known before dlopen is called. Any thoughts on how I can get this scenario to work? Thanks!
c - 通过 LD_PRELOAD 将 AF_INET 套接字转换为使用 AF_UNIX
我想知道能够将 AF_INET 套接字转换为使用 AF_UNIX 是多么可行。这样做的原因是我有一个程序可以打开一个 TCP 套接字,但我们无法更改它。因此,为了减少开销,我们希望将此套接字绑定为使用 AF_UNIX 进行通信。
到目前为止,我的想法是使用 LD_PRELOAD 来实现这一点——拦截 bind() 和 accept(),但是不清楚如何最好地实现这一点,或者即使这是最好的方法。
到目前为止,在 bind() 中绑定,如果套接字类型是 AF_INET 并且它的 IP/端口是我希望转换为 AF_UNIX 的套接字,那么我在此处关闭 sockd,并打开一个 AF_UNIX。但是,这似乎在 accept() 中进一步引起问题——因为我不确定当 accept() 中的 sockfd 与我希望告诉使用 AF_UNIX 套接字的那个匹配时该怎么做。
任何帮助表示赞赏。
杰森
c - LD_PRELOAD 和 clone()
我正在使用脚本运行带有 LD_PRELOAD 的程序,并使用我创建的库来拦截一些调用,它运行良好,但在某些时候进程调用 clone() 并且我失去了拦截下一步的能力(程序正在运行再次没有我的图书馆),有没有办法克服这个问题?电话是
查看克隆的参数,我发现也可以跟踪子进程,但与预加载无关。
我还应该提到,我正在尝试拦截对特定文件描述符的所有调用,并且该进程会克隆文件描述符,所以我什至不确定是否可以在没有一些标志的情况下做我想做的事情(问题是我不明白所有这些)。
更新:我正在使用它来记录由 qemu-dm 完成的所有活动(由 xen 运行)
编译gcc -ggdb -shared -fPIC -Wl,-init,__init__ -Wl,-fini,__fini__ -o fileaccesshooks.so -ldl fileaccesshooks.c
包装脚本内容:
正如在下面的评论中所观察到的,环境实际上对于任务和进程是相同的(LD_PRELOAD 对于 /proc/8408/task/8526/environ 和 /proc/8408/environ 都是相同的)但是在调用克隆之后不再记录数据
grep -e "testfile" -e "(11" /tmp/out-0
这就是我得到的,但是相对地,strace -f
在同一可执行文件上运行的输出包含更多的读取和搜索