Каков адрес страницы vsyscall в процессе пользовательского пространства Linux?

StackOverflow https://stackoverflow.com/questions/2403728

  •  18-09-2019
  •  | 
  •  

Вопрос

Я хотел бы получить адрес страницы vsyscall для собственных нужд.У меня здесь только две идеи:измените компилятор, чтобы он сохранял эту информацию в каком-то известном месте после ее передачи __start, или прочитайте /proc/[pid]/maps.Я действительно не хочу читать /proc/, поскольку это медленно и в этом нет необходимости.Я также не хочу вносить изменения в компилятор.Есть ли у кого-нибудь альтернатива?Есть ли символ, о котором мне следует знать?

В тот момент у меня возникло желание встроить эту функциональность в вызов ioctl в модуле, который я разработал в рамках этой работы!

Это было полезно?

Решение

Вот удар в темноте:

Если вы сможете определить, по какому адресу начался стек процесса, то, возможно, вы сможете найти параметры, которые были предоставлены __start.Затем вы можете получить доступ к параметрам через указатели соответствующего типа, установленные на соответствующие смещения от исходного указателя стека.

Согласно статье Как функция main() выполняется в Linux, автор Хёк «Ястреб» Ким., первые несколько инструкций __start запишет первоначальные аргументы детерминированным способом перед вызовом __libc_start_main.

Очевидно, что любой подобный подход зависит от платформы и подвержен нестабильности, если реализация __start были изменены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top