2010-02-24 11 views
10

Sto usando un sistema di sviluppo dove devo specificare il nome della lib quando accedo ad una funzione al suo interno.Identificazione quale libreria di sistema Linux contiene una funzione

Ho usato funzioni come open() prima e in qualche modo ho scoperto che sono in libc.so.

Ora voglio usare lstat(), ma sembra che questo non sia in libc. Purtroppo, le pagine man che ho guardato non documentano la posizione delle funzioni.

Così, due domande:

  1. Può qualcuno dire che ospita lib lstat?
  2. Come posso trovarlo in generale? Altro che usare "nome" grep su tutti i file nella cartella lib, intendo.
+1

non è possibile utilizzare il 'nm' comando per questo: 'nm lib * .so * | grep lstat'. Da qui il test non testato, non la risposta. –

+1

Quale sistema di sviluppo è questo? –

+0

lstat non è presente come simbolo in libc, sembra essere chiamato __lxstat, e probabilmente è risolto al tempo di collegamento – nos

risposta

5

costruire un semplice testcase in C, compila ed eseguire 'ldd -r 'su di esso per controllare quali librerie sono caricate. Se non si ottiene lstat() in C, si ha un problema sul proprio dispositivo di sviluppo. O questo env risale prima dell'età dei collegamenti simbolici :-)

+0

Buona idea. In questo caso il problema in realtà era che non c'è davvero lstat nella lib, ma solo __lxstat. Che potrebbe essere visto nelle intestazioni, però. –

+0

Questa idea non è ottimale se esiste una funzione da libreria sconosciuta e non collegata in by-default. Non ci sarà alcun binario per eseguire 'ldd' prima che il nome della libreria venga aggiunto al collegamento binario. PS: c'è anche 'LD_DEBUG = all./Binary' per vedere il vero processo di collegamento; ld.so mostrerà quali simboli vengono richiesti e dove cerca di trovarli. – osgx

-1

Dalla pagina man (uomo 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

L'OP vuole sapere in quale libreria verranno salvate le funzioni, non quale file di intestazione. – Duck

3

questo è un modo per farlo:

[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?Non può essere giusto. Utilizzare invece il comando 'nm'. Ad esempio 'nm lib * .so * | grep lstat'. –

+0

Sì, il grep mostra anche _imports_, credo, quindi il risultato sbagliato su libperl. –

+1

libperl corrisponde perché contiene la stringa 'lstat()', che è una funzione Perl implementata qui. Questo ha poco a che fare con il syscall sottostante. – ephemient

-1

lstat è in libc, e libc è collegata per impostazione predefinita. Non è necessario fare qualcosa per utilizzare lstat oltre ad includere il file di intestazione per esso #include <sys/stat.h>

pagine di solito dichiarano quale libreria si trovano.

+1

Penso di aver chiaramente indicato che non si tratta di C ma di un ambiente di sviluppo in cui ho bisogno di specificare esplicitamente la lib. –

+0

Tuttavia, è in libc, quindi collega a libc. Se questo è un ambiente che ha poco a che fare con ciò che si trova normalmente su una macchina Linux, è necessario dirci che tipo di ambiente è questo. Non esiste un modo per sapere dove si trovano le funzioni oltre alla sua documentazione, che a volte manca. – nos

+0

nos - l'unico motivo per cui non sono riuscito a trovarlo in libc era che non è stato dichiarato lì, come hai sottolineato sopra. L'ho risolto ora, grazie. –

1

Quando cross-compilo applicazioni Windows su Linux, se ho un problema con il collegamento tendo a usare questo script che ho chiamato mingw-findin. Uno script simile potrebbe essere usato per la compilazione Linux regolare, invece di usare l'alternativa mingw, usare il normale nm e invece di cercare nella directory prefissa cross-compile, guarda in/usr/lib. Per utilizzare questo script, corro

NameOfFunction ./mingw-findin

Ecco il codice:

#!/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

Oppure 'nm' con la bandiera' -D'? Su Linux ci sono anche/lib; quindi dovremmo controllare /etc/ld.so.conf e /etc/ld.so.conf.d/* per i percorsi di ricerca delle librerie. – osgx

0

provate questo:

$ 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] 
Problemi correlati