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

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

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

  • стрейс
  • разбирать
  • читать
  • /прок/пид/карта

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


person pierrotlefou    schedule 31.07.2009    source источник


Ответы (5)


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

e.g.

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

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

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


objdump -S <executable>  > myfile.S

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

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

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

person Freddy    schedule 31.07.2009

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

person Uhli    schedule 16.05.2011

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

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

person Nick Meyer    schedule 31.07.2009

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

person Jon    schedule 31.07.2009