【发布时间】:2021-08-28 21:00:18
【问题描述】:
实际问题
我有一个默认情况下使用 EGL 和 SDL 1.2 分别处理图形和用户输入的可执行文件。使用LD_PRELOAD,我已将两者都替换为 GLFW。
除非用户安装了依赖于 EGL 本身的 Wayland 版本的 GLFW,否则这将正常工作。因为所有的 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);
}
共享库:
#include <stdio.h>
void do_something() {
fputs("testing A\n", stderr);
}
预加载库:
#include <stdio.h>
int fputs(const char *str, FILE *file) {
// Do Nothing
return 0;
}
不使用预加载的库时,输出为:
testing A
testing B
使用时,输出什么都没有。
我正在寻找一种方法使预加载的库只影响主可执行文件,输出将是:
testing A
谢谢!
【问题讨论】:
-
我假设你的意思是你希望输出只是
testing A,而不是testing B。
标签: c linux dynamic-linking ld-preload