2010-02-24 17 views
10

Używam systemu dev, w którym muszę określić nazwę biblioteki podczas uzyskiwania dostępu do funkcji w niej.Identyfikacja, która biblioteka systemowa Linux zawiera funkcję

Użyłem wcześniej funkcji takich jak open() i jakoś dowiedziałem się, że są w libc.so.

Teraz chcę użyć lstat(), ale wydaje się, że ten nie jest w bibliotece libc. Niestety, strony podręcznika, na które patrzyłem, nie dokumentują lokalizacji funkcji.

Więc dwa pytania:

  1. Może ktoś powiedzieć, który lib gospodarze lstat?
  2. Jak mogę to ogólnie stwierdzić? Inaczej niż grep "name" na wszystkich plikach w folderze lib, mam na myśli.
+1

nie można użyć 'nm' polecenie dla tego: 'nm lib * .so * | grep lstat'. Nieprześcigniony stąd komentarz, a nie odpowiedź. –

+1

Który system jest taki? –

+0

lstat nie jest obecny jako symbol w bibliotece libc, wydaje się nazywać __lxstat i prawdopodobnie zostanie rozwiązany w czasie połączenia – nos

Odpowiedz

5

zbudować prosty testcase w C, skompilować i uruchomić „ldd -r 'na nim, aby sprawdzić, które biblioteki są załadowane. Jeśli nie otrzymasz lstat() w C, oznacza to, że masz problem ze swoim środowiskiem deweloperskim. Lub ten env sięga przed wiekiem dowiązań symbolicznych :-)

+0

Dobry pomysł. W tym przypadku problem polegał na tym, że naprawdę nie ma lstat w bibliotece, ale tylko __lxstat. Co można jednak zobaczyć w nagłówkach. –

+0

Ten pomysł nie jest zbyt dobry, jeśli istnieje funkcja z nieznanej biblioteki, która nie jest połączona z domyślną biblioteką. Nie będzie binarnych, aby uruchomić 'ldd', zanim nazwa biblioteki zostanie dodana do binarnego linkowania. PS: istnieje również 'LD_DEBUG = all./Binary', aby zobaczyć rzeczywisty proces łączenia; ld.so pokaże, jakie symbole są zadawane i gdzie próbuje je znaleźć. – osgx

-1

Z podręcznika systemowego (man lstat):

LSTAT(P) 

NAME 
     lstat - get symbolic link status 

SYNOPSIS 
     #include <sys/stat.h> 

     int lstat(const char *restrict path, struct stat *restrict buf); 
+3

OP chce wiedzieć, w jakiej bibliotece przechowywane są funkcje, a nie jaki plik nagłówkowy. – Duck

3

Jest to jeden ze sposobów, aby to zrobić:

[email protected]:~$ cd /usr/lib 
[email protected]:/usr/lib$ grep "lstat()" * 
Binary file libperl.so.5.10 matches 
Binary file libperl.so.5.10.0 matches 
[email protected]:/usr/lib$ 
+2

libperl?To nie może być prawda. Zamiast tego użyj polecenia "nm". Na przykład 'nm lib * .so * | grep lstat'. –

+0

Tak, grep pokazuje także _imports_, jak sądzę, w ten sposób błędny wynik o libperl. –

+1

Dopasowania libperl, ponieważ zawiera ciąg 'lstat()', który jest zaimplementowana tutaj funkcja Perl. To ma niewiele wspólnego z podstawową syscall. – ephemient

-1

lstat jest w libc i libc jest powiązana w domyślnie. Nie musisz nic robić, aby korzystać z lstat poza tym plik nagłówka dla niego #include <sys/stat.h>

stron podręcznika zwykle stwierdzić, które biblioteki są one w.

+1

Myślę, że wyraźnie zaznaczyłem, że nie chodzi o C, ale o dev dev, gdzie muszę jawnie określić bibliotekę. –

+0

Niemniej jednak jest w bibliotece libc, więc połącz się z libc. Jeśli jest to pewne środowisko, które ma niewiele wspólnego z tym, co zwykle znajduje się na komputerze z systemem Linux, musisz powiedzieć nam, jakie to jest środowisko. Nie ma sposobu, aby dowiedzieć się, gdzie znajdują się funkcje poza dokumentacją - czego czasem brakuje. – nos

+0

nos - jedynym powodem, dla którego nie mogłem go znaleźć w bibliotece libc, było to, że nie został tam zadeklarowany, jak wskazałeś powyżej. Rozwiązałem to teraz, dzięki. –

1

Kiedy krzyżuję kompilację aplikacji Windows na Linuksie, jeśli mam problem z łączeniem, używam tego skryptu, który nazwałam mingw-findin. Podobny skrypt może być używany do zwykłej kompilacji Linuksa, zamiast używać alternatywnej wersji mingw, użyj zwykłego nm i zamiast szukać w katalogu z krzyżową kompilacją, spójrz w/usr/lib. Aby użyć tego skryptu, biegnę

./mingw-findin NameOfFunction

Oto kod:

#!/bin/sh 
liblist=` ls /usr/x86_64-w64-mingw32/lib ` 

for i in $liblist 
do 

if x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep -q $1; then 
     echo $i 
     x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep $1 
fi 

done 
+0

Lub 'nm' z flagą' -D'? Na Linuksie istnieją również/lib; więc powinniśmy sprawdzić /etc/ld.so.conf i /etc/ld.so.conf.d/* dla ścieżek wyszukiwania bibliotek. – osgx

0

Spróbuj tego:

$ cat ./foobar.c 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
int main(void) 
{ 
    struct stat buf; 
    return lstat(".", &buf); 
} 


$ LD_DEBUG=bindings ./foobar 2>&1 | grep stat 
31000: binding file ./foobar [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: \ 
normal symbol `__lxstat' [GLIBC_2.2.5] 
Powiązane problemy