Scopri quali simboli nel tuo eseguibile stanno creando la dipendenza dalla versione indesiderata di 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
Guarda nella libreria da cui dipende per vedere se ci sono simboli nelle versioni precedenti a cui puoi collegarti:
$ 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
Siamo fortunati!
Richiedi la versione da GLIBC_2.2.5
nel tuo codice:
#include <limits.h>
#include <stdlib.h>
__asm__(".symver realpath,[email protected]_2.2.5");
int main () {
realpath ("foo", "bar");
}
Osserva che GLIBC_2.3 non è più necessario:
$ 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
Per ulteriori informazioni, vedere http://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103.
Sfortunatamente, la soluzione di @Sam non funziona bene nella mia situazione. Ma secondo il suo modo, ho trovato il mio modo per risolverlo.
Questa è la mia situazione:
Sto scrivendo un programma C++ utilizzando il framework Thrift (è un middleware RPC). Preferisco il collegamento statico al collegamento dinamico, quindi il mio programma è collegato a libthrift.a staticamente invece di libthrift.so . Tuttavia, libthrift.a è collegato dinamicamente a glibc, e dal mio libthrift.a è costruito sul mio sistema con glibc 2.15, il mio libthrift.a utilizza memcpy della versione 2.14([email protected]_2.14 ) fornito da glibc 2.15.
Ma il problema è che le nostre macchine server hanno solo la versione 2.5 di glibc che ha solo [email protected]_2.2.5 . È molto più basso di [email protected]_2.14 . Quindi, ovviamente, il mio programma server non può essere eseguito su quelle macchine.
E ho trovato questa soluzione:
-
Utilizzo di .symver per ottenere il riferimento a [email protected]_2.2.5 .
-
Scrivi il mio __wrap_memcpy funzione che chiama semplicemente [email protected]_2.2.5 direttamente.
-
Quando colleghi il mio programma, aggiungi -Wl,--wrap=memcpy opzione per gcc/g++.
Il codice coinvolto nei passaggi 1 e 2 è qui:https://gist.github.com/nicky-zs/7541169