Библиотека сайта rus-linux.net
На главную -> MyLDP -> Программирование и алгоритмические языки
Ulrich Drepper "Как писать разделяемые библиотеки" | ||
Назад | Оглавление | Вперед |
1.3. Как реализован формат ELF?
Обработка статически скомпонованного приложения очень проста. Такое приложение имеет фиксированный адрес загрузки, который известен ядру. Процесс загрузки просто состоит из помещения имеющегося двоичного модуля в соответствующее адресное пространство только что созданного процесса и передачи управления в точку входа в приложение. Все остальное было сделано статическим компоновщиком при создании исполняемого файла.
Динамически скомпонованные двоичные файлы, когда они загружаются с диска, напротив, сформированы не полностью. Поэтому ядро не может сразу передать управление в приложение. Вместо этого также загружается еще одна вспомогательная программа, которая, что очевидно, должна быть уже готова к работе. Этой вспомогательной программой является динамический компоновщик. Задача динамического компоновщика заключается том, чтобы завершить создание динамически скомпонованного приложения путем загрузки объектов DSO (зависимостей), которые ему необходимы, и выполнение необходимых перемещений кода. Затем управление может, наконец, быть передано программе.
Но, в большинстве случаев, это не последняя задача, которую должен выполнить динамический компоновщик. Формат ELF позволяет откладывать перемещение кода, связанного с некоторым символом, до тех пор, пока этот символ действительно не потребуется. Эта схема отложенного "ленивого" перемещения является необязательной и оптимизация перемещений кода, о которой мы будем рассказывать дальше и которая будет выполнена сразу в момент запуска программы, дает такой же эффект, как и "ленивое" перемещение. Поэтому везде далее мы будем игнорировать все, что будет происходить после запуска приложения.
Предыдущий раздел: | Следующий раздел: | |
Назад | Оглавление | Вперед |