GNU/Linux >> Linux Esercitazione >  >> Linux

Collegamento a una vecchia versione di libc per fornire una maggiore copertura dell'applicazione

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:

  1. Utilizzo di .symver per ottenere il riferimento a [email protected]_2.2.5 .

  2. Scrivi il mio __wrap_memcpy funzione che chiama semplicemente [email protected]_2.2.5 direttamente.

  3. 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


Linux
  1. Ubuntu – Errore Pango versione Harfbuzz troppo vecchia?

  2. Avviso libpng:versione libpng incompatibile nell'applicazione e nella libreria

  3. Collegamento alla versione precedente del simbolo in un file .so

  4. Come rimuovere la vecchia versione di Java e installare la nuova versione

  5. Acquista ora la vecchia versione di Windows e ricevi comunque l'aggiornamento gratuitamente?

Come controllare la versione della libreria libc su Debian Linux

Come eseguire il downgrade di un'applicazione o di un pacchetto su Ubuntu

DF-SHOW – Un Terminal File Manager basato su una vecchia applicazione DOS

Come conoscere la versione dell'applicazione prima dell'installazione in Ubuntu

come configurare centos 8 per l'avvio con la vecchia versione del kernel

Come rimuovere la vecchia versione degli snap installati