Введение в ELF-файлы в Linux: понимание и анализ +28
- 06.01.20 18:14
•
32bit_me
•
#480642
•
Хабрахабр
•
Перевод
•
•
11400
Программирование, Анализ и проектирование систем, Системное программирование
Есть в мире вещи, которые мы принимаем как нечто само собой разумеющееся, хотя они являются истинными шедеврами. Одними из таких вещей являются утилиты Linux, такие, как ls и ps. Хотя они обычно воспринимаются как простые, это оказывается далеко не так, если мы заглянем внутрь. И таким же оказывается ELF, Executable and Linkable Format. Формат файлов, который используется повсеместно, но мало кто его понимает. Это краткое руководство поможет вам достичь понимания.
Прочтя это руководство, вы изучите:
- Зачем нужен формат ELF и для каких типов файлов он используется
- Структуру файла ELF и детали его формата
- Как читать и анализировать бинарное содержимое файла ELF
- Какие инструменты используются для анализа бинарных файлов
lsusb – подробный список шин и устройств usb
Эта команда показывает информацию о контроллерах usb и подробные сведения о подключенных к ним устройствах. По умолчанию выдается краткая информация. Для того, чтобы о каждом порте usb получить подробную информацию, используйте параметр «-v».
$ lsusb Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 002: ID 045e:00cb Microsoft Corp. Basic Optical Mouse v2.0 Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
В системе, информация о которой приведена выше, один порт usb используется для подключения мыши.
package ‘foo’ is not available”
Достаточно распространённая ошибка, текст которой к сожалению не сообщает о реальной проблеме, которой была эта ошибка вызвана.
В одной из статей на RBloggers, автор опубликовал подробный чек лист как с этой ошибкой бороться.
- Неправильно написанное название пакета. Первое, что стоит проверить — это правильно ли вы написали название пакета, который хотите установить. R регистро чувствительный язык, поэтому даже одна буква написанная не в том регистре будет считаться неправильным именем пакета. Лучший способ копировать название пакета из CRAN.
- Проверьте своё интернет соединение. Звучит банально, но иногда в процессе разработки когда мы можем не заметить, что уже более часа работаем без доступа к интернету.
- Проверьте сеть CRAN. Возможно в момент установки пакета не доступны сервера CRAN, для проверки просто попробуйте загрузить главный сайт проекта. Если основное зеркало CRAN не доступно, вы можете установить пакет из другого, используя аргумент внутри функции .
- Убедитесь в том, что пакет был опубликован на CRAN. Перед тем как пакет попадёт на CRAN, зачастую автор проводит большую работу над его тестированием, и доработкой функционала. Как правило на CRAN публикуются пакеты чей код и функционал уже устоялся, и считался стабильным. Поэтому 4ый шаг, просто убедитесь в том, что нужный пакет уже опубликван. Если пакета нет на CRAN, то скорее всего вы можете найти его на GitHub, и установить с помощью команды .
- Убедитесь в том, что пакет не был удалён из CRAN. Требования политики публикации пакетов в CRAN не редко меняются, если автор перестал поддерживать свой пакет, и с течением времени этот пакет стал нарушать правила политики публикации CRAN, то его удалят из репозитория. В таком случае перейдя на страницу пакета https://cran.r-project.org/package=PACKAGE_NAME, вы увидите сообщение “Package ‘foo’ was removed from the CRAN repository.”, что и свидетельствует об удалении пакета из CRAN. Если вы получите ошибку 404, значит пакет ранее не был опубликован на CRAN.
ChmSee
— пакет Gtk2+ для GNOME с
открытым кодом, его веб-сайт написан в основном на китайском; если бы не
некоторые части на английском, пришлось бы проводить установку и использование
ChmSee мучительным методом проб и ошибок. Он свободен под лицензией GNU GPL,
в августе была выпущена версия 1.0.
Установка ChmSee была бы совсем хлопотной, если бы не стандартные базы openSUSE.
Если вы хотите собрать его из исходников, вам потребуются библиотеки Gtk2+, libglade-2.0,
gecko, chmlib и OpenSSL. После получения необходимо ввести следующие команды:
Если не сможете найти chmlib, придется вручную добавить параметр к команде
configure (). После установки
ChmSee оказался добавлен в меню openSUSE, но не в Konqueror или контекстное
меню.
Можно изменять шрифты, используемые для отображения (кое какие отсутствуют и в KchmViewer, и в Help Explorer Viewer) через пункт меню Edit -> Setup. Будьте осторожны с функцией Clear, которая удаляет все рабочие файлы ChmSee и вызывает частые падения программы. Если его выбрать, то придется заново открыть файл CHM. В ChmSee нет вкладок Index или Search; по сути, в нем вообще нет функции поиска. Когда я проводил тестирование, некоторые файлы CHM показывали странные сообщения (и не отображался текст), а некоторые изображения не показывались вовсе.
ChmSee выглядит многообещающим, но еще необходимо многое сделать, прежде чем он достигнет уровня KchmViewer и Help Explorer Viewer.
Использование файла Command
У нас есть коллекция файлов разных типов в нашем текущем каталоге. Это смесь документа, исходного кода, исполняемых и текстовых файлов.
Команда покажет нам, что находится в каталоге, и Опция (удобочитаемые размеры, длинный список) покажет нам размер каждого файла:
ls -hl
Давай попробуем на несколько из них и посмотрим, что мы получим:
file build_instructions.odt
file build_instructions.pdf
file COBOL_Report_Apr60.djvu
Три формата файла определены правильно. Где возможно, дает нам немного больше информации. Сообщается, что файл PDF находится в формат версии 1.5,
Даже если мы переименуем файл ODT, чтобы иметь расширение с произвольным значением XYZ, файл все равно будет правильно идентифицирован, как в пределах файловый браузер и в командной строке с помощью ,
В пределах в браузере файлов указан правильный значок. В командной строке игнорирует расширение и просматривает файл, чтобы определить его тип:
file build_instructions.xyz
С помощью на носителях, таких как графические и музыкальные файлы, обычно выдает информацию относительно их формата, кодировки, разрешения и т. д.
file screenshot.png
file screenshot.jpg
file Pachelbel_Canon_In_D.mp3
Интересно, что даже с простыми текстовыми файлами, не судит файл по его расширению. Например, если у вас есть файл с расширением «.c», содержащий стандартный текст, но не исходный код, не принимайте это за настоящий C файл исходного кода:
file function+headers.h
file makefile
file hello.c
правильно идентифицирует заголовочный файл («.h») как часть коллекции файлов исходного кода на C и знает, что make-файл является скриптом.
Типы
Стандарт формата ELF различает несколько типов файлов:
- Перемещаемый файл — хранит инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такой связи может быть разделяемый объектный файл или исполняемый файл. К этому типу относятся объектные файлы статических библиотек.
- Разделяемый объектный файл — также содержит инструкции и данные и может быть связан с другими перемещаемыми файлами и разделяемыми объектными файлами, в результате чего будет создан новый объектный файл, либо при запуске программы на выполнение операционная система может динамически связать его с исполняемым файлом программы, в результате чего будет создан исполняемый образ программы. В последнем случае речь идет о разделяемых библиотеках.
- Исполняемый файл — содержит полное описание, позволяющее системе создать образ процесса. В том числе: инструкции, данные, описание необходимых разделяемых объектных файлов и необходимую символьную и отладочную информацию.
История
Формат ELF был разработан и представлен Лабораторией Юникс (UNIX System Laboratories), как часть двоичного интерфейса приложений ABI (англ. Application Binary Interface, ABI) операционной системы UNIX System V. Затем он был выбран комитетом TIS в качестве основного файлового формата для операционных систем, работающих на 32-разрядной аппаратной архитектуре Intel x86. ELF достаточно быстро набрал популярность и после того, как компания HP расширила формат и опубликовала стандарт ELF-64, распространился на 64-разрядные платформы. Он является основным файловым форматом во всех Unix-подобных операционных системах, при этом постепенно охватывая мобильные платформы.
Структура ELF-файла с точки зрения компоновщика и системного загрузчика
ELF был призван упростить и стандартизировать разработку, предоставляя программистам чёткую и понятную структуру файла.
KchmViewer
— стандартное средство KDE для просмотра файлов CHM. Современная версия 3.1 была выпущена в июне, хотя уже имеется бета-версия 4.0. Эта программа распространяется под лицензией GNU General Public License (GPL) и использует части кода другого средства просмотра — xCHM.
KchmViewer доступен в большинстве репозиториев. Можно также и собрать его из исходников, путем стандартных команд и . Только убедитесь в наличии пакета , для получения более детальной информации обратитесь к странице загрузок.
В KDE KchmViewer по умолчанию связан с файлами CHM, т.е. при клике на таком файле последует его автоматический запуск. Для отображения текста может быть использован либо визуальный компонент библиотеки
либо оригинальный
окружения KDE (это переключается в меню Settings). Мне попался один файл CHM, который отображался некорректно, и переключение метода отображения решило проблему.
KchmViewer поддерживает просмотр закладок, и предоставляет вкладки Contents, Index и Search. Программа правильно обрабатывает иностранные языки и многобайтовые символы. В документе можно устанавливать закладки, редактировать и удалять их. Можно смотреть оригинальный код HTML, и даже выбрать для этого определенный редактор через пункт меню Settings.
Что такое библиотеки?
Как я уже говорил выше — библиотеки реализуют общие возможности, которые потом используются программами. Если говорить просто, то библиотека — это набор функций, каждую из которых можно использовать в любой программе. Например, если программе нужно вывести строку на экран, она не будет лезть прямо в буфер видеокарты, а использует функцию из стандартной библиотеки.
Библиотеки делятся на два типа — динамические и статические. Статические библиотеки linux подключаются на этапе сборки программы, а динамические — во время выполнения и они общие для нескольких программ. Нас будут интересовать именно динамические библиотеки linux. Они находятся в папках /lib, /lib64, /usr/lib, /usr/lib/x86_64-linux-gnu. Каждая библиотека имеет расширение .so, за которым следует номер версии. Этот номер увеличивается каждый раз, когда разработчики вносят серьезные изменения. Такой подход необходим для того, чтобы сохранить совместимость для программ, использующих старые версии. Например, в системе может быть две библиотеки libfuse.so.0 и libfuse.so.1. Далее мы рассмотрим основные библиотеки и их предназначение.
lspci – список устройств PCI
Команда lspci выдает список всех шин PCI, а также подробную информация об устройствах, которые к ним подключены. Под эту категорию подпадают следующие устройства — адаптер vga, графическая карта, сетевой адаптер, порты usb, контроллеры sata и т.д.
$ lspci 00:00.0 Host bridge: Intel Corporation 82G35 Express DRAM Controller (rev 03) 00:02.0 VGA compatible controller: Intel Corporation 82G35 Express Integrated Graphics Controller (rev 03) 00:02.1 Display controller: Intel Corporation 82G35 Express Integrated Graphics Controller (rev 03) 00:19.0 Ethernet controller: Intel Corporation 82566DC Gigabit Network Connection (rev 02) 00:1a.0 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 (rev 02) 00:1a.1 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 02) 00:1a.7 USB controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 02) 00:1b.0 Audio device: Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 02) 00:1c.0 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 (rev 02) 00:1c.1 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 (rev 02) 00:1c.2 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 3 (rev 02) 00:1d.0 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 02) 00:1d.1 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 02) 00:1d.2 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 02) 00:1d.7 USB controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 02) 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev f2) 00:1f.0 ISA bridge: Intel Corporation 82801HB/HR (ICH8/R) LPC Interface Controller (rev 02) 00:1f.2 IDE interface: Intel Corporation 82801H (ICH8 Family) 4 port SATA Controller (rev 02) 00:1f.3 SMBus: Intel Corporation 82801H (ICH8 Family) SMBus Controller (rev 02) 00:1f.5 IDE interface: Intel Corporation 82801HR/HO/HH (ICH8R/DO/DH) 2 port SATA Controller (rev 02) 03:00.0 IDE interface: JMicron Technology Corp. JMB368 IDE controller 04:05.0 FireWire (IEEE 1394): LSI Corporation FW322/323 1394a Controller (rev 70)
Отфильтруйте информацию о конкретном устройстве с помощью команды grep.
$ lspci -v | grep "VGA" -A 12
Заголовок файла
В начале файла (со смещения 0 от начала) идет заголовок ELF-файла, описываемый следующей структурой:
typedef struct { unsigned char e_ident; uint16_t e_type; uint16_t e_machine; uint32_t e_version; uint32_t e_entry; uint32_t e_phoff; uint32_t e_shoff; uint32_t e_flags; uint16_t e_ehsize; uint16_t e_phentsize; uint16_t e_phnum; uint16_t e_shentsize; uint16_t e_shnum; uint16_t e_shstrndx; } Elf32_Ehdr;
Структура определена таким образом,
что поля структуры выровнены по естественным для данной архитектуры правилам выравнивания
(то есть 16-битные поля располагаются по четным адресам, а 32-битные — по адресам кратным 4),
а полный размер структуры кратен 4 байтам. 16- и 32-битные значения представлены в порядке байт,
естественном для соответствующей архитектуры.
Поле e_ident содержит идентификационную информацию о файле. Поле представляет собой массив
байт для того, чтобы иметь одинаковое представление на архитектурах с разным размером слова и
разным порядком байт в слове. Элементы массива имеют следующее назначение:
Элемент | Значение | Описание |
---|---|---|
e_ident | ‘\x7f’ | «Магическое» значение |
e_ident | ‘E’ | «Магическое» значение |
e_ident | ‘L’ | «Магическое» значение |
e_ident | ‘F’ | «Магическое» значение |
e_ident | 1 | Размер слова: 0 — неизвестно, 1 — 32, 2 — 64 |
e_ident | 1 | Порядок байт: 0 — неизвестно, 1 — little-endian, 2 — big-endian |
e_ident | 1 | Версия формата ELF: 0 — неизвестно, 1 — текущая версия |
e_ident | ОС и бинарный интерфейс, для Linux — 0 | |
e_ident | Версия бинарного интерфейса, для Linux — 0 | |
e_ident - e_ident | Зарезервировано |
В дальнейшем будут приводиться значения констант для ОС Linux на архитектуре i386.
За значениями констант для других операционных систем или архитектур обращайтесь к документации.
Поле e_type идентифицирует тип файла: 0 (неизвестно), 1 (объектный файл), 2 (исполняемый файл),
3 (разделяемая библиотека), 4 (core-файл).
Поле e_machine идентифицирует тип процессора: 0 (неизвестно), 3 (Intel 80386 и совместимые).
Поле e_version идентифицирует версию файла: 0 (недопустимая версия), 1 (текущая версия).
Поле e_entry определяет виртуальный адрес точки входа в программу. После загрузки программы
в память управление передается на этот адрес.
Поле e_phoff задает смещение от начала файла до начала таблицы заголовков программы
(program header table). Информация о таблице заголовков программы будет дана ниже.
Поле e_shoff задает смещение от начала файла до начала таблицы заголовков секций
(program section table). Информация о таблице заголовков секций будет дана ниже.
Поле e_flags задает дополнительные процессорно-специфичные флаги. В настоящее время
значение данного поля должно всегда быть 0.
Поле e_ehsize хранит размер заголовка ELF-файла. Его значение должно быть равно
52 (sizeof(Elf32_Ehdr)).
Поле e_phentsize хранит размер одной записи в таблице заголовков программы.
Его значение должно быть 32 (sizeof(Elf32_Phdr)) или 0, если таблица заголовков программы пуста.
Поле e_phnum хранит количество записей в таблице заголовков программы.
Поле e_shentsize хранит размер одной записи в таблице заголовков секций.
Его значение должно быть равно 40 (sizeof(Elf32_Shdr)) или 0, если таблица заголовков секций пуста.
Поле e_shnum хранит количество записей в таблице заголовков секций.
Поле e_shstrndx хранит индекс заголовка секции, которая хранит имена всех секций
(см. ниже).
fdisk
Fdisk является утилитой, предназначенной для изменения разделов жестких дисков, и ей также можно пользоваться для получения информации о списке имеющихся разделов.
$ sudo fdisk -l Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x30093008 Device Boot Start End Blocks Id System /dev/sda1 * 63 146801969 73400953+ 7 HPFS/NTFS/exFAT /dev/sda2 146802031 976771071 414984520+ f W95 Ext'd (LBA) /dev/sda5 146802033 351614654 102406311 7 HPFS/NTFS/exFAT /dev/sda6 351614718 556427339 102406311 83 Linux /dev/sda7 556429312 560427007 1998848 82 Linux swap / Solaris /dev/sda8 560429056 976771071 208171008 83 Linux
Установка библиотек в Ubuntu
Обычно, если вы используете менеджер пакетов вашего дистрибутива для установки новых программ, то библиотеки устанавливаются автоматически. Но если вы хотите собрать программу из исходников или запустить 32 битную программу на 64 битной системе могут начаться проблемы. Например, при запуске или компиляции программы вы получаете ошибку:
Обычно, в Ubuntu имена пакетов библиотек соответствуют имени нужной библиотеки. Поэтому чтобы определить точное имя в большинстве случаев достаточно воспользоваться поиском по базе пакетов:
Как видите, найдено два варианта библиотеки, libfuse2 и libfuse-dev.
Если библиотека нужна обычной программе и ее не нужно собирать из исходников, то будет достаточно установить библиотеку ubuntu без префикса dev. Например:
Если же вам нужно собрать приложение из исходников, то кроме обычной библиотеки понадобятся заголовочные файлы, в которых содержится описание реализованных в библиотеке функций. Такие пакеты имеют приставку dev, например, libfuse-dev, тогда нужно устанавливать этот пакет, а он уже в зависимостях потянет и обычную библиотеку, если она еще не установлена:
Много проблем может вызвать ситуация, когда вам нужно запустить 32 битную программу в 64 битной системе. Например, если вы установили 64 битную версию библиотеки, а программа все равно говорит о том, что не может ее найти, возможно это 32 битная программа и ей необходима именно 32 библиотека. Если программа не устанавливается с помощью пакетного менеджера, вам тоже придется устанавливать библиотеки вручную.
Посмотреть разрядность бинарника можно с помощью утилиты file:
На скриншоте показаны два варианта вывода программы, для 32 бит, в нашем случае Skype и для 64 — mount.
Для того чтобы установить библиотеку Ubuntu с архитектурой i386 сначала необходимо добавить поддержку архитектуры i386 в dpkg:
Затем обновляем наши репозитории:
А во время установки нужной вам библиотеки теперь необходимо указать архитектуру через двоеточие после имени пакета:
Если вы уверенны, что библиотека установлена, но программа все равно говорит, что такой библиотеки нет, то возможно, ей просто нужна другая версия библиотеки. Например, в системе есть libudev.so.0, а программе нужна libudev.so.0.1. Такое случается, если вы попытаетесь установить пакет для другого дистрибутива, особенно в Red Hat системах. Если в репозиториях нет нужной версии библиотеки, то скорее всего, они одинаковы, и можно просто создать символическую ссылку:
Затем программа найдет нужную библиотеку.
Управление библиотеками в Linux
Установка библиотек ubuntu уже рассмотрена, но хотелось бы упомянуть еще пару моментов. Как я сказал, библиотеки ubuntu размещаются в определенных каталогах, но расположение библиотек можно настроить.
Перед тем как библиотека будет подключена к программе, ее должна найти в системе специальная программа — менеджер библиотек. Он берет адреса библиотек из файла /etc/ld.cache, а этот файл формируется утилитой ldconfig, на основе файлов конфигурации /etc/ld.so.conf.
В этом файле перечислены все пути к библиотекам. Если вы хотите добавить свою папку для библиотек просто добавьте ее в этот файл:
Затем обновите кэш просто выполнив:
Теперь ваша библиотека может быть загружена программой, например, вы можете добавить путь /opt/lib или даже /home/user/lib. И система будет нормально грузить оттуда библиотеки.
Посмотреть какие библиотеки находятся в кеше ld.cache можно командой:
Также мы можем проверить находится ли там определенная библиотека:
Еще один способ указать программе где нужно искать библиотеки — это переменная LD_LIBRARY_PATH. Например:
Теперь программы, запускаемые в этом терминале, кроме стандартных путей поиска библиотек, будут использовать и указанную папку.
hdparm
Команда hdparm получает информацию об устройствах sata, например, жестких дисков.
$ sudo hdparm -i /dev/sda /dev/sda: Model=ST3500418AS, FwRev=CC38, SerialNo=9VMJXV1N Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=unknown, BuffSize=16384kB, MaxMultSect=16, MultSect=16 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=976773168 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 AdvancedPM=no WriteCache=enabled Drive conforms to: unknown: ATA/ATAPI-4,5,6,7 * signifies the current active mode
29.4. Утилита ltrace
Утилита позволяет ознакомиться со списком всех вызовов функций разделяемых библиотек, осуществленных определенной программой. В приведенном ниже примере используется параметр -p, позволяющий получить информацию лишь о суммарном количестве вызовов функций (каждая функция может вызываться множество раз), а также параметр -l, позволяющий выводить информацию о вызовах функций лишь из одного файла разделяемой библиотеки. Все это делается для того, чтобы узнать, какие библиотечные функции вызываются в процессе исполнения команды с привилегиями пользователя root.
root@deb503:~# ltrace -c -l /lib/libpam.so.0 su - serena serena@deb503:~$ exit logout % time seconds usecs/call calls function ------ ----------- ----------- --------- -------------------- 70.31 0.014117 14117 1 pam_start 12.36 0.002482 2482 1 pam_open_session 5.17 0.001039 1039 1 pam_acct_mgmt 4.36 0.000876 876 1 pam_end 3.36 0.000675 675 1 pam_close_session 3.22 0.000646 646 1 pam_authenticate 0.48 0.000096 48 2 pam_set_item 0.27 0.000054 54 1 pam_setcred 0.25 0.000050 50 1 pam_getenvlist 0.22 0.000044 44 1 pam_get_item ------ ----------- ----------- --------- -------------------- 100.00 0.020079 11 total
Основные библиотеки
Это библиотеки основных языков программирования, которые содержат базовую функциональность для взаимодействия с системой.
- libanl.so — библиотека работы с DNS;
- libc.a — основная статическая библиотека языка Си;
- libdl.a — библиотека, отвечающая за загрузку других библиотек во время запуска программы;
- libnsl.so — работа со службой NIS;
- libstdc++.so — стандартная библиотека C++;
- libutil.so — реализует основные часто используемые функции;
- libelf.so — библиотека для работы с бинарными файлами ELF;
- libevent.so — библиотека с реализацией механизма вызова функций после события;
- libgnutls.so — библиотека с основными методами и возможностями, используемыми в стандартных утилитах Linux;
- ld-linux.so — главная библиотека, она собрана в виде статической и не имеет зависимостей. Загружает другие библиотеки и исполняемые файлы. Вы можете вызвать эту библиотеку как программу и передать ей адрес исполняемого файла для запуска.
Библиотеки кодеков
Эти библиотеки содержат наборы кодеков для воспроизведения различных медиа данных. Некоторые из них имеют несвободную лицензию или закрытый исходный код:
- liba52.so — свободный декодер ATSC A/52;
- libavfilter6.so — библиотека фильтров ffmpeg;
- libavcodec57.so — библиотека кодеков ffmpeg;
- libavformat57.so — библиотека форматов ffmpeg;
- libavutil55.so — библиотека дополнительных функций ffmpeg;
- libdv.so — программный кодек для DV;
- libmad.so — MPEG аудио декодер;
- libmpeg2.so — потоковый декодер видео данных;
- libmpg123.so — библиотека консольного плеера mpg123;
- libwebp.so — декодирование формата Webp;
- libxvidcore.so — медиа кодек MPEG-4.
Звуковые библиотеки
- libao.so — библиотека проигрывания звука с простым интерфейсом;
- libasound.so — библиотека взаимодействия со звуковой подсистемой ALSA;
- libaudio2.so — библиотека работы со звуком, входит в состав ALSA;
- libespeak.so — библиотека синтеза речи;
- libpulse.so — библиотека с основными методами PulseAudio;
Графические библиотеки
- libart.so — библиотека с реализацией функций для работы с 3d графикой;
- libaa.so — библиотека ASCII графики;
- libgtk-3.so — набор методов графического фреймворка GTK 3;
- libgd.so — базовые функции работы с графикой и рисования;
- libgif.so — работа с форматом изображений Gif;
- libjpeg.so — работа с изображениями Jpeg;
- libglapi.so — свободная реализация методов для работы с OpenGL;
- libgtk-x11-2.0.so — набор методов библиотеки GTK 2;
- libwx_baseu.so, libwx_baseu_net-3.0.so и другие — набор библиотек фремворка создания графических приложений WX;
- libX11.so — основные методы и функции X сервера;
- libncurses.so — одна из самых популярных библиотек псевдографики;
- libQtGui.so, libQt5Svg.so, libQt5Widgets.so и другие — библиотеки фреймворка разработки графических приложений Qt.
Работа с текстом
- libaspell.so — библиотека проверки орфографии;
- libfreetype.so — библиотека отрисовки шрифтов;
- libharfbuzz.so — библиотека обработки символов Unicode;
- libxml2.so — библиотека разбора XML;
- libyaml-0.so — библиотека разбора Yaml.
Безопасность
- libcrack.so — библиотека с реализацией методов перебора паролей для проверки их надежности;
- libcrypt.so — библиотека, отвечающая за шифрование;
- libssl3.so — библиотека шифрования SSLv3;
- libapparmor.so — библиотека управления системой безопасности AppArrmor;
- libaudit.so — библиотека слежения за состоянием системы и регистрации событий.
Библиотеки драйверов
- libcups.so — библиотека работы с принтером;
- libfuse.so — библиотека организации виртуальных файловых систем;
- libgphoto2.so — библиотека взаимодействия с камерами по USB;
- libsensors.so — используется для получения информации от датчиков на материнской плате;
- libudisks2.so — библиотека usisks, которая отвечает за автоматическое монтирование и обнаружение подключенных устройств;
- libv4l1.so — библиотека работы с веб-камерами;
- libpci.so — библиотека работы с PCI устройствами;
- libusb-1.0.so — библиотека управления USB;
- libdrm.so — библиотека с общими возможностями Direct Rendering Manager, отрисовки графики с помощью видеокарты;
- libdrm_amdgpu.so — DRM для драйвера AMDGPU;
- libdrm_intel.so — DRM для карт Intel;
- libdrm_nouveau.so — свободный DRM для видеокарт Nvidia;
Сеть
- libresolv.so — библиотека получения IP адреса по имени хоста;
- libpcap.so — библиотека анализа и захвата сетевых пакетов;
- libproxy.so — настройка и управление прокси;
Эмуляция
- libSDL.so — библиотека эмуляции загрузки компьютера и базовых возможностей BIOS;
- libwine.so — библиотека прослойки для запуска приложений Windows в Linux.
- libvirt.so — библиотека управления KVM;
Быстрое разрешение проблемы
Если какая-либо из вышеуказанных причин не относится к вашей ситуации или вам по-прежнему не удается сохранить книги, попробуйте следующие варианты, чтобы сохранить файлы в Excel. Чтобы узнать больше о шагах, выберите изображение шеврона слева или заголовок параметра.
|
|
|
|
|
|
Попробуйте сохранить записную книжку в другом месте, например, на локальном жестком диске, сетевом диске или съемном диске. |
|
|
|
Перезапустите Windows в безопасном режиме и попробуйте сохранить книгу на локальный жесткий диск. |