Моя среда — x86_64 Ubuntu 22.04.
Что я пробовал
- Парсинг man 2 Страницы: Моя первая была попытка проанализировать текст man 2. Это было эффективно для извлечения типов и имен аргументов, но не позволяло надежно сопоставить системный вызов оболочки (например, open) с реальным системным вызовом ядра (например, openat) из-за ограничений руководств.
- Рекомендация ИИ (AST): ИИ посоветовал мне использовать абстрактное синтаксическое дерево (AST), например с libclang был бы жизнеспособным подходом. Я студент информатики, но в моем университете нет курса по компиляции, поэтому мне не хватает глубокого понимания AST, и я обращаюсь за советом к эксперту здесь.
Моя главная проблема заключается в том, что glibc чрезвычайно сложен, полный директив препроцессора и псевдонимов символов.
Например, если я компилирую программу на C который вызывает open(), readelf показывает динамический символ open@glibc.2.2.5.
Я проследил это до исходного файла glibc open64.c. В моей системе x86_64 определен макрос препроцессора __OFF_T_MATCHES_OFF64_T, который приводит к этому блоку:
C
https://git.launchpad.net/ubuntu/+sourc ... untu/jammy
Код: Выделить всё
#ifdef __OFF_T_MATCHES_OFF64_T
strong_alias (__libc_open64, __libc_open)
strong_alias (__libc_open64, __open)
libc_hidden_weak (__open)
weak_alias (__libc_open64, open)
#endif
Моя цель — найти всю эту цепочку для всех системных вызовов: open@glibc.2.2.5 → слабый_алиас (__libc_open64, open) → __libc_open64 → SYSCALL_CANCEL (openat, ...)
... и в конечном итоге создадим отображение:
Код: Выделить всё
openКод: Выделить всё
openat(key:value)
Мои вопросы
- Возможно ли технически использовать подход на основе AST (например, libclang) для надежного анализа всего исходного кода glibc и разрешения всех этих директив и псевдонимов препроцессора (, слабый_алиас)?
Код: Выделить всё
strong_alias - Моя конечная цель — создать сопоставление N:1 всех системных вызовов ядра (тех, которые находятся рядом с SYS_ify(name)) с различными псевдонимами пользовательского пространства, которые их вызывают. Существует ли уже общедоступное отображение этой информации? Я был бы очень рад, если бы мог просто использовать существующий ресурс.
Подробнее здесь: https://stackoverflow.com/questions/798 ... l-syscalls
Мобильная версия