Коли хвастался, значит нужно показать как это делается:
Пишем такое консольное приложение:
Program ownof;
{$APPTYPE CONSOLE}
{$R *.res}
Type
kernel_ulong_t = UInt64;
kernel_long_t = Int64;
TStat = packed record
st_dev : kernel_ulong_t;
st_ino : kernel_ulong_t;
st_nlink : kernel_ulong_t;
st_mode : UInt32;
st_uid : UInt32;
st_gid : UInt32;
__pad0 : UInt32;
st_rdev : kernel_ulong_t;
st_size : kernel_long_t;
st_blksize : kernel_long_t;
st_blocks : kernel_long_t;
st_atime : kernel_ulong_t;
st_atime_nsec : kernel_ulong_t;
st_mtime : kernel_ulong_t;
st_mtime_nsec : kernel_ulong_t;
st_ctime : kernel_ulong_t;
st_ctime_nsec : kernel_ulong_t;
__unused : array[0..2] of kernel_long_t;
end;
(*
Функция mystat реализована на ассемблере. Откомпилирована в Linux и
объектный файл перенесен в проект.
*)
function mystat(path_to_file : PAnsiChar; var S : TStat) : NativeUInt;
external 'mystat.o'
var
S : TStat;
Begin
// Файл a.txt создан руками в том-же каталоге, куда помещается исполняемый
// модуль данной программы.
mystat('a.txt', S);
Writeln('Owner is ', S.st_uid);
End.
Исходный код для mystat.asm:
.text
# function mystat(path_to_file : PAnsiChar; var S : TStat) : NativeUInt;
#
# Параметры:
# rdi - path_to_file
# rsi - @S
#
# Параметры функции помещаются, в те-же регистры, что и требует интерфейс системных
# вызовов - не делаем ничего лишнего !
#
# После выхода из режима ядра в регистре rax будет содержаться рузультат работы
# системного вызова. Наша функция тоже возвращает рузультат в rax - не делаем
# ничего лишнего !
.global mystat
.align 16
mystat:
movq $4, %rax # поместим номер системного вызова в регистр rax
syscall # переходим в режим ядра
ret
Все данные для написания этой программы получены из исходных кодов ядра Linux 5.11.10.
Данная реализация привязана к нескольким вещам:
К архитектуре процессора (т.к. mystat написана на x86_64 ассемблере )
К ядру Linux (т.е. программа не будет работать на других Unix подобных ОС)
К структуре с которой работает системный вызов sys_newstat (так называется, та процедура в ядре, что выполнает нужные нам действия).
Способу выполнения системных вызовов (сам способ привязан к архитектуре процессора и к ядру ОС)
Пока ничего из этого не поменяется всё будет ОК. И никаких Вам libc.
PS:
Номер системного вызова и его имя взято из файла arch/x86/entry/syscalls/syscall_64.tbl .
Как делать системный вызов написано тут: arch/x86/entry/entry_64.S .
Описание структуры взято из файла arch/x86/include/uapi/asm/stat.h