GNU/Linux >> Znalost Linux >  >> Linux

Propojení se starou verzí knihovny libc pro zajištění většího pokrytí aplikací

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í:

  1. Pomocí .symver získáte ref na adresu [email protected]_2.2.5 .

  2. Napsat vlastní __wrap_memcpy funkce, která pouze volá [email protected]_2.2.5 přímo.

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


Linux
  1. Jak zkontrolovat verzi knihovny libc na Debian Linuxu

  2. Fedora – Vynutit Dnf instalaci staré verze balíčku?

  3. Upozornění libpng:Nekompatibilní verze libpng v aplikaci a knihovně

  1. Propojení se starší verzí symbolu v souboru .so

  2. přemístění R_X86_64_32S proti propojování Chyba

  3. Jak odstranit starou verzi Javy a nainstalovat novou verzi

  1. Ubuntu – Pango-error verze Harfbuzz příliš stará?

  2. Nainstalovat Vagrant verzi 1.5 nebo vyšší na 14.10?

  3. Koupit starou verzi Windows a přesto získat upgrade zdarma?