我有一个可执行文件,默认情况下使用 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)