- Национальная библиотека им. Н. Э. Баумана Bauman National Library
- Персональные инструменты
- ELF (Executable and Linkable Format)
- Содержание
- История
- Формат
- Заголовок файла
- Структура ELF-заголовка
- Таблица заголовков программы
- Структура таблицы заголовков программы
- Таблица заголовков секций
- Структура таблицы заголовков секций
- Утилиты
- Загрузка исполняемого файла в память
- Cтруктура файловой системы Linux
- / — корень
- /bin — (binaries) бинарные файлы пользователя
- /sbin — (system binaries) системные исполняемые файлы
- /etc — (etcetera) конфигурационные файлы
- /dev — (devices) файлы устройств
- /proc — (proccess) информация о процессах
- /var (variable) — Переменные файлы
- /var/log — Файлы логов
- /var/lib — базы данных
- /var/mail — почта
- /var/spool — очереди
- /var/lock — файлы блокировок
- /var/run — PID процессов
- /tmp (temp) — Временные файлы
- /usr — (user applications) Программы пользователя
- /usr/bin/ — Исполняемые файлы
- /usr/sbin/
- /usr/lib/ — Библиотеки
- /usr/local — Файлы пользователя
- /home — Домашняя папка
- /boot — Файлы загрузчика
- /lib (library) — Системные библиотеки
- /opt (Optional applications) — Дополнительные программы
- /mnt (mount) — Монтирование
- /media — Съемные носители
- /srv (server) — Сервер
- /run — процессы
- /sys (system) — Информация о системе
- Выводы
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
ELF (Executable and Linkable Format)
Расширение файла | none, .axf , .bin , .elf , .o , .prx , .puff and .so |
---|---|
Магические числа | 0x7F ‘E’ ‘L’ ‘F’ |
Разработчик | Unix System Laboratories |
Тип формата | двоичный, исполняемый, объектный, динамическая библиотека, дамп памяти |
ELF (англ. Executable and Linkable Format — формат исполнимых и компонуемых файлов) — формат двоичных файлов, используемый во многих современных UNIX-подобных операционных системах, таких как FreeBSD, Linux, Solaris и др [Источник 1] . Также этот формат используется и во многих других системах.
Содержание
История
Формат ELF был разработан и представлен Лабораторией Юникс (UNIX System Laboratories), как часть двоичного интерфейса приложений ABI (англ. Application Binary Interface, ABI ) операционной системы UNIX System V. Затем он был выбран комитетом TIS в качестве основного файлового формата для операционных систем, работающих на 32-разрядной аппаратной архитектуре Intel x86. ELF достаточно быстро набрал популярность и после того, как компания HP расширила формат и опубликовала стандарт ELF-64, распространился на 64-разрядные платформы. Он является основным файловым форматом во всех Unix-подобных операционных системах, при этом постепенно охватывая мобильные платформы.
ELF был призван упростить и стандартизировать разработку, предоставляя программистам чёткую и понятную структуру файла.
Стандарт формата ELF различает несколько типов файлов:
- Перемещаемый файл — хранит инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такой связи может быть разделяемый объектный файл или исполняемый файл. К этому типу относятся объектные файлы статических библиотек.
- Разделяемый объектный файл — также содержит инструкции и данные и может быть связан с другими перемещаемыми файлами и разделяемыми объектными файлами, в результате чего будет создан новый объектный файл, либо при запуске программы на выполнение операционная система может динамически связать его с исполняемым файлом программы, в результате чего будет создан исполняемый образ программы. В последнем случае речь идет о разделяемых библиотеках.
- Исполняемый файл — содержит полное описание, позволяющее системе создать образ процесса. В том числе: инструкции, данные, описание необходимых разделяемых объектных файлов и необходимую символьную и отладочную информацию.
Формат
Структуру файла можно рассматривать с двух сторон: со стороны компоновщика (линкера) и со стороны загрузчика [Источник 2] . Любой файл состоит из:
- ELF-заголовка (англ.ELF header ), в котором указаны общие характеристики файла: тип (исполнения или компоновки), архитектура процессора, виртуальный адрес точки входа и др.;
- таблицы программных заголовков (англ.program header table ), которая служит для описания сегментов файла;
- таблицы заголовков секций (англ.section header table ), которая характеризует секции файла.
Сегмент — это непрерывная область адресного пространства со своими атрибутами доступа. Сегмент кода имеет атрибут исполнения, а сегмент данных — атрибуты чтения и записи. В зависимости от типа сегмента величина выравнивания в памяти может варьироваться от 4h до 1000h байт (для архитектуры x86). В самом ELF-файле сегменты не выравниваются и хранятся плотно прижатыми друг к другу. Ближайший аналог — секции в PE-файлах Windows
Сегмент в ELF-файлах может быть разбит на одну или несколько частей — секций. Типичный кодовый сегмент состоит из секций .init (процедуры инициализации), .plt (секции связок), .text (основной код программы) и .finit (процедуры финализации).
В формате компоновки таблица заголовков программы не является обязательной, так как компоновщик игнорирует сегменты и работает только на уровне секций. Системный загрузчик, загружающий исполняемый ELF-файл в память, игнорирует секции и оперирует целыми сегментами. Компоновщик комбинирует секции с похожими атрибутами и оптимальным образом размещает их по сегментам при сборке файла. Также он помещает копию таблицы секций в исполняемый файл, несмотря на то, что системный загрузчик игнорирует таблицу секций. При этом облегчается работа отладчиков (например, GDB) и дизассемблеров (например, IDA Pro).
Заголовок файла
Заголовок файла (ELF Header) имеет фиксированное расположение в начале файла и содержит общее описание структуры файла и его основные характеристики, такие как: тип, версия формата, архитектура процессора, виртуальный адрес точки входа, размеры и смещения остальных частей файла.
Структура ELF-заголовка
Элемент | Значение | Описание |
---|---|---|
e_ident[0] | ‘\x7f’ | Сигнатура |
e_ident[1] | ‘E’ | Сигнатура |
e_ident[2] | ‘L’ | Сигнатура |
e_ident[3] | ‘F’ | Сигнатура |
e_ident[4] | 1 | Размер слова: 0 — неизвестно, 1 — 32 бита, 2 — 64 бита |
e_ident[5] | 1 | Порядок байт: 0 — неизвестно, 1 — little-endian, 2 — big-endian |
e_ident[6] | 1 | Версия формата ELF: 0 — неизвестно, 1 — текущая версия |
e_ident[7] | 0 | ОС и бинарный интерфейс, для Linux — 0 |
e_ident[8] | 0 | Версия бинарного интерфейса, для Linux — 0 |
e_ident[9] — e_ident[15] | 0 | Зарезервировано |
Имя | Значение | Описание |
---|---|---|
ET_NONE | 0 | Отсутствие типа файла |
ET_REL | 1 | Перемещаемый объектный файл |
ET_EXEC | 2 | Исполняемый файл |
ET_DYN | 3 | Динамическая библиотека |
ET_CORE | 4 | Дамп памяти |
ET_LOPROC | 0xff00 | Назначение зависит от процессора |
ET_HIPROC | 0xffff | Назначение зависит от процессора |
Таблица заголовков программы
Таблица заголовков программы или таблица заголовков сегментов расположена сразу после заголовка файла и содержит заголовки сегментов, каждый из которых описывает отдельный сегмент программы и его атрибуты, такие как:
- Тип сегмента и действия операционной системы с данным сегментом.
- Расположение сегмента.
- Точка входа сегмента.
- Размер сегмента.
- Флаги доступа к сегменту (запись, чтение, выполнение).
Информация, содержащаяся в этой таблице, представляет интерес для ядра системы, так как указывает ему, как собрать образ процесса из сегментов.
Структура таблицы заголовков программы
Значение | Символьное имя | Описание |
---|---|---|
0 | PT_NULL | Неиспользуемая запись |
1 | PT_LOAD | Сегмент программы, загружаемый в память |
2 | PT_DYNAMIC | Информация для динамического связывания |
3 | PT_INTERP | Загрузчик программ |
4 | PT_NOTE | Дополнительная информация |
5 | PT_PHDR | Информация о таблице заголовков программы |
Таблица заголовков секций
Таблица заголовков секций характеризует секции файла. Таблица секций является обязательной для компоновщика и необязательной для системного загрузчика. Компоновщик комбинирует секции с похожими атрибутами и оптимальным образом размещает их по сегментам при сборке файла.
Структура таблицы заголовков секций
Имя секции задает смещение данных в секции, индекс которой задается в поле e_shstrndx заголовка ELF-файла. По этому смещению размещается строка, оканчивающаяся нулевым байтом, являющаяся именем секции.
Значение | Символьное имя | Описание |
---|---|---|
0 | SHT_NULL | Пустой заголовок секции |
1 | SHT_PROGBITS | Секции программы (например, код или данные) |
2 | SHT_SYMTAB | Таблица символов |
3 | SHT_STRTAB | Таблица строк |
4 | SHT_RELA | Данные о перемещаемых адресах |
5 | SHT_HASH | Хэш-таблица имен для динамического связывания |
6 | SHT_DYNAMIC | Информация для динамического связывания |
7 | SHT_NOTE | Дополнительная информация |
8 | SHT_NOBITS | Признак того, что секция занимает место в адресном пространстве процесса |
9 | SHT_REL | Дополнительные данные о перемещаемых адресах |
Утилиты
Существует множество утилит для работы с файлами elf, основные из них содержатся в наборе программных инструментов GNU Binutils:
- elfedit — обновляет заголовок файла ELF.
- objdump — показывает информацию об объектных файлах (в том числе и ELF).
- readelf — показывает подробную информацию о файле.
- elfutils — предоставляет альтернативные инструменты для GNU Binutils только для Linux.
- elfdump — команда для просмотра ELF информации в файле ELF, доступна в Solaris и FreeBSD.
Загрузка исполняемого файла в память
При загрузке исполняемого файла в память ELF-заголовок по-умолчанию проецируется по адресу 8048000h, который прописан в его заголовке [Источник 3] . Это базовый адрес загрузки, который может быть изменен на стадии компоновки. Все сегменты проецируются в память в соответствии с виртуальными адресами, прописанными в таблице сегментов, причем виртуальная проекция сегментов всегда непрерывна.
Начиная с адреса 40000000h располагаются совместно используемые библиотеки. Например, ld-linux.so, libm.so и libc.so (ближайший аналог в Windows — kernel32.dll, реализующая Win32 API). За вызов функций операционной системы напрямую отвечает прерывание INT 80h.
Последний гигабайт адресного пространства от адреса C0000000h занимают код и данные операционной системы, к которым можно обращаться посредством прерывания INT 80h или через разделяемые библиотеки. Стек находится в нижних адресах. Он начинается с базового адреса загрузки и увеличивается по направлению к нулевым адресам.
Источник
Cтруктура файловой системы Linux
Понимание файловой системы Linux, структуры каталогов, размещения конфигурационных, исполняемых и временных файлов поможет вам лучше разбираться в своей системе и стать успешным системным администратором. Файловая система Linux будет непривычна именно для новичка, только что перешедшего с Windows, ведь здесь все совсем по-другому.
В отличие от Windows, программа не находится в одной папке, а, как правило, распределена по корневой файловой системе. Это распределение поддается определенным правилам. Вы когда-нибудь задавались вопросом, почему некоторые программы находятся в папке /bin, или /sbin, /usr/sbin, /usr/local/bin, в чем разница между этими каталогами?
Например, программа less, находится в каталоге /usr/bin, но почему не в /sbin или /usr/sbin. А такие программы, как ifconfig или fdisk находятся в каталоге /sbin и нигде иначе. В этой статье будет полностью рассмотрена структура файловой системы Linux, после ее прочтения вы сможете понять смысл использования большинства папок в корневом каталоге Linux.
/ — корень
Это главный каталог в системе Linux. По сути, это и есть файловая система Linux. Здесь нет дисков или чего-то подобного, как в Windows. Вместо этого, адреса всех файлов начинаются с корня, а дополнительные разделы, флешки или оптические диски подключаются в папки корневого каталога.
Только пользователь root имеет право читать и изменять файлы в этом каталоге. Обратите внимание, что у пользователя root домашний каталог /root, но не сам /.
/bin — (binaries) бинарные файлы пользователя
Этот каталог содержит исполняемые файлы. Здесь расположены программы, которые можно использовать в однопользовательском режиме или режиме восстановления. Одним словом, те утилиты, которые могут использоваться пока еще не подключен каталог /usr/. Это такие общие команды, как cat, ls, tail, ps и т д.
/sbin — (system binaries) системные исполняемые файлы
Так же как и /bin, содержит двоичные исполняемые файлы, которые доступны на ранних этапах загрузки, когда не примонтирован каталог /usr. Но здесь находятся программы, которые можно выполнять только с правами суперпользователя. Это разные утилиты для обслуживания системы. Например, iptables, reboot, fdisk, ifconfig,swapon и т д.
/etc — (etcetera) конфигурационные файлы
В этой папке содержатся конфигурационные файлы всех программ, установленных в системе. Кроме конфигурационных файлов, в системе инициализации Init Scripts, здесь находятся скрипты запуска и завершения системных демонов, монтирования файловых систем и автозагрузки программ. Структура каталогов linux в этой папке может быть немного запутанной, но предназначение всех их — настройка и конфигурация.
/dev — (devices) файлы устройств
В Linux все, в том числе внешние устройства являются файлами. Таким образом, все подключенные флешки, клавиатуры, микрофоны, камеры — это просто файлы в каталоге /dev/. Этот каталог содержит не совсем обычную файловую систему. Структура файловой системы Linux и содержащиеся в папке /dev файлы инициализируются при загрузке системы, сервисом udev. Выполняется сканирование всех подключенных устройств и создание для них специальных файлов. Это такие устройства, как: /dev/sda, /dev/sr0, /dev/tty1, /dev/usbmon0 и т д.
/proc — (proccess) информация о процессах
Это тоже необычная файловая система, а подсистема, динамически создаваемая ядром. Здесь содержится вся информация о запущенных процессах в реальном времени. По сути, это псевдофайловая система, содержащая подробную информацию о каждом процессе, его Pid, имя исполняемого файла, параметры запуска, доступ к оперативной памяти и так далее. Также здесь можно найти информацию об использовании системных ресурсов, например, /proc/cpuinfo, /proc/meminfo или /proc/uptime. Кроме файлов в этом каталоге есть большая структура папок linux, из которых можно узнать достаточно много информации о системе.
/var (variable) — Переменные файлы
Название каталога /var говорит само за себя, он должен содержать файлы, которые часто изменяются. Размер этих файлов постоянно увеличивается. Здесь содержатся файлы системных журналов, различные кеши, базы данных и так далее. Дальше рассмотрим назначение каталогов Linux в папке /var/.
/var/log — Файлы логов
Здесь содержатся большинство файлов логов всех программ, установленных в операционной системе. У многих программ есть свои подкаталоги в этой папке, например, /var/log/apache — логи веб-сервера, /var/log/squid — файлы журналов кеширующего сервера squid. Если в системе что-либо сломалось, скорее всего, ответы вы найдете здесь.
/var/lib — базы данных
Еще один тип изменяемых файлов — это файлы баз данных, пакеты, сохраненные пакетным менеджером и т д.
/var/mail — почта
В эту папку почтовый сервер складывает все полученные или отправленные электронные письма, здесь же могут находиться его логи и файлы конфигурации.
/var/spool — очереди
Изначально, эта папка отвечала за очереди печати на принтере и работу набора программ cups.
/var/lock — файлы блокировок
Здесь находятся файлы блокировок. Эти файлы означают, что определенный ресурс, файл или устройство занят и не может быть использован другим процессом. Apt-get, например, блокирует свою базу данных, чтобы другие программы не могли ее использовать, пока программа с ней работает.
/var/run — PID процессов
Содержит файлы с PID процессов, которые могут быть использованы, для взаимодействия между программами. В отличие от каталога /run данные сохраняются после перезагрузки.
/tmp (temp) — Временные файлы
В этом каталоге содержатся временные файлы, созданные системой, любыми программами или пользователями. Все пользователи имеют право записи в эту директорию.
Файлы удаляются при каждой перезагрузке. Аналогом Windows является папка Windows\Temp, здесь тоже хранятся все временные файлы.
/usr — (user applications) Программы пользователя
Это самый большой каталог с большим количеством функций. Тут наиболее большая структура каталогов Linux. Здесь находятся исполняемые файлы, исходники программ, различные ресурсы приложений, картинки, музыку и документацию.
/usr/bin/ — Исполняемые файлы
Содержит исполняемые файлы различных программ, которые не нужны на первых этапах загрузки системы, например, музыкальные плееры, графические редакторы, браузеры и так далее.
/usr/sbin/
Содержит двоичные файлы программ для системного администрирования, которые нужно выполнять с правами суперпользователя. Например, таких как Gparted, sshd, useradd, userdel и т д.
/usr/lib/ — Библиотеки
Содержит библиотеки для программ из /usr/bin или /usr/sbin.
/usr/local — Файлы пользователя
Содержит файлы программ, библиотек, и настроек созданные пользователем. Например, здесь могут храниться программы собранные и установленные из исходников и скрипты, написанные вручную.
/home — Домашняя папка
В этой папке хранятся домашние каталоги всех пользователей. В них они могут хранить свои личные файлы, настройки программ и т д. Например, /home/sergiy и т д. Если сравнивать с Windows, то это ваша папка пользователя на диске C, но в отличии от WIndows, home как правило размещается на отдельном разделе, поэтому при переустановке системы все ваши данные и настройки программ сохранятся.
/boot — Файлы загрузчика
Содержит все файлы, связанные с загрузчиком системы. Это ядро vmlinuz, образ initrd, а также файлы загрузчика, находящие в каталоге /boot/grub.
/lib (library) — Системные библиотеки
Содержит файлы системных библиотек, которые используются исполняемыми файлами в каталогах /bin и /sbin.
Библиотеки имеют имена файлов с расширением *.so и начинаются с префикса lib*. Например, libncurses.so.5.7. Папка /lib64 в 64 битных системах содержит 64 битные версии библиотек из /lib. Эту папку можно сравнить с WIndows\system32, там тоже сгружены все библиотеки системы, только там они лежат смешанные с исполняемыми файлами, а здесь все отдельно.
/opt (Optional applications) — Дополнительные программы
В эту папку устанавливаются проприетарные программы, игры или драйвера. Это программы созданные в виде отдельных исполняемых файлов самими производителями. Такие программы устанавливаются в под-каталоги /opt/, они очень похожи на программы Windows, все исполняемые файлы, библиотеки и файлы конфигурации находятся в одной папке.
/mnt (mount) — Монтирование
В этот каталог системные администраторы могут монтировать внешние или дополнительные файловые системы.
/media — Съемные носители
В этот каталог система монтирует все подключаемые внешние накопители — USB флешки, оптические диски и другие носители информации.
/srv (server) — Сервер
В этом каталоге содержатся файлы серверов и сервисов. Например, могут содержаться файлы веб-сервера apache.
/run — процессы
Еще один каталог, содержащий PID файлы процессов, похожий на /var/run, но в отличие от него, он размещен в TMPFS, а поэтому после перезагрузки все файлы теряются.
/sys (system) — Информация о системе
Назначение каталогов Linux из этой папки — получение информации о системе непосредственно от ядра. Это еще одна файловая система организуемая ядром и позволяющая просматривать и изменить многие параметры работы системы, например, работу swap, контролировать вентиляторы и многое другое.
Выводы
Теперь структура файловой системы Linux не кажется вам темным лесом. Конечно еще есть с чем разбираться, одна только подсистема /proc, /sys или /dev чего стоит. Но база уже заложена. Если я что-то упустил — напишите в комментариях.
Источник