Linux поддерживает таблицу функций для загрузки программ. Каждой функции предоставляется возможность попытаться загрузить заданный файл, когда выполняется системный вызов exec.
Регистрация многократно загружаемых программ позволяет Linux поддерживать как ELF-,так и a.out– форматы кода.
Первоначально страницы двоичного файла загружаются в виртуальную память; только если программа пытается обратиться к данной странице и возникает отказ страницы, в результате данная страница загружается в физическую память.
Двоичный файл формата ELF (Executable and Linkage Format)состоит из заголовка, за которым следуют несколько выравненных до страницы секций; ELF-загрузчик читает заголовок и отображает секции файла в отдельные регионы виртуальной памяти.
Структура секций файла ELF для модуля ядра Linux показана в таблица 1.
Таблица 1. Структура секций файла ELF для модуля ядра Linux
.text
инструкции
.fixup
изменения времени исполнения
.init.text
инструкции инициализации модуля
exit.text
выходные инструкции модуля
.rodata.etrl.l
строки только для чтения
.modinfо
текст макросов модуля
_versions
данные о версии модуля
.data
инициализированные данные
.bss
неинициализированные данные
other
Распределение памяти для ELF-программ в Linux изображено на рис. 1.2.
Рис. 1.2. Распределение памяти для ELF-программ.
Статическая и динамическая линковка.Программа, библиотечные функции которой встроены непосредственно в двоичный исполняемый код, статически линкуется со своими библиотеками.
Основной недостаток статической линковки в том, что любая генерируемая программа должна хранить копии одних и тех же общесистемных библиотечных функций.
Динамическая линковка более эффективна в терминах как использования физической, так и дисковой памяти, так как она загружает системные библиотеки в память только один раз.