I’ve written a shared object that modifies the arguments to FreeType’s FT_Load_Glyph
and FT_Render_Glyph
functions, currently by interposing it with LD_PRELOAD
and dlsym
.
This works fine, but I’m curious to know whether or not there’s a way to make these changes:
- to all programs that use FreeType on a given host (running e.g. Debian);
- without clobbering any programs that aren’t actually linked to FreeType;
- without simply applying an
LD_PRELOAD
to all programs on the host; - without requiring any maintenance unless FreeType’s soname is changed; and
- without modifying any of FreeType’s files, nor those of any programs on the host.
The only two “solutions” that I’ve been able to come up with are ugly hacks:
- to
LD_PRELOAD
all programs, all of the time, which seems slow and fragile; or - to copy e.g.
libfreetype.so.6.12.3
tolibxxxxtype.so.6.12.3
; then- patch the soname in
libxxxxtype.so.6.12.3
tolibxxxxtype.so.6
; - link the interposing shared object against
libxxxxtype.so.6
; and - install the shared object as e.g.
libfreetype.so.6.999
.
- patch the soname in
I’d essentially like to transparently patch a couple of functions in a shared object, while letting the remaining functions through, without necessarily having access to the source of the shared object or the programs that use it, but if I make a fake shared object with the soname libfreetype.so.6
, I can’t see a clean way to link it to (or dlopen
) the real libfreetype.so.6
.
This is my first real experiment with shared libraries, so please bear with me if this question makes some incorrect assumptions, or just makes no sense.