我编写了一个共享对象,它修改了 FreeTypeFT_Load_Glyph
和FT_Render_Glyph
函数的参数,目前通过将其插入LD_PRELOAD
和dlsym
。
这很好,但我很想知道是否有办法进行这些更改:
- 给所有在给定主机上使用 FreeType 的程序(例如运行 Debian);
- 不会破坏任何实际上未链接到 FreeType 的程序;
- 无需简单地将 a
LD_PRELOAD
应用于主机上的所有程序; - 除非 FreeType 的 soname 改变,否则不需要任何维护;和
- 无需修改任何 FreeType 的文件,也无需修改主机上任何程序的文件。
我能想出的唯一两个“解决方案”是丑陋的黑客:
- 所有的
LD_PRELOAD
程序,所有的时间,似乎缓慢而脆弱;或者 - 复制例如
libfreetype.so.6.12.3
到libxxxxtype.so.6.12.3
;然后- 将 soname 修补
libxxxxtype.so.6.12.3
到libxxxxtype.so.6
; - 将插入的共享对象链接到
libxxxxtype.so.6
; 和 - 将共享对象安装为例如
libfreetype.so.6.999
。
- 将 soname 修补
我本质上想透明地修补共享对象中的几个函数,同时让其余函数通过,而不必访问共享对象的源或使用它的程序,但是如果我制作了一个假的共享对象使用 soname libfreetype.so.6
,我看不到将其链接到(或dlopen
)真实的干净方法libfreetype.so.6
。
这是我第一次对共享库进行真正的实验,所以如果这个问题做出了一些不正确的假设,或者只是没有意义,请多多包涵。