Где определение функции POSIX stat в Linux?

В Windows stat и почти все другие функции C/POSIX, предоставляемые Windows, определены в msvcrt.dll, которая является библиотекой времени выполнения C.

Я знаю, что в Linux многие функции POSIX C являются системными вызовами. Я также знаю, что при компоновке программы у вас не может быть неопределенных ссылок. Я обыскал все so файлы в /lib и /usr/lib на наличие символа stat или "искаженной/префиксной" формы, но ничего не нашел. Это команда, которую я использовал:

objdump -T /lib/*.so* /usr/lib/*.so* | grep "stat"

Это не оказалось stat, которое я искал.

Итак, мой вопрос становится следующим: где он и любые другие «системные вызовы» определены?


person rubenvb    schedule 09.06.2012    source источник
comment
@kryrn Я думаю, что ему нужен код-заглушка, который вызывает ядро. Я предполагаю, что файл .o ускользнул от поиска .so, но у меня нет под рукой Linux.   -  person Potatoswatter    schedule 09.06.2012
comment
@kryrn очень бесполезен. Компоновщику необходимо связать некоторую библиотеку или исполняемый файл, содержащий определение или переадресованное определение (в случае библиотеки импорта).   -  person rubenvb    schedule 09.06.2012
comment
@rubenvb: Вы имеете в виду декларацию, это нечто другое. Один момент.   -  person Florian    schedule 09.06.2012
comment
@krynr Нет, объявление (без определения) - это то, что вы найдете в заголовочном файле. Компилятор не знает, как подключить это к ядру.   -  person Potatoswatter    schedule 09.06.2012
comment
@Potatoswatter: см. мой ответ ниже.   -  person Florian    schedule 09.06.2012


Ответы (4)


Вы можете сделать ядро Linux системные вызовы даже без использования libc (но это, вероятно, плохая практика). В Linux Assembly Howto объясняется (в главах 5 и 6), как это сделать (на x86 Linux 32-битная версия как минимум).

Но я думаю, что это плохая идея. Переход через libc является хорошей практикой и может быть даже быстрее (например, из-за VDSO), и является более портативным.

person Basile Starynkevitch    schedule 10.06.2012
comment
Я знаю, может показаться, что это не совсем ответ на вопрос, но это ответ на вопрос, ведущий к этому вопросу :). Спасибо. - person rubenvb; 10.06.2012

На моей машине с Linux я могу найти символ stat (слабый) и __stat (неслабый) в /usr/lib/libc.a.

person ouah    schedule 09.06.2012
comment
Ну, теперь я чувствую себя тупым. Список оказался намного длиннее, чем я себе представлял :/. Так что, я думаю, нет способа сбросить libc в Linux так, как msvcrt.dll можно оставить в Windows? - person rubenvb; 09.06.2012
comment
Конечно, вы можете сбросить код stat из libc.a, но, как упомянул @krynr, весь реальный код stat находится в ядре. В libc вы в основном найдете только вызов системного вызова. - person ouah; 09.06.2012
comment
Еще несколько поисков в Google указывают мне на использование syscall. Будет ли это правильным аналогом низкоуровневых вызовов функций Windows API? - person rubenvb; 09.06.2012

Во-первых, stat неоднозначно; есть системный вызов stat и есть функция stat, которую можно вызвать из пространства пользователя, которая вызывает системный вызов. Эта последняя функция (по крайней мере, в моей системе) определена в /usr/include/sys/stat.h (правильно, она находится в заголовочном файле). На самом деле у него есть несколько определений (все одни лайнеры, которые вызывают разные функции, например, __fxstat), из которых одно выбирается в зависимости от компилятора, системы и многого другого.

В любом случае, stat (и другие системные вызовы) — это просто оболочки, которые вызывают ядро ​​(обычно с большим количеством оркестровки). Вот почему я изначально был сбит с толку тем, что вы имели в виду. Надеюсь, я смог помочь, несмотря на мой бесполезный первый комментарий.

person Florian    schedule 09.06.2012
comment
Происхождение этого вопроса заключается в том, что в Windows я могу полностью обойти такие вещи, как stat и, следовательно, libc/msvcrt и напрямую вызвать kernel32. Я хотел бы знать, можно ли легко/безопасно добиться этого в Linux. - person rubenvb; 09.06.2012
comment
@rubenvb: вы можете использовать syscall или __SYSCALL. Но тогда это будет зависеть от платформы. - person Florian; 09.06.2012
comment
Я пометил этот вопрос Linux, не так ли? Или вы имеете в виду зависимость от архитектуры? - person rubenvb; 09.06.2012
comment
@rubenvb: возможно: процессор, версия Linux, 32 или 64 бит. Зависимость от платформы означает, что вы используете функции, которые предоставляет только одна платформа, а платформа означает все, что вы не программируете. - person Florian; 09.06.2012