Linux libc dev что это

Обновлено: 06.07.2024

Как установить компилятор GNU / GCC (C и C ++) и связанные с ним инструменты (например, make, debugger, man pages) в операционной системе Ubuntu Linux с использованием параметров командной строки?

Вам необходимо установить следующие пакеты на Debian и Ubuntu Linux:

  1. libc6-dev – стандартная C библиотека.
  2. gcc – C компилятор.
  3. g++ – C++ компилятор.
    1. make – GNU делает утилиту для поддержки групп программ.
    2. dpkg-dev – Инструменты разработки пакетов Debian.

    В принципе, build-essential пакет содержит информационный список пакетов, которые считаются необходимыми для создания пакетов Ubuntu, включая gcc-компилятор, make и другие необходимые инструменты. Этот пакет также зависит от пакетов в этом списке, чтобы упростить установку build-essential пакетов. В этом руководстве вы узнаете об установке компилятора GNU C и компилятора GNU C ++ на Ubuntu Linux.

    3 января стартует курс «SQL-injection Master» © от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 10 января. Подробнее .

    Установка компиляторов с помощью команды apt

    Откройте приложение терминала и введите следующее apt command /apt-get command :

    Пример вывода данных:

    Установка GNU GCC Компилятора и среды разработки на Ubuntu Linux

    Рис.01: Как я устанавливаю инструменты разработки на Ubuntu Linux?

    Проверка установки

    Введите следующую команду:

    Установка компиляторов с помощью команды apt

    Рис.02: Поиск установленной версии make и gcc

    Установка страниц dev man на Ubuntu Linux

    Введите следующую команду:

    Чтобы посмотреть запросы библиотеки (функция в библиотеках программы) введите:

    Установка компиляторов разработки X11

    Введите следующую команду:

    Это интересно:

    1 декабря стартует зимний поток курса " Тестирование Веб-Приложений на проникновение " от команды codeby . Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, активный фаззинг, уязвимости, пост-эксплуатация, инструментальные средства, Social Engeneering и многое другое. На курс можно записаться до 10 декабря включительно. Подробнее .

    Дата и время публикации: 2020-01-20 14:15:00 Дата и время редакции: 2020-11-22 5:15:00

    Проблема и решение

    Кроме того, файлы defconfig полностью или их фрагментарная часть используются для настройки конфигурации ядра linux в окружении сборочной машины Yocto/poky, которая собирает свой собственный дистрибутив Linux для встраиваемых решений для архитектуры x86 , так и различных технических платформ на базе архитектуры ARM и т.п.

    А так же обязательные пакеты, такие как bison, bc, kmod, cpio, flex и cpio , большинство из которых устанавливаются с использованием мета-пакетом gnulib или отсутствуют в зависимостях выше перечисленных пакетов.

    Из которого видно, что в данном случае были установлены исходники версии 5.4 , что соответствует архивному файлу /usr/src/linux-source-x.x.tar.xz , который следует распаковать в рабочую директории пользователя и перейти в $HOME/build/usr/src/linux-source-x.x , как показано в дампе 2.3

    Затем, создаем файл конфигурации c использованием файла defconfig , как показано в дампе 2.4

    Но, более предпочтительным будет использовать конфигурацию от ядра Debian-built , которое прежде должно быть скопировано из файла /boot/config-$(uname r) в .config , а затем, ответить на дополнительно возникшие вопросы, если ответы на них отсутствуют из-за расхождения в версии ядра, как показано в дампе 2.4.1

    Также, для уточнение некоторых вопросов, можно использовать make menuconfig , как показано в дампе 2.5

    В результате должна быть отобразится псевдографический интерфейс на базе ncurses, как показано на рисунке 2.6

    Затем, кроме 5-й версии ядра, необходимо позаботится о том, чтобы для измененной конфигурации были сброшены доверенные ключи, как показано в дампе 2.7

    Но, лучше создать директорию debian/certs/ , а в ней файл конфигурации ключа протокола x509 , как показано в дампе 2.8

    Сгенерировать пару приватный/публичный ключ, как показано в дампе 2.9

    Иначе, сборка может закончится отказом, как показано в дампе 2.9

    Cборка ядра запускается командой, показанной в дампе 2.10

    Где опция -j$(nproc) указывается количество задействованных ядер. После успешного завершения компиляции ядра запустить сборку пакетов, как показано в дампе 2.11

    Сайт разработан в соответствии с рекомендациями консорциума W3C для языка разметки HTML5.

    В качестве упражнения я хочу написать программу на С. Достаточно простую для того, чтобы дизассемблировать ее и объяснить весь код самой себе.

    Звучит несложно, правильно?

    У читателя предполагается наличие опыта компиляции программ и работы в Линуксе. Небольшое умение читать ассемблерный код тоже пригодится.

    Итак, вот наш простейший хелловорлд:


    Скомпилируем его и посчитаем количество символов:


    Фигасе! Откуда берутся эти 11 килобайт? objdump -t hello показывает 79 записей в таблице идентификаторов, за большинство из которых ответственна стандартная библиотека.

    Так что мы не будем ее использовать. И printf мы тоже не будем использовать, чтобы избавиться от инклюда:


    Перекомпилируем и пересчитаем количество символов:


    Почти ничего не изменилось? Ха!

    Проблема в том, что gcc все ещё использует startup files (?) во время линкования. Доказательства? Скомпилируем с ключом -nostdlib , после чего (в соответствии с документацией) gcc «не будет использовать при линковании системные библиотеки и startup files. Использоваться будут только явно переданные линкеру файлы».


    Всего лишь предупреждение, все равно попробуем:


    Выглядит неплохо! Мы уменьшили размер до значительно более вменяемого (аж на целый порядок!)…


    …и заплатили за это сегфолтом. Блин.

    Для развлечения сделаем нашу программу запускаемой до того, как начнем разбираться в ассемблере.

    Что же делает символ _start , который похоже нужен для запуска программы? Где он обычно определяется при использовании libc?

    По умолчанию с точки зрения линкера именно _start , а не main , является настоящей точкой входа в программу. Обычно _start определяется в перемещаемом ELF crt1.o . Убедимся в этом, слинковав хелловорлд c crt1.o и заметив, что _start теперь обнаруживается (но взамен появились другие проблемы из-за того, что не определены другие startup symbols libc):


    Проверка сообщила, что на этом компьютере _start живет в исходнике libc: sysdeps/x86_64/elf/start.S . Этот восхитительно комментированный файл экспортирует символ _start , инициализирует стек, некоторые регистры и вызывает __libc_start_main . Если посмотреть в самый низ csu/libc-start.c , можно увидеть вызов _main нашей программы:

    Так вот зачем нужен _start . Для удобства подытожим происходящее между _start и вызовом main : инициализировать кучу вещей для libc и вызвать main . А раз libc нам не нужен, экспортируем собственный символ _start , который только и умеет, что вызывать main , и слинкуем с ним:


    Скомпилируем и выполним хелловорлд с ассемблерной заглушкой _start :


    Ура, с компиляцией проблем больше нет. Но сегфолт никуда не делся. Почему? Скомпилируем с отладочной информацией и заглянем в gdb. Установим брейкпоинт на main и пошагово исполним программу до сегфолта:


    Что? main исполняется два раза? …Пришло время взяться за ассемблер:


    Хех! Подробный разбор ассемблера оставим на потом, отметив вкратце следующее: после возврата из callq в main мы исполняем несколько nop и возвращаемся прямо в main . Поскольку повторный вход в main был осуществлен без установки указателя инструкции возврата на стеке (как части стандартной подготовки к вызову функции), второй вызов retq пытается достать из стека фиктивный указатель инструкции возврата и программа вылетает. Нужен способ завершения.

    Буквально. После возврата из callq в %eax делается push 1 , код системного вызова sys_exit , и т.к. нужно сообщить о правильном завершении кладем в %ebx 0 , единственный аргумент SYS_exit . Теперь входим в ядро с прерыванием int $0x80 .


    Ура! Программа компилируется, запускается, при прогоне через gdb даже нормально завершается.

    Привет из свободного от libc мира!

    Оставайтесь со мной, во второй части разберем ассемблерный код подробно, посмотрим что случится, если сделать программу более сложной, и еще немного разберемся в линковании, соглашениях о вызовах и структуре двоичного ELF файл в х86 архитектуре.

    Процессы операционной системы в большинстве случаев отождествляются с выполняющимися программами, что не совсем верно, точнее — совсем не верно. В современных операционных системах, включая Linux, между программой и процессом есть очевидная взаимосвязь, но далеко не такая непосредственная, как кажется на первый взгляд.

    Программа представляет собой алгоритм, записанный на определенном языке, понятном исполнителю программы (программа политической партии и программа научной конференции имеют тот же смысл, что и компьютерная программа, но предназначены для других исполнителей).

    Различают машинный язык, понятный центральному процессору, и языки более высоких уровней (алгоритмические), понятные составителю программы — программисту.

    Программы, составленные на языке высокого уровня, в любом случае перед исполнением должны быть транслированы (переведены) на язык исполнителя, что реализуется при помощи специальных средств — трансляторов.

    Различают два вида трансляторов программ — компиляторы и интерпретаторы. Компилятор транслирует в машинный код сразу всю программу целиком и не участвует в ее исполнении. Интерпретатор, наоборот, пошагово транслирует отдельные инструкции программы и немедленно выполняет их.

    Например, командный интерпретатор при интерактивном режиме пошагово, выполняет команды, вводимые пользователем, а в пакетном режиме так же пошагово выполняет команды, записанные в файле сценария.

    Алгоритм, в свою очередь, есть некоторый набор инструкций, выполнение которых приводит к решению некоторой задачи.

    В большинстве случаев, инструкции алгоритма имеют причинно-следственные зависимости и выполняются исполнителем последовательно. Однако если выделить «независимые» поднаборы инструкций (независимые ветви), то их можно выполнять несколькими исполнителями одновременно — параллельно.

    Поэтому различают последовательные и параллельные алгоритмы и соответствующие им последовательные и параллельные программы.

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

    Согласно hier, откомпилированные до машинного языка программы размещаются в каталогах /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, а библиотеки — в каталогах /lib, /usr/lib, /usr/local/lib.

    Программы и библиотеки

    $ which ls

    $ file /bin/ls

    /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[shal]=0x83531f308flfal8221be53eaf399303400cl4638, stripped

    $ ldd /bin/ls

    libselinux.so.l => /lib/i386-linux-gnu/libselinux.so.1 (0xb7708000) librt.so.l => /lib/i386-linux-gnu/librt.so.l (0xb76ff000) libacl.so.l => /lib/i386-linux-gnu/libacl.so.l (0xb76f5000)

    libc.so.6 => /lib/1386-linux-gnu/libc. so.6 (0xb754b000)

    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb752b000) libattr.so.l => /lib/i386-linux-gnu/libattr.so.l (0xb7525000)

    $ file lib/i386-linux-gnu/libc.so.6

    Нужно заметить, что файла библиотеки linux-gate.so.1 (реализующей интерфейс системных вызовов к ядру) не существует, т. к. она является виртуальной (VDSO, virtual dynamic shared object), т. e. предоставляется и отображается в память процесса самим ядром, «как будто» является настоящей библиотекой.

    Кроме того, библиотека ld-llnux.so.2 указана абсолютным путевым именем, поэтому поиск ее файла не производится.

    Для большинства библиотек зависимость устанавливается при помощи SONAME вида libNAME.so.x где lib — стандартный префикс (библиотека), .so — суффикс (разделяемый объект), NAME — имя «собственное», а .X — номер версии ее интерфейса. По имени SONAME в определенных (конфигурацией компоновщика — ld.so и ldconfig) каталогах производится поиск одноименного файла библиотеки, который на самом деле оказывается символической ссылкой на «настоящий» файл библиотеки.

    Например, для 6-й версии интерфейса динамической библиотеки языка с (libc.so.6) настоящий файл библиотеки называется libc-2.15.so, что указывает на версию самой библиотеки как 2.15.

    Версии библиотек

    $ file /lib/1386-linux-gnu/libacl.so. 1

    Аналогично, в листинге выше показано, что для 1-й версии интерфейса динамической библиотеки списков контроля доступа acl (libacl.so. 1) настоящий файл библиотеки называется libacl.so.1.1.0, а это указывает на версию самой библиотеки как 1.1.0.

    Такой подход позволяет заменять (исправлять ошибки, исправлять неэффективные алгоритмы и пр.) библиотеки (при условии неизменности их интерфейсов) отдельно от программ, зависящих от них.

    При обновлении библиотеки libc-2.15.so, например, до libc-2.i8.so достаточно установить символическую SONAME-ссылку libc.so.6 на libc-2.18.so, в результате чего ее начнут использовать все программы с зависимостями от libc.so.6.

    Более того, в системе может быть одновременно установлено любое количество версий одной и той же библиотеки, реализующих одинаковые или разные версии интерфейсов, выбор которых будет указан соответствующими SONAME-ссылками.

    Библиотеки- это незапускаемые программы

    $ file /lib/i386-linux-gnu/libc-2.15.so

    /lib/i386-linux-gnu/libc-2.15.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs),

    BuildID[shal]=0x87bb99bc34Ofl345950611a3d9cfeclcb49532dc, for GNU/Linux 2.6.24, stripped

    $: file /llb/i386-linux-gnu/libacl.so.1.1.0

    /llb/1386-llnux-gnu/llbacl.so.1.1.0: ELF 32-blt LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BulldID[shal]=0xd48c066c7c7deba7c88505fe434d4601e3e91f50, stripped

    $: ldd /llb/l386-llnux-gnu/llbacl.so.1.1.0

    libattr.so.l => /lib/1386-linux-gnu/llbattr.so.1 (0xb76ca000)

    libc.so.6 => /lib/i386-ltnux-gnu/libc.so.6 (0xb7520000)

    Библиотеки имеют тот же бинарный формат W:[ELF], что и «запускаемые» программы, но не «запускаемый» executable, а «совместно используемый» shared object.

    Библиотеки, являясь пусть и незапускаемыми, но программами, естественным образом тоже зависят от Других библиотек, что показано в листинге выше.

    Практически, «запускаемость» ELF-файлов зависит не от их типа, а от прав доступа и осмысленности точки входа адреса первой инструкции, которой передается управление при попытке, запуска. Например, библиотеку libc-2.15.so можно запустить, в результате чего будет выведена статусная информация.

    Запускаемые библиотеки

    $ Is -l lib/l386-linux-gnu/libc-2.15.so

    -rwxr-xr-x 1 root root 1730024 окт. 6 2018 /lib/i386-linux-gnu/libc-2.15.so

    $ lib/l386-linux-gnu/libc-2.15.so

    GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10.3) stable release version 2.15, by Roland McGrath et al.

    crypt add-on version 2.1 by Michael Glad and others GNU Libidn by Simon Josefsson

    ★ Native POSIX Threads Library by Ulrich Drepper et al

    Выполняющиеся программы являются основными активными сущностями, инструкции которых при помощи механизма системных вызовов потребляют ресурсы, находящиеся под управлением операционной системы. Распределением этих ресурсов и занимаются подсистемы управления процессами, управления памятью и ввода-вывода, в достаточно детальной мере рассмотренные в этой главе.

    Основной задачей этих подсистем является организация эффективного распределения ресурсов между массой их потребителей — процессами и нитями.

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

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

    Навыки мониторинга и трассировки потребления ресурсов процессами помогут сделать массу полезнейших выводов о свойствах выполняющихся в них программ, что чрезвычайно полезно при разработке качественного программного обеспечения.

    Не лишними эти навыки будут и при выборе качественного программного обеспечения для эксплуатации в заданных условиях и с требуемыми характеристиками.

    Читайте также: