- Linux vdso so 1 debian
- ОПИСАНИЕ
- В качестве примера
- Нахождение vDSO
- Формат файла
- ЗАМЕЧАНИЯ
- Исходный код
- 8 Примеров команд LDD в Linux
- Общие библиотеки
- Синтаксис и параметры
- 1) Отобразить зависимости команды
- 2) Отобразить зависимости команды с деталями
- 3) Отображение неиспользуемых прямых зависимостей команды
- 4) Работа только с динамическими исполняемыми файлами
- 5) ldd со стандартной исполняемой командой
- 6) Установите, что данный исполняемый демон поддерживает TCP Wrapper
- 7) ldd с отсутствующей зависимостью
- Библиотеки в Ubuntu
- Что такое библиотеки
- Установка библиотек в Ubuntu
- Управление библиотеками в Linux
- Выводы
Linux vdso so 1 debian
void *vdso = (uintptr_t) getauxval(AT_SYSINFO_EHDR);
ОПИСАНИЕ
И всё же, зачем нужна vDSO? Есть несколько системных вызовов ядра, которые используются в пользовательском коде настолько часто, что это сильно влияет на общую производительность. Это происходит из-за частого повторения вызовов, а также затрат на переключение контекста, которые возникают при выходе из пользовательского пространства и входа в ядро.
Оставшаяся часть этой документации предназначена для любопытных и/или авторов библиотеки C, а не для обычных разработчиков. Если вы попытаетесь вызвать vDSO в своём приложении не через библиотеку C, то, наиболее вероятно, сделаете это неправильно.
В качестве примера
Заметим, что можно запутаться в терминологии. В системах x86 функция vDSO, используемая для определения предпочтительного метода выполнения системного вызова, называется «__kernel_vsyscall», но в x86_64 термин «vsyscall» также ссылается на устаревший метод запроса ядра о времени или на каком ЦП выполняется вызывающий.
Одним из наиболее часто используемых системных вызовов является gettimeofday(2). Данный вызов используется прямо в приложениях, а также неявно из библиотеки C. Метка времени, временной цикл или опрос — для всего этого часто нужно знать сколько времени в данный момент. Также, это информация не секретна — многие приложения с любыми правами (root или любого не привилегированного пользователя) получат одинаковый ответ. Поэтому ядро размещает информацию, требуемую для ответа на этот вопрос, в памяти процесса. Теперь системный вызов gettimeofday(2) заменяется на вызов обычной функции и доступ к памяти.
Нахождение vDSO
Вы не должны рассчитывать на то, что vDSO отображается в каком-то определённом месте карты пользовательской памяти. Обычно, базовый адрес во время выполнения выбирается произвольным образом каждый раз при создании нового образа процесса (с помощью execve(2)). Это делается в целях безопасности для предотвращения атак «возврат в libc».
Для некоторых архитектур также существует тег AT_SYSINFO. Он используется только для нахождения точки входа vsyscall и часто отсутствует или равен 0 (то есть недоступен). Этот тег — атавизм первых версий vDSO (смотрите История ниже) и не должен использоваться.
Формат файла
Все символы имеют версии (в формате версий GNU). Это позволяет ядру обновлять сигнатуру функции без нарушения обратной совместимости. Смена версии означает изменение аргументов функции или возвращаемого значения. Таким образом, при поиске символа в vDSO, вы всегда должны включать версию для нахождения ожидаемого ABI.
Обычно, vDSO удовлетворяет соглашению об именовании, начиная все символы с «__vdso_» или «__kernel_», для их выделения среди других стандартных символов. Например, функция «gettimeofday» называется «__vdso_gettimeofday».
Для вызова этих функций используйте стандартные соглашения о вызове языка Си. Учитывать поведение регистров и стека не требуется.
ЗАМЕЧАНИЯ
Исходный код
find arch/$ARCH/ -name ‘*vdso*.so*’ -o -name ‘*gate*.so*’
Источник
8 Примеров команд LDD в Linux
ldd – это утилита командной строки Linux, которая используется в том случае, если пользователь хочет знать зависимости от общей библиотеки исполняемого файла или даже библиотеки разделяемой библиотеки.
Библиотека представляет собой набор ресурсов, таких как подпрограммы / функции, классы, значения или спецификации типов.
Существует два типа библиотек:
Статические библиотеки: статические библиотеки для полных программ, которые не зависят от запуска внешних библиотек. Особенностью статически связанных программ является то, что они работают без установки каких-либо предварительных условий. Статическая библиотека заканчивается расширением * .a, и эти библиотеки включены (отдельная копия) в программы, для которых требуются ее функции.
Динамические библиотеки: динамические библиотеки для небольших программ по размеру. Эти библиотеки заканчиваются расширением .so. Еще одна особенность использования динамической компоновки при запуске многих программ. Она может использовать одну копию библиотеки, а не занимать память многими копиями одного и того же кода , Таким образом, последние программы используют динамическое связывание. В этой статье мы рассмотрим команды ldd, которые используются для управления разделяемыми библиотеками.
Общие библиотеки
Когда мы создаем программу, нам нужно много фрагментов кода, которые кто-то написал для выполнения обычных или специализированных функций в наших целях.
Эти фрагменты кода хранятся в разделяемых библиотеках.
Чтобы использовать их, мы связываем их с нашим кодом либо при создании программы, либо при запуске программы.
Синтаксис и параметры
Команда ldd выводит зависимости общих объектов. Синтаксис команды:
Мы можем использовать команды ldd с опциями
- -v: вывести всю информацию.
- -d: перемещение данных процесса.
- -r: данные процесса и перемещение функций.
- -u: вывод неиспользуемых прямых зависимостей.
1) Отобразить зависимости команды
Мы будем отображать зависимости команды cp.
2) Отобразить зависимости команды с деталями
Мы будем отображать зависимости команды cp с более подробной информацией, используя опцию -v.
3) Отображение неиспользуемых прямых зависимостей команды
Мы можем отобразить неиспользуемые прямые зависимости команды cp с использованием опции -u.
4) Работа только с динамическими исполняемыми файлами
Мы выведем ldd только для динамических исполняемых файлов с использованием опции -r.
На выводе было отображено сообщение о том, что предоставленный файл не является динамическим исполняемым файлом.
5) ldd со стандартной исполняемой командой
Когда мы пытаемся выполнить ldd со стандартной командой, например ls, нам нужен полный путь к динамическому исполняемому файлу.
Мы видим, что ldd утверждает, что он не может найти ls.
Но с абсолютным путем ldd работал нормально.
6) Установите, что данный исполняемый демон поддерживает TCP Wrapper
Чтобы определить, поддерживает ли данный исполняемый демона TCP Wrapper или нет, выполните следующую команду.
Результат показывает, что демон OpenSSH (sshd) поддерживает TCP Wrapper.
7) ldd с отсутствующей зависимостью
Мы можем использовать команду ldd, когда исполняемый файл выходит из строя из-за отсутствующей зависимости.
Как только мы обнаружили недостающую зависимость, мы можем установить ее или обновить кеш командой ldconfig.
Мы будем выполнять перемещение и сообщать о любых недостающих объектах (только ELF), набрав команду ниже.
Мы будем выполнять перемещение для объектов и функций данных и сообщать о любых недостающих объектах или функциях (только для ELF), набрав команду ниже.
Источник
Библиотеки в Ubuntu
Как вы знаете каждая программа, установленная на вашем компьютере, состоит из нескольких частей. Это непосредственно исполняемый файл, который вы запускаете через терминал, а также библиотеки с набором функций, которые может использовать программа.
Все, без исключения, программы используют библиотеки. Даже если это ваша программа и у нее нет своих библиотек, она использует стандартную библиотеку языка программирования С.
В этой статье мы подробно рассмотрим что такое библиотеки Ubuntu, как их устанавливать, где брать и что делать если библиотека установлена, а программа говорит что ее нет. Мы не будем трогать создание библиотек, это совсем не наша тема. Как обычно, начнем с теории.
Что такое библиотеки
Библиотеки в Linux содержат наборы функций или если сказать проще алгоритмов или действий для решения определенных задач. Например, если программе нужно вывести строку на экран она не начинает сама закрашивать нужные пиксели, а просто обращается к отвечающей за это функции из библиотеки, то же самое если программе нужно прочитать содержимое файла, она не работает с секторами жесткого диска, ей достаточно вызвать функцию из стандартной библиотеки с (libc.so) и передать ей в параметрах имя нужного файла, а библиотека уже вернет ей запрашиваемые данные.
На самом деле, такая структура реализации программного обеспечения очень выгодна, поскольку достаточно написать алгоритм лишь один раз и его смогут использовать все программы просто загружая библиотеку.
Не нужно думать что библиотеки есть только в Linux, в Windows они тоже есть, только имеют другой формат и расширение dll. В Linux же все библиотеки находятся в папах /lib/, /usr/lib, /usr/local/lib или для 64 битных систем также появляется папка lib64 во всех этих подкаталогах, для библиотек специфичных для этой архитектуры. Библиотека имеет расширение .so и ее название начинается со слова lib. Например, libfuse.so, libc.so.
Дальше, после расширения файла .so идет номер версии библиотеки. Номер версии меняется всякий раз, когда разработчики вносят в нее изменения ломающие совместимость со всеми рассчитанными на нее программами. В таком случае в системе будут уже две библиотеки и каждая программа будет использовать правильную версию. Например, glibc.so.6 и glibc.so.5.
Если интересно можно даже посмотреть какие библиотеки и каких версий, использует та или иная программа, например:
linux-vdso.so.1 (0x00007ffd99167000)
libmount.so.1 => /usr/lib64/libmount.so.1 (0x00007f0f6beb0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0f6bb08000)
libblkid.so.1 => /usr/lib64/libblkid.so.1 (0x00007f0f6b8c8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f0f6b6a4000)
/lib64/ld-linux-x86-64.so.2 (0x000055aca8227000)
libuuid.so.1 => /usr/lib64/libuuid.so.1 (0x00007f0f6b49f000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f0f6b238000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0f6b034000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0f6ae17000)
Также эта информация может быть полезна при создании портативных версий программ. А теперь давайте рассмотрим как устанавливаются библиотеки в Ubuntu.
Установка библиотек в Ubuntu
Обычно, если вы используете менеджер пакетов вашего дистрибутива для установки новых программ, то библиотеки устанавливаются автоматически. Но если вы хотите собрать программу из исходников или запустить 32 битную программу на 64 битной системе могут начаться проблемы. Например, при запуске или компиляции программы вы получаете ошибку:
error while loading shared libraries: xxxx.so.0
cannot open shared object file no such file or directory
Обычно, в Ubuntu имена пакетов библиотек соответствуют имени нужной библиотеки. Поэтому чтобы определить точное имя в большинстве случаев достаточно воспользоваться поиском по базе пакетов:
apt search libfuse
Как видите, найдено два варианта библиотеки, libfuse2 и libfuse-dev.
Если библиотека нужна обычной программе и ее не нужно собирать из исходников, то будет достаточно установить библиотеку ubuntu без префикса dev. Например:
sudo apt install libfuse2
Если же вам нужно собрать приложение из исходников, то кроме обычной библиотеки понадобятся заголовочные файлы, в которых содержится описание реализованных в библиотеке функций. Такие пакеты имеют приставку dev, например, libfuse-dev, тогда нужно устанавливать этот пакет, а он уже в зависимостях потянет и обычную библиотеку, если она еще не установлена:
sudo apt install libfuse-dev
Много проблем может вызвать ситуация, когда вам нужно запустить 32 битную программу в 64 битной системе. Например, если вы установили 64 битную версию библиотеки, а программа все равно говорит о том, что не может ее найти, возможно это 32 битная программа и ей необходима именно 32 библиотека. Если программа не устанавливается с помощью пакетного менеджера, вам тоже придется устанавливать библиотеки вручную.
Посмотреть разрядность бинарника можно с помощью утилиты file:
На скриншоте показаны два варианта вывода программы, для 32 бит, в нашем случае Skype и для 64 — mount.
Для того чтобы установить библиотеку Ubuntu с архитектурой i386 сначала необходимо добавить поддержку архитектуры i386 в dpkg:
sudo dpkg —add-architecture i386
Затем обновляем наши репозитории:
sudo apt update
А во время установки нужной вам библиотеки теперь необходимо указать архитектуру через двоеточие после имени пакета:
sudo apt install libfuse-dev:i386
Если вы уверенны, что библиотека установлена, но программа все равно говорит, что такой библиотеки нет, то возможно, ей просто нужна другая версия библиотеки. Например, в системе есть libudev.so.0, а программе нужна libudev.so.0.1. Такое случается, если вы попытаетесь установить пакет для другого дистрибутива, особенно в Red Hat системах. Если в репозиториях нет нужной версии библиотеки, то скорее всего, они одинаковы, и можно просто создать символическую ссылку:
ln -s /lib/libudev.so.0 /lib/libudev.so.0.1
Затем программа найдет нужную библиотеку.
Управление библиотеками в Linux
Установка библиотек ubuntu уже рассмотрена, но хотелось бы упомянуть еще пару моментов. Как я сказал, библиотеки ubuntu размещаются в определенных каталогах, но расположение библиотек можно настроить.
Перед тем как библиотека будет подключена к программе, ее должна найти в системе специальная программа — менеджер библиотек. Он берет адреса библиотек из файла /etc/ld.cache, а этот файл формируется утилитой ldconfig, на основе файлов конфигурации /etc/ld.so.conf.
В этом файле перечислены все пути к библиотекам. Если вы хотите добавить свою папку для библиотек просто добавьте ее в этот файл:
Затем обновите кэш просто выполнив:
Теперь ваша библиотека может быть загружена программой, например, вы можете добавить путь /opt/lib или даже /home/user/lib. И система будет нормально грузить оттуда библиотеки.
Посмотреть какие библиотеки находятся в кеше ld.cache можно командой:
Также мы можем проверить находится ли там определенная библиотека:
ldconfig -p | grep libjpeg
Еще один способ указать программе где нужно искать библиотеки — это переменная LD_LIBRARY_PATH. Например:
Теперь программы, запускаемые в этом терминале, кроме стандартных путей поиска библиотек, будут использовать и указанную папку.
Выводы
Вот и все. Теперь вы знаете как работают библиотеки Ubuntu, как выполняется установка библиотек Ubuntu и делать так, чтобы программа видела нужную ей библиотеку. У новичков это может вызвать очень много головной боли, но теперь вы знаете что делать и избежите многих ошибок. Если у вас остались вопросы, пишите в комментариях!
Источник