Jak znaleźć wersję libc, do której prowadzi moja aplikacja?

14

Podczas budowania aplikacji przy użyciu g ++ nie przekazuję jawnie biblioteki libc jako biblioteki, z którą można się połączyć w taki sam sposób, jak w przypadku innych bibliotek ( -lpthreadna przykład przekazywanie ). Wiem, że libc ma taką nazwę, libc.so.6ale wiem, że tak naprawdę nie jest to biblioteka, ale coś w rodzaju wskaźnika do innej wersji libc (np. libc-2.15.so). Moje pytanie brzmi: czy mam wiele wersji libc na moim komputerze, w jaki sposób mogę stwierdzić, która z nich jest faktycznie połączona za pośrednictwem libc.so.6.

matematyk 1975
źródło

Odpowiedzi:

16

lddpowinno być narzędziem twojego wyboru. To daje ci bibliotekę współdzieloną faktycznie połączoną.

confus@confusion:~/misc/test$ ldd -r -v testendian
    linux-vdso.so.1 =>  (0x00007fffbcfff000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a5a4c5000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1a5a8a5000)

    Version information:
    ./testendian:
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

W przypadku libc możesz po prostu uruchomić .soplik i zostaniesz poinformowany o wersji biblioteki.

confus@confusion:~/misc/test$ /lib/x86_64-linux-gnu/libc.so.6 
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.
dezorientować
źródło
Wiedziałem o ldd, nie wiedziałem, że możesz po prostu prowadzić bibliotekę - dzięki. Niestety moje dane wyjściowe z uruchomienia biblioteki nie pokazują wersji ....
matematyk1975
Nie zwracaj uwagi na to, że byłem idiotą - dzięki za odpowiedź!
matematyk
1
Dziękuję za odpowiedź. Czy możesz podać jakieś informacje, które mówi mi wyjście ldd? Czy to oznacza, że testendianwymaga GLIBC_2.3 lub GLIBC_2.2.5?
bonanza
Jestem dość pewny, oznacza to, że program potrzebuje GLIBC 2.2.5, a moduł ładujący bibliotekę ld-linux-x86-64 został zbudowany z GLIBC_2.3. Oba w pewnym sensie. Ale weź to z odrobiną soli, ponieważ nie znalazłem odniesienia.
con-f-use
Działa świetnie w przypadku dynamicznych plików wykonywalnych, ale nie tak bardzo w przypadku plików statycznych! (Muszę sprawdzić, co mam łączenie przeciwko because ostrzeżenia gcc: warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking)
jpaugh