Структура исполняемых файлов linux

Содержание
  1. Национальная библиотека им. Н. Э. Баумана Bauman National Library
  2. Персональные инструменты
  3. ELF (Executable and Linkable Format)
  4. Содержание
  5. История
  6. Формат
  7. Заголовок файла
  8. Структура ELF-заголовка
  9. Таблица заголовков программы
  10. Структура таблицы заголовков программы
  11. Таблица заголовков секций
  12. Структура таблицы заголовков секций
  13. Утилиты
  14. Загрузка исполняемого файла в память
  15. Cтруктура файловой системы Linux
  16. / — корень
  17. /bin — (binaries) бинарные файлы пользователя
  18. /sbin — (system binaries) системные исполняемые файлы
  19. /etc — (etcetera) конфигурационные файлы
  20. /dev — (devices) файлы устройств
  21. /proc — (proccess) информация о процессах
  22. /var (variable) — Переменные файлы
  23. /var/log — Файлы логов
  24. /var/lib — базы данных
  25. /var/mail — почта
  26. /var/spool — очереди
  27. /var/lock — файлы блокировок
  28. /var/run — PID процессов
  29. /tmp (temp) — Временные файлы
  30. /usr — (user applications) Программы пользователя
  31. /usr/bin/ — Исполняемые файлы
  32. /usr/sbin/
  33. /usr/lib/ — Библиотеки
  34. /usr/local — Файлы пользователя
  35. /home — Домашняя папка
  36. /boot — Файлы загрузчика
  37. /lib (library) — Системные библиотеки
  38. /opt (Optional applications) — Дополнительные программы
  39. /mnt (mount) — Монтирование
  40. /media — Съемные носители
  41. /srv (server) — Сервер
  42. /run — процессы
  43. /sys (system) — Информация о системе
  44. Выводы

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

ELF (Executable and Linkable Format)

ELF
Расширение файла 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
Элемент Значение Описание
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 Зарезервировано
Возможные значения поля e_type
Имя Значение Описание
ET_NONE 0 Отсутствие типа файла
ET_REL 1 Перемещаемый объектный файл
ET_EXEC 2 Исполняемый файл
ET_DYN 3 Динамическая библиотека
ET_CORE 4 Дамп памяти
ET_LOPROC 0xff00 Назначение зависит от процессора
ET_HIPROC 0xffff Назначение зависит от процессора

Таблица заголовков программы

Таблица заголовков программы или таблица заголовков сегментов расположена сразу после заголовка файла и содержит заголовки сегментов, каждый из которых описывает отдельный сегмент программы и его атрибуты, такие как:

  • Тип сегмента и действия операционной системы с данным сегментом.
  • Расположение сегмента.
  • Точка входа сегмента.
  • Размер сегмента.
  • Флаги доступа к сегменту (запись, чтение, выполнение).

Информация, содержащаяся в этой таблице, представляет интерес для ядра системы, так как указывает ему, как собрать образ процесса из сегментов.

Структура таблицы заголовков программы

Некоторые возможные значения поля p_type
Значение Символьное имя Описание
0 PT_NULL Неиспользуемая запись
1 PT_LOAD Сегмент программы, загружаемый в память
2 PT_DYNAMIC Информация для динамического связывания
3 PT_INTERP Загрузчик программ
4 PT_NOTE Дополнительная информация
5 PT_PHDR Информация о таблице заголовков программы

Таблица заголовков секций

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

Структура таблицы заголовков секций

Имя секции задает смещение данных в секции, индекс которой задается в поле e_shstrndx заголовка ELF-файла. По этому смещению размещается строка, оканчивающаяся нулевым байтом, являющаяся именем секции.

Возможные значения поля sh_type

Значение Символьное имя Описание
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 или через разделяемые библиотеки. Стек находится в нижних адресах. Он начинается с базового адреса загрузки и увеличивается по направлению к нулевым адресам.

Читайте также:  Как очистить результаты поиска windows

Источник

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 — базы данных

Еще один тип изменяемых файлов — это файлы баз данных, пакеты, сохраненные пакетным менеджером и т д.

Читайте также:  Linux машине по ssh

/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 чего стоит. Но база уже заложена. Если я что-то упустил — напишите в комментариях.

Источник

Оцените статью