Любое практическое упражнение, позволяющее понять, как программа загружается в память и выполняется.
Вопрос
Мне интересно, что происходит до вызова 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 часов работы, чтобы заставить его работать на основные вещи, которые я хотел.Я думаю, что этот проект больше, чем что-либо другое, убедил меня, что карьера программиста — для меня.