2010-02-24 6 views
10

Ich benutze ein dev-System, wo ich den lib-Namen angeben muss, wenn ich auf eine Funktion darin zugreifen.Identifizieren, welche Linux-Systembibliothek eine Funktion enthält

Ich habe Funktionen wie open() vor, und irgendwie herausgefunden, dass sie in libc.so sind.

Jetzt möchte ich lstat() verwenden, aber es scheint, dass diese nicht in libc ist. Leider dokumentieren die man-Seiten, die ich angeschaut habe, nicht den Ort der Funktionen.

Also, zwei Fragen:

  1. Kann jemand sagen, welche lib Hosts lstat?
  2. Wie kann ich das im Allgemeinen herausfinden? Anders als die Verwendung von grep "name" für alle Dateien im lib-Ordner, meine ich.
+1

Können Sie nicht die 'nm' verwenden Befehl dafür: 'nm lib * .so * | grep lstat'. Ungetestet daher der Kommentar, keine Antwort. –

+1

Welches Dev-System ist das? –

+0

Lstat ist nicht als ein Symbol in libc vorhanden, es scheint __lxstat zu sein, und das wird wahrscheinlich zur Verbindungszeit gelöst – nos

Antwort

5

einen einfachen Testfall in C Bau, kompilieren und ausführen ‚ldd -r 'um zu überprüfen, welche libs geladen sind. Wenn Sie in C nicht lstat() erhalten, dann haben Sie ein Problem mit Ihrem dev env. Oder dieses Env stammt aus dem Alter von Symlinks :-)

+0

Gute Idee. In diesem Fall war das Problem tatsächlich, dass es wirklich keine lstat in der lib gibt, sondern nur __lxstat. Was aber in den Kopfzeilen zu sehen war. –

+0

Diese Idee ist nicht zu gut, wenn es eine Funktion von unbekannter und nicht verlinkt-in-durch-Standard-Bibliothek gibt. Es wird keine Binärdatei geben, um 'ldd' auszuführen, bevor der Bibliotheksname der Binärverknüpfung hinzugefügt wird. PS: Es gibt auch 'LD_DEBUG = all./Binary', um den tatsächlichen Verknüpfungsprozess zu sehen; ld.so wird zeigen, welche Symbole gefragt werden und wo sie zu finden sind. – osgx

-1

Von der Manpage (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 möchte wissen, in welcher Bibliothek die Funktionen schließlich gespeichert werden, nicht welche Header-Datei. – Duck

3

Dies ist eine Möglichkeit, es zu tun:

[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?Das kann nicht stimmen. Verwenden Sie stattdessen den Befehl 'nm'. Wie zum Beispiel 'nm lib * .so * | grep lstat'. –

+0

Ja, das grep zeigt auch _import_, glaube ich, also das falsche ergebnis über libperl. –

+1

libperl passt, weil es den String 'lstat()' enthält, was eine Perl-Funktion ist, die hier implementiert ist. Das hat wenig mit dem zugrundeliegenden Syscall zu tun. – ephemient

-1

lstat in libc ist, und libc ist standardmäßig eingebunden. Sie brauchen nichts zu tun lstat zu verwenden, außer die Header-Datei auch für sie #include <sys/stat.h>

Mann Seiten in der Regel angeben, welche Bibliothek sie sind in.

+1

Ich glaube, ich habe klar darauf hingewiesen, dass es hier nicht um C geht, sondern um ein dev env, wo ich explizit die lib angeben muss. –

+0

Trotzdem ist es in libc, also Link zu libc. Wenn dies eine Umgebung ist, die wenig mit dem zu tun hat, was normalerweise auf einem Linux-Rechner zu finden ist, müssen Sie uns sagen, um welche Art von Umgebung es sich handelt. Es gibt keinen Weg zu wissen, wo Funktionen neben seiner Dokumentation - die manchmal fehlt. – nos

+0

nos - der einzige Grund, warum ich es nicht in libc finden konnte, war, dass es dort nicht erklärt wurde, wie Sie oben ausgeführt haben. Ich habe es jetzt gelöst, danke. –

1

Wenn ich Windows-Anwendungen unter Linux kompilieren, wenn ich ein Problem mit der Verknüpfung habe, neige ich dazu, dieses Skript zu verwenden, das ich mingw-findin genannt habe. Ein ähnliches Skript könnte für die normale Linux-Kompilierung verwendet werden. Verwenden Sie statt der Mingw-Alternative reguläre nm und suchen Sie nicht in dem vorkompilierten Kreuzkompilierverzeichnis, sondern in/usr/lib. Um dieses Skript zu verwenden, ich laufe

./mingw-findin NameOfFunction

Hier ist der Code:

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

Oder 'nm' mit' -D' Flagge? Unter Linux gibt es auch/lib; Daher sollten wir /etc/ld.so.conf und /etc/ld.so.conf.d/* nach Suchpfaden für Bibliotheken durchsuchen. – osgx

0

Versuchen Sie folgendes:

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