Können Sie ein dynamisches Linkziel ändern, ohne es neu zu kompilieren?

7

Ich habe ein Programm heruntergeladen , das leider nicht als Quelldistribution erhältlich ist. Wenn ich es ausführe, erhalte ich den Fehler

Fehler beim Laden von gemeinsam genutzten Bibliotheken: libjpeg.so.62: gemeinsam genutzte Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis

Das Programm scheint mit einer bestimmten Version von libjpeg verknüpft worden zu sein, die meine Distribution nicht hat. Das Erstellen eines Symlinks /usr/lib32/libjpeg.so.62mit meinem Namen libjpeg.sobehebt das Problem, aber das Herumstöbern, /usr/lib32nur um ein Programm zum Laufen zu bringen, scheint dumm und übertrieben.

Gibt es eine Möglichkeit (ohne Neukompilierung), das Programm dynamisch zu verknüpfen, libjpeg.soanstatt libjpeg.so.62?

FWIW, fileInfo für das Programm ist

ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
Matt Kline
quelle

Antworten:

5

Bearbeiten Sie die Datei binär ( vim -bz. B. mit) und ersetzen Sie jedes Vorkommen /usr/lib32/libjpeg.so.62durch einen Pfad zu Ihrer libjpeg.so, der genau die gleiche Größe wie zum Beispiel hat/usr/lib//////libjpeg.so

/usr/lib32/libjpeg.so.62
/usr/lib//////libjpeg.so
Stéphane Chazelas
quelle
1
Das Ersetzen der .62durch Nullzeichen hat den Trick getan. Vielen Dank!
Matt Kline
Ich gehe davon aus, dass das Einmischen in / usr / lib32 / durch das Erstellen von Symlinks viel sicherer ist als eine binäre Bearbeitung. Meine 2 Cent. Auch was ist wieder falsch mit Softlinks?
Arpith
@Arpith Mit Symlinks ist nichts falsch, aber ich sehe keinen Grund darin, Änderungen an meinem gesamten System vorzunehmen, nur um eine einzelne Anwendung zu unterstützen, die fragwürdig verknüpft war.
Matt Kline
2
Die App ist wahrscheinlich korrekt verlinkt, Bibliotheken haben aus einem bestimmten Grund Versionen . Die ABI-Kompatibilität ist das Hauptanliegen, siehe beispielsweise upstream-tracker.org/versions/libjpeg.html . Eine solche Benennungsmethode ist grob, aber effektiv gibt es Alternativen .
mr.spuratic
1
@ mr.spuratic, verschiedene Distributionen haben unterschiedliche Nummerierungsschemata. Diese Art von Problem tritt normalerweise bei libjpeg und bei openssl auf, wo beispielsweise debian und redhat es unterschiedlich machen. Die binäre Bearbeitung ist so sicher wie das Hinzufügen von Symlinks.
Stéphane Chazelas