Хитрость в том, что исполняемые файлы и библиотеки общих объектов используют один и тот же формат, называемый ELF и , что libc.so , в сотрудничестве с кодом, найденным в crt0.o (on * nixes), часть компилятора, фактически отвечает за настройку среды выполнения и затем вызывает соответствующую функцию int main(...)
. Без связывания с libc.so и crt0.o программа с int main(...)
не будет выполнена. Технически можно установить функцию main в качестве исполняемой точки входа, но при ее запуске программа не будет получать аргументы командной строки, среду и т. Д., Все это входит в сферу ответственности стандартной среды выполнения. библиотека libc.so
Итак, libc.so , будучи также ответственным за подготовку вызова функции int main(...)
, может легко определить, была ли она связана с какой-либо другой программой или она "автономна". Если процесс был запущен через точку входа libc.so , в нем отобразится это сообщение, а затем завершится. Только если процесс запускается через двоичную точку входа исполняемых файлов, которую двоичный файл получает через эту магию crt0.o , процесс будет работать как обычно.