Что определяет точку входа _start (ядро, ld-linux.so и т. д.)?

Проверьте вывод ip link. Посмотрите, не работает ли интерфейс. Если это так, вы можете запустить ip link set INTERFACE upи повторить попытку. Попробуйте использовать nmtui и посмотрите, что он говорит, когда вы пытаетесь активировать сеть с его помощью. Если сети не отображаются, это означает, что интерфейс не работает. Если это ошибка, есть другая проблема.

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

1
22.05.2020, 04:37
1 ответ

Точка входа обычно называется _startи определяется в подпрограмме сборки среды выполнения C, которая связана с исполняемым файлом. Этот короткий фрагмент кода отвечает за настройку стека, возможно, за вызов конструкторов C++ и, наконец, за вызов main. Окончательный ответ на вопрос, где программа начинает выполнение, — это значение e_entryв заголовке ELF исполняемого файла. Компоновщик устанавливает это значение так, чтобы оно указывало на _start.

Вы можете убедиться в этом, изучив исполняемую программу с помощью readelf -a progfile.

Динамическое связывание немного усложняет ситуацию, так как динамический компоновщик загружается и запускается первым и несет ответственность за загрузку и связывание разделяемых библиотек, необходимых программе. Динамический компоновщик также указывается в исполняемом файле (и называется «программным интерпретатором».)

На Lwn.net была превосходная статья из двух -частей на тему Как запускаются программы(часть вторая ), которую я рекомендую прочитать, если вы действительно хотите вникнуть в детали этой темы.

4
18.03.2021, 23:33

Теги

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