Определение, какая системная библиотека Linux содержит функцию - PullRequest
10 голосов
/ 24 февраля 2010

Я использую систему разработки, где мне нужно указывать имя библиотеки при доступе к функции внутри нее.

Ранее я использовал такие функции, как open (), и каким-то образом обнаружил, что они находятся в libc.so.

Теперь я хочу использовать lstat (), но похоже, что этого нет в libc. К сожалению, справочные страницы, на которые я смотрел, не документируют расположение функций.

Итак, два вопроса:

  1. Может кто-нибудь сказать, в какой библиотеке находится lstat?
  2. Как я вообще могу это выяснить? Я имею в виду, кроме использования grep "name" для всех файлов в папке lib.

Ответы [ 6 ]

5 голосов
/ 24 февраля 2010

Создайте простой тестовый пример на C, скомпилируйте его и запустите на нем 'ldd -r', чтобы проверить, какие библиотеки загружены. Если вы не получаете lstat () в C, тогда у вас есть проблема с вашей средой разработки. Или это env восходит до возраста символических ссылок: -)

3 голосов
/ 24 февраля 2010

Это один из способов сделать это:

tomislav@malik:~$ cd /usr/lib
tomislav@malik:/usr/lib$ grep "lstat()" *
Binary file libperl.so.5.10 matches
Binary file libperl.so.5.10.0 matches
tomislav@malik:/usr/lib$ 
1 голос
/ 19 ноября 2015

Когда я кросс-компилирую приложения Windows в Linux, если у меня возникают проблемы со связыванием, я склонен использовать этот скрипт, который я назвал mingw-findin. Аналогичный сценарий можно использовать для обычной компиляции Linux, просто вместо использования альтернативы mingw, используйте обычный nm и вместо поиска в каталоге с префиксом кросс-компиляции, посмотрите в / usr / lib. Чтобы использовать этот скрипт, я запускаю

. / Mingw-findin NameOfFunction

Вот код:

#!/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 голосов
/ 18 мая 2017

Попробуйте это:

$ 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]
0 голосов
/ 24 февраля 2010

lstat в libc, и libc связан по умолчанию. Вам не нужно ничего делать, чтобы использовать lstat, кроме того, чтобы включить для него файл заголовка #include <sys/stat.h>

В справочных страницах обычно указывается, в какой библиотеке они находятся.

0 голосов
/ 24 февраля 2010

Из справочной страницы (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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...