Любое практическое упражнение, позволяющее понять, как программа загружается в память и выполняется.

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Мне интересно, что происходит до вызова main(), например, загрузка исполняемого файла в память, динамическая загрузка общей библиотеки.Есть ли у вас какие-либо предложения, как понять эти вещи с помощью практических упражнений?

Инструменты и вещи, которые я знаю и использую сейчас, включают в себя:

  • след
  • разобрать
  • ридельф
  • /proc/pid/карта

ПРИМЕЧАНИЯ:Я знаю великую книгу компоновщики и загрузчики, но практические упражнения могут научить меня лучше, чем чтение книги.

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

Решение

  • ld.so справочная страница документирует несколько переменных среды, которые можно установить для настройки процесса динамического связывания или предоставления дополнительных сведений.

например

LD_DEBUG=all cat </dev/null
  • Вы можете легко получить исходный код для каждой задействованной части — ядра Linux, динамического компоновщика, библиотеки C, кода запуска (crt0.o или аналогичного).Вы можете начать с изучения кода и внесения экспериментальных модификаций.

Другие советы

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

Выберите любой исполняемый файл и выполните:


objdump -S <executable>  > myfile.S

Еще одним хорошим упражнением будет:

  • Создает программу, использующую внешнюю библиотеку
  • Скомпилируйте программу, используя статическую компоновку.
  • Запустите программу
  • Переименуйте файл библиотеки и проверьте, запускается ли программа.
  • Скомпилируйте программу, используя общую библиотеку.
  • Переименуйте библиотеку и проверьте, запускается ли программа

Это ответит на некоторые ваши вопросы о том, что и как происходит под кулисами.

Я нашел две интересные ссылки по теме (по крайней мере, для Linux) и немного короче упомянутой книги (Линкеры и загрузчики).

Когда я посещал занятия по ОС в колледже, мы использовали Начос.Это не операционная система как таковой, а своего рода «симуляция» операционной системы, работающая в пространстве пользователя.Он написан на C++, и вы можете перекрестно компилировать исполняемые файлы, которые Nachos затем может загружать и запускать.Вы можете играть с интерфейсом системных вызовов и вообще экспериментировать сколько угодно, возясь с кодом.

Мы запускали его в лаборатории Solaris, и у меня были некоторые проблемы с его запуском и запуском в Linux на моей личной машине, но это может быть забавной игрушкой, если вы захотите покопаться в коде.

Я понимаю, что это, вероятно, много для того, что вы ищете, но написание собственного ассемблера и компоновщика было бы очень поучительно.Я делал это, когда учился в колледже, и мне это нравилось.Насколько я помню, потребовалось около 120 часов работы, чтобы заставить его работать на основные вещи, которые я хотел.Я думаю, что этот проект больше, чем что-либо другое, убедил меня, что карьера программиста — для меня.

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