我编写了一个共享对象,通过
这个方法很好用,但我想知道是否有一种方法可以实现以下更改:
这是我第一次尝试使用共享库,请谅解如果这个问题有一些错误的假设或根本没有意义。
LD_PRELOAD
和 dlsym
与 FreeType 的 FT_Load_Glyph
和 FT_Render_Glyph
函数进行交互以修改参数。这个方法很好用,但我想知道是否有一种方法可以实现以下更改:
- 对于在特定主机(例如 Debian)上使用 FreeType 的所有程序;
- 不破坏任何未实际链接到 FreeType 的程序;
- 不仅仅是对主机上的所有程序应用
LD_PRELOAD
; - 无需进行任何维护,除非 FreeType 的 soname 改变;
- 不修改 FreeType 文件或主机上任何程序的文件。
- 始终对所有程序应用
LD_PRELOAD
,这似乎很慢且容易出错;或者 - 将例如
libfreetype.so.6.12.3
复制到libxxxxtype.so.6.12.3
,然后- 在
libxxxxtype.so.6.12.3
中修补 soname 为libxxxxtype.so.6
; - 将交互共享对象链接到
libxxxxtype.so.6
;并且 - 将共享对象安装为例如
libfreetype.so.6.999
。
- 在
libfreetype.so.6
的假共享对象,我无法找到一种干净的方式将其链接到(或者说 dlopen
)真正的 libfreetype.so.6
。这是我第一次尝试使用共享库,请谅解如果这个问题有一些错误的假设或根本没有意义。
libfreetype.so.x.y.z
的解决方案似乎是正确的做法。为什么你要将其描述为丑陋的呢? - Leonlibfreetype.so
的副本,该副本具有修补后的soname,特别是在安装新版本(或相同版本)的libfreetype6
软件包时保持其最新,并且(b)我将会污染全局的“sonamespace” ,其中至少从理论上讲是脆弱的,因为不可能想出绝对没有任何库作者会使用的名称来。 (a)可以通过glorpen的答案(换取依赖于绝对路径)得到缓解,而(b)可以得到缓解,使其仅在理论上存在。 - Delan Azabani