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:
-
Verwenden von .symver, um den Verweis auf [email protected]_2.2.5 zu erhalten .
-
Schreiben Sie mein eigenes __wrap_memcpy Funktion, die einfach [email protected]_2.2.5 aufruft direkt.
-
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