Zjistěte, které symboly ve vašem spustitelném souboru vytvářejí závislost na nežádoucí verzi glibc.
$ 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
Podívejte se do závislé knihovny a zjistěte, zda ve starších verzích nejsou nějaké symboly, na které lze odkazovat:
$ 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
Máme štěstí!
Verzi si vyžádejte z GLIBC_2.2.5
ve vašem kódu:
#include <limits.h>
#include <stdlib.h>
__asm__(".symver realpath,[email protected]_2.2.5");
int main () {
realpath ("foo", "bar");
}
Všimněte si, že GLIBC_2.3 již není potřeba:
$ 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
Další informace najdete na http://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103.
Bohužel @Samovo řešení v mé situaci nefunguje dobře. Ale podle jeho způsobu jsem našel svůj vlastní způsob, jak to vyřešit.
Toto je moje situace:
Píšu program v C++ pomocí rámce Thrift (je to middleware RPC). Dávám přednost statickému odkazu před dynamickým odkazem, takže můj program je propojen s libthrift.a staticky místo libthrift.so . Nicméně libthrift.a je dynamicky propojen s glibc a od mého libthrift.a je postaven na mém systému s glibc 2.15, můj libthrift.a používá memcpy verze 2.14([email protected]_2.14 ) poskytuje glibc 2.15.
Problém je ale v tom, že naše servery mají pouze verzi glibc 2.5, která má pouze [email protected]_2.2.5 . Je mnohem nižší než [email protected]_2.14 . Takže můj serverový program samozřejmě nemůže běžet na těchto počítačích.
A našel jsem toto řešení:
-
Pomocí .symver získáte ref na adresu [email protected]_2.2.5 .
-
Napsat vlastní __wrap_memcpy funkce, která pouze volá [email protected]_2.2.5 přímo.
-
Při propojování mého programu přidejte -Wl,--wrap=memcpy možnost gcc/g++.
Kód zahrnutý v krocích 1 a 2 je zde:https://gist.github.com/nicky-zs/7541169