2010-02-24 17 views
10

Estoy usando un sistema de desarrollo en el que tengo que especificar el nombre de la lib cuando accedo a una función dentro de él.Identificación de qué biblioteca del sistema Linux contiene una función

He usado funciones como open() antes, y de alguna manera descubrí que están en libc.so.

Ahora quiero usar lstat(), pero parece que este no está en libc. Lamentablemente, las páginas man que miré no documentan la ubicación de las funciones.

Así, dos preguntas:

  1. Puede alguien decir qué máquinas lib lstat?
  2. ¿Cómo puedo saberlo en general? Además de usar grep "nombre" en todos los archivos en la carpeta lib, quiero decir.
+1

no se puede utilizar el 'nm' comando para esto: 'nm lib * .so * | grep lstat'. No probado por lo tanto el comentario, no respuesta. –

+1

¿Qué sistema de desarrollo es este? –

+0

lstat no está presente como un símbolo en libc, parece llamarse __lxstat, y probablemente se resuelva en el momento del enlace – nos

Respuesta

5

construir un caso de prueba simple en C, compilar y ejecutar 'LDD -r 'en él para verificar qué bibliotecas están cargadas. Si no obtiene lstat() en C, entonces tiene un problema en su entorno de desarrollo. O este entorno data de antes de la edad de los enlaces simbólicos :-)

+0

Buena idea. En este caso, el problema en realidad era que realmente no hay lstat en la lib, sino solo __lxstat. Lo cual se puede ver en los encabezados, sin embargo. –

+0

Esta idea no es muy buena si hay funciones de una biblioteca desconocida y no enlazada por defecto. No habrá ningún binario para ejecutar 'ldd' antes de agregar el nombre de la biblioteca al enlace binario. PD: también hay 'LD_DEBUG = all./Binary' para ver el proceso de enlace real; ld.so mostrará qué símbolos se preguntan y dónde intenta encontrarlos. – osgx

-1

Desde la página de manual (lstat hombre):

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 quiere saber en qué biblioteca se almacenan las funciones, no en qué archivo de encabezado. – Duck

3

Esta es una manera de hacerlo:

[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?Eso no puede ser correcto. Use el comando 'nm' en su lugar. Tales como 'nm lib * .so * | grep lstat'. –

+0

Sí, el grep también muestra _imports_, creo, por lo tanto, el resultado incorrecto sobre libperl. –

+1

libperl coincide porque contiene la cadena 'lstat()', que es una función de Perl implementada aquí. Eso tiene poco que ver con el syscall subyacente. – ephemient

-1

lstat es en libc, y libc está vinculado de forma predeterminada. No es necesario hacer nada para usar lstat además de incluir el archivo de cabecera para ello #include <sys/stat.h>

páginas man generalmente indican qué biblioteca que se encuentran.

+1

Creo que señalé claramente que esto no se trata de C, sino de un entorno de desarrollo en el que debo especificar la lib explícitamente. –

+0

Sin embargo, está en libc, así que enlace a libc. Si este es un entorno que tiene poco que ver con lo que normalmente se encuentra en una máquina Linux, debe decirnos qué tipo de entorno es este. No existe una forma común de saber dónde residen las funciones además de su documentación, que a veces falta. – nos

+0

nos - la única razón por la que no pude encontrarlo en libc fue porque no fue declarado allí, como usted señaló anteriormente. Lo he resuelto ahora, gracias. –

1

Cuando compilo aplicaciones de Windows en Linux, si tengo un problema con los enlaces, tiendo a usar este script que llamé mingw-findin. Un script similar podría usarse para la compilación regular de Linux, simplemente en lugar de usar la alternativa de mingw, use nm regular y en lugar de buscar en el directorio prefijado de compilación cruzada, busque en/usr/lib. Para utilizar este script, corro

NameOfFunction ./mingw-findin

Aquí está el código:

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

O 'nm' con la bandera' -D'? En Linux también hay/lib; así que deberíamos verificar /etc/ld.so.conf y /etc/ld.so.conf.d/* para las rutas de búsqueda de las bibliotecas. – osgx

0

Prueba esto:

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