GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verknüpfen mit einer alten Version von libc, um eine größere Anwendungsabdeckung bereitzustellen

Finden Sie heraus, welche Symbole in Ihrer ausführbaren Datei die Abhängigkeit von der unerwünschten Version von glibc erzeugen.

$ objdump -p myprog
...
Version References:
  required from libc.so.6:
    0x09691972 0x00 05 GLIBC_2.3
    0x09691a75 0x00 03 GLIBC_2.2.5

$ objdump -T myprog | fgrep GLIBC_2.3
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.3   realpath

Sehen Sie in der abhängigen Bibliothek nach, ob es Symbole in älteren Versionen gibt, die Sie verlinken können:

$ objdump -T /lib/libc.so.6 | grep -w realpath
0000000000105d90 g    DF .text  0000000000000021 (GLIBC_2.2.5) realpath
000000000003e7b0 g    DF .text  00000000000004bf  GLIBC_2.3   realpath

Wir haben Glück!

Fordern Sie die Version von GLIBC_2.2.5 an in Ihrem Code:

#include <limits.h>
#include <stdlib.h>

__asm__(".symver realpath,[email protected]_2.2.5");

int main () {
    realpath ("foo", "bar");
}

Beachten Sie, dass GLIBC_2.3 nicht mehr benötigt wird:

$ objdump -p myprog
...
Version References:
  required from libc.so.6:
    0x09691a75 0x00 02 GLIBC_2.2.5

$ objdump -T myprog | grep realpath
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 realpath

Weitere Informationen finden Sie unter http://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103.


Leider funktioniert die Lösung von @ Sam in meiner Situation nicht gut. Aber auf seine Weise habe ich meinen eigenen Weg gefunden, das zu lösen.

Dies ist meine Situation:

Ich schreibe ein C++-Programm mit dem Thrift-Framework (es ist eine RPC-Middleware). Ich bevorzuge statische Links gegenüber dynamischen Links, daher ist mein Programm mit libthrift.a verknüpft statisch anstelle von libthrift.so . Allerdings libthrift.a ist dynamisch mit glibc gelinkt, und seit meiner libthrift.a ist auf meinem System mit glibc 2.15 aufgebaut, meiner libthrift.a verwendet memcpy der Version 2.14 ([email protected]_2.14 ) bereitgestellt von glibc 2.15.

Aber das Problem ist, dass unsere Servermaschinen nur die glibc-Version 2.5 haben, die nur [email protected]_2.2.5 hat . Es ist viel niedriger als [email protected]_2.14 . Daher kann mein Serverprogramm natürlich nicht auf diesen Maschinen ausgeführt werden.

Und ich habe diese Lösung gefunden:

  1. Verwenden von .symver, um den Verweis auf [email protected]_2.2.5 zu erhalten .

  2. Schreiben Sie mein eigenes __wrap_memcpy Funktion, die einfach [email protected]_2.2.5 aufruft direkt.

  3. Fügen Sie beim Linken meines Programms -Wl,--wrap=memcpy hinzu Option zu gcc/g++.

Der Code für die Schritte 1 und 2 ist hier:https://gist.github.com/nicky-zs/7541169


Linux
  1. Ubuntu – Pango-Fehler Harfbuzz-Version zu alt?

  2. Fedora – Dnf zwingen, eine alte Version eines Pakets zu installieren?

  3. Win-KeX-Version 2.0

  4. Wie kann ich meine alte Version von node.js deinstallieren oder aktualisieren?

  5. Was bedeutet Warnung:Das Verknüpfen der gemeinsam genutzten Bibliothek mit der statischen Bibliothek ist nicht portierbar?

So überprüfen Sie die Version der libc-Bibliothek unter Debian Linux

So führen Sie ein Downgrade von Anwendungen oder Paketen unter Ubuntu durch

DF-SHOW – Ein Terminal-Dateimanager, der auf einer alten DOS-Anwendung basiert

So kennen Sie die Version der Anwendung vor der Installation in Ubuntu

Wie konfiguriere ich Centos 8, um mit der alten Kernel-Version zu booten?

So entfernen Sie alte Versionen von installierten Snaps