Любая программа, которая полагается на общие объекты (DLL), загружаемые до того, как main может завершиться сбоем перед main.
Под кодом Linux в библиотеке динамического компоновщика (ld - *. So) запускается для предоставления любых зависимостей библиотеки задолго до main. Если какие-либо необходимые библиотеки не могут быть найдены, имеют разрешения, которые не позволяют вам получить к ним доступ, не являются обычными файлами или не имеют какого-либо символа, который, по мнению динамического компоновщика, связывающего вашу программу, должен иметь это связало вашу программу, тогда это может вызвать сбой.
Кроме того, каждая библиотека может запускать некоторый код, когда она связана. Это происходит главным образом потому, что библиотека может нуждаться в связывании большего количества библиотек или может нуждаться в запуске некоторых конструкторов (даже в программе на C библиотеки могут иметь некоторый C ++ или что-то еще, использующее конструкторы).
Кроме того, стандартные программы на Си уже создали файлы stdio FILE stdin, stdout и stderr. Во многих системах они также могут быть закрыты. Это означает, что они также свободны () ed, что означает, что они (и их буферы) были malloc () ed, что может привести к сбою. Это также предполагает, что они, возможно, сделали некоторые другие вещи с файловыми дескрипторами, которые представляют эти структуры FILE, что может привести к сбою.
Другие вещи, которые могут произойти, могут возникнуть, если операционная система испортит установку переменных среды и / или аргументов командной строки, которые были переданы программе. Код перед main, вероятно, должен был что-то использовать с этими данными перед вызовом main.
Многое происходит до того, как главное. Любой из них может привести к фатальному исходу.