Определение того, какая системная библиотека Linux содержит функцию

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

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

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

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

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

Ответ 1

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

Ответ 3

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

./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

Ответ 4

Попробуйте следующее:

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

Ответ 5

Из man-страницы (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);

Ответ 6

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

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