Любое практическое упражнение, чтобы понять, как программа загружается в память и выполняется - PullRequest
6 голосов
/ 31 июля 2009

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

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

  • strace
  • разборка
  • readelf
  • / Proc / PID / карта

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

Ответы [ 5 ]

3 голосов
/ 31 июля 2009
  • Страница man ld.so документирует несколько переменных среды, которые могут быть настроены либо для настройки процесса динамического связывания, либо для предоставления дополнительной информации.

например.

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

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

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


objdump -S <executable>  > myfile.S

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

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

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

2 голосов
/ 16 мая 2011

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

1 голос
/ 31 июля 2009

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

1 голос
/ 31 июля 2009

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

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

...