Кто запускает программу?

Да, есть. Общий механизм для этого типа вещей (, переопределяющий стандартную функцию ), называется LD _PRELOAD. Общая идея довольно проста: при загрузке библиотек в память для программы та из них, которая первой определяет данное имя символа, определяет, что делает этот символ. Таким образом, LD _PRELOAD позволяет указать динамическому компоновщику загружать определенные библиотеки перед всеми остальными (, включая libc ), что означает, что они могут переопределять определенные функции из библиотек, которые будут загружены позже.

Примеры широко используемых проектов, использующих LD _PRELOAD, включают:

  • jemalloc Может быть предварительно -загружен, чтобы вы могли использовать распределитель памяти jemalloc с программами, которые сами явно не используют его.
  • datefudge Позволяет подделать системное время и дату.
  • libeatmydata Переопределения sync()и связанные с ними призывы ничего не делать, повышающие производительность некоторых приложений за счет безопасности данных.
  • dante Включает команду, которая использует LD _PRELOAD для включения использования протокола SOCKS для приложений, которые изначально его не поддерживают.

Существует также библиотека, которая делает именно то, о чем вы спрашиваете, под названием libtrash. Официальную веб-страницу -можно найти здесь . Я не уверен, работает это или нет, так как я никогда не использовал его сам, но недавно был выпущен новый вариант, так что похоже, что автор, по крайней мере, все еще поддерживает его.

-2
01.12.2020, 19:57
1 ответ

Когда вы набираете lsв терминале, оболочка, работающая в этом терминале (, может быть, bash, zsh и т. д. )вызовет системный вызов, сообщающий ядру о необходимости разветвления его процесса. Затем он сообщает ядру заменить образ нового процесса на программу lsс системным вызовом execve. Это загрузит код программы lsс диска в оперативную память.

Итак, если вы имеете в виду, какая программа запускает программу, то это оболочка.

2
18.03.2021, 22:45

Теги

Похожие вопросы