小编The*_*ail的帖子

LD_PRELOAD 是否可能只影响主可执行文件?

实际问题

我有一个可执行文件,默认情况下使用 EGL 和 SDL 1.2 分别处理图形和用户输入。使用LD_PRELOAD,我已将两者替换为 GLFW。

除非用户安装了GLFW的Wayland版本,否则这可以正常工作,这取决于EGL本身。因为所有 EGL 调用要么被存根不执行任何操作,要么调用 GLFW 等效项,因此它不起作用(即eglSwapBuffers调用glfwSwapBuffers哪个调用eglSwapBuffers等等)。我无法删除 EGL 存根,因为这样它将调用 EGL 和 GLFW,并且主要可执行文件是闭源的,因此我无法对其进行修改。

有什么方法可以LD_PRELOAD影响主可执行文件而不是GLFW?或者还有其他解决方案可以获得相同的效果吗?

简化的问题

我做了一个简化的例子来演示这个问题。

主要可执行文件:

#include <stdio.h>

extern void do_something();

int main() {
    do_something();
    fputs("testing B\n", stderr);
}
Run Code Online (Sandbox Code Playgroud)

共享库:

#include <stdio.h>

void do_something() {
    fputs("testing A\n", stderr);
}
Run Code Online (Sandbox Code Playgroud)

预加载库:

#include <stdio.h>

int fputs(const char *str, FILE *file) {
    // Do Nothing
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当不使用预加载库时,输出为:

testing A
testing B
Run Code Online (Sandbox Code Playgroud)

使用时,输出什么也没有。

我正在寻找一种方法使预加载的库仅影响主可执行文件,输出将是:

testing A …
Run Code Online (Sandbox Code Playgroud)

c linux dynamic-linking ld-preload

4
推荐指数
1
解决办法
727
查看次数

标签 统计

c ×1

dynamic-linking ×1

ld-preload ×1

linux ×1