Как надежно сопоставить динамические символы glibc (например, open@glibc) с системными вызовами ядра (например, openat)?Linux

Ответить
Anonymous
 Как надежно сопоставить динамические символы glibc (например, open@glibc) с системными вызовами ядра (например, openat)?

Сообщение Anonymous »

Я пытаюсь построить сопоставление между динамическими символами в файлах ELF (из glibc) и реальными системными вызовами ядра, которые они вызывают.
Моя среда — 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 с __libc_open64. Затем функция __libc_open64 внутренне вызывает SYSCALL_CANCEL (openat, ....). Этот макрос (который в конечном итоге использует встроенный ассемблер) является вызовом самого низкого уровня, который я пытаюсь найти.
Моя цель — найти всю эту цепочку для всех системных вызовов: open@glibc.2.2.5 → слабый_алиас (__libc_open64, open) → __libc_open64 → SYSCALL_CANCEL (openat, ...)
... и в конечном итоге создадим отображение: → открыть[/b], → openat[/b].

(key:value)
Мои вопросы
  • Возможно ли технически использовать подход на основе AST (например, libclang) для надежного анализа всего исходного кода glibc и разрешения всех этих директив и псевдонимов препроцессора (

    Код: Выделить всё

    strong_alias
    , слабый_алиас)?
  • Моя конечная цель — создать сопоставление N:1 всех системных вызовов ядра (тех, которые находятся рядом с SYS_ify(name)) с различными псевдонимами пользовательского пространства, которые их вызывают. Существует ли уже общедоступное отображение этой информации? Я был бы очень рад, если бы мог просто использовать существующий ресурс.


Подробнее здесь: https://stackoverflow.com/questions/798 ... l-syscalls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»