Определение того, какая системная библиотека Linux содержит функцию
Я использую систему dev, где я должен указать имя lib при доступе к функции внутри нее.
Я раньше использовал функции open() и как-то выяснил, что они находятся в libc.so.
Теперь я хочу использовать lstat(), но похоже, что это не в libc. К сожалению, страницы man, на которые я смотрел, не документируют расположение функций.
Итак, два вопроса:
- Может кто-нибудь сказать, какие хосты lib lstat?
- Как я могу узнать об этом? Кроме использования grep "name" для всех файлов в папке lib, я имею в виду.
Ответы
Ответ 1
Создайте простой тестовый файл в C, скомпилируйте его и запустите 'ldd -r', чтобы проверить, какие библиотеки загружены. Если вы не получите lstat() в C, у вас возникнет проблема с вашим dev env. Или это env датируется до возраста символических ссылок: -)
Ответ 2
Это один из способов сделать это:
[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$
Ответ 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-страницы обычно указывают, в какой библиотеке они находятся.