Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Программирование и алгоритмические языки


Ulrich Drepper "Как писать разделяемые библиотеки"
Назад Оглавление Вперед

1.3. Как реализован формат ELF?

Обработка статически скомпонованного приложения очень проста. Такое приложение имеет фиксированный адрес загрузки, который известен ядру. Процесс загрузки просто состоит из помещения имеющегося двоичного модуля в соответствующее адресное пространство только что созданного процесса и передачи управления в точку входа в приложение. Все остальное было сделано статическим компоновщиком при создании исполняемого файла.

Динамически скомпонованные двоичные файлы, когда они загружаются с диска, напротив, сформированы не полностью. Поэтому ядро не может сразу передать управление в приложение. Вместо этого также загружается еще одна вспомогательная программа, которая, что очевидно, должна быть уже готова к работе. Этой вспомогательной программой является динамический компоновщик. Задача динамического компоновщика заключается том, чтобы завершить создание динамически скомпонованного приложения путем загрузки объектов DSO (зависимостей), которые ему необходимы, и выполнение необходимых перемещений кода. Затем управление может, наконец, быть передано программе.

Но, в большинстве случаев, это не последняя задача, которую должен выполнить динамический компоновщик. Формат ELF позволяет откладывать перемещение кода, связанного с некоторым символом, до тех пор, пока этот символ действительно не потребуется. Эта схема отложенного "ленивого" перемещения является необязательной и оптимизация перемещений кода, о которой мы будем рассказывать дальше и которая будет выполнена сразу в момент запуска программы, дает такой же эффект, как и "ленивое" перемещение. Поэтому везде далее мы будем игнорировать все, что будет происходить после запуска приложения.


Предыдущий раздел:   Следующий раздел:
Назад Оглавление Вперед