uClibc

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 14:07, 18 марта 2017.

uClibc
Wzomzot 1.jpg
Разработчики: Erik Andersen
Выпущена: 13 February 2000 года; 20 years ago (2000-02-13)
Написана на: C
Операционная система: Linux
Платформа: Embedded Linux
Лицензия: GNU LGPL
Веб-сайт www.uclibc.org

uClibc - представляет собой библиотеку на языке программирования C, для разработки встраиваемых систем на базе Linux.

Разработка

Большинство современных операционных систем состоят из слоя ядра и пространства пользователя. В то время, как ядро имеет дело непосредственно с аппаратными ресурсами на самом высоком уровне привилегий, пользовательское пространство имеет дело с конечным пользователем и работает на самом низком уровне. Две части одного целого взаимодействуют друг с другом с помощью системных вызовов. Пользовательское приложение может задавать системный запрос(например, в x86 ISA, через INT 0x80), а большая часть пользовательских системных запросов на обычной системе UNIX направляются через одну центральную библиотеку, которую называют стандартной библиотекой C. Наряду с компилятором и другими утилитами, чтобы управлять исполняемым двоичных файлом(например, GNU Binutils (Binary Utilities)), она является неотъемлемой частью инструментов и остается зависимостью времени от выполнения почти каждого динамически связанного объекта в системе.
Безусловно, наиболее популярным является "GNU C"(Glibc), но для встраиваемых систем uClibc является стандартной библиотекой выбора, конечно, есть и другие варианты(musl libc).
uClibc(где "u" иногда пишется, как греческий символ, обозначающий "Микро") намного меньше, чем та же Glibc, гораздо быстрее и имеет больше конфигураций.

Применение

Дальнейшая разработка uClibc сделала ее в более подходящей для систем, таких как Lilblue Linux. C повышенной безопасностью и полнофункциональным Xfce (свободная среда рабочего стола), системой AMD Athlon 64 основанной на uClibc. Недавнее добавление POSIX, означало, что пользователи могли бы, наконец, реализовать свой полный комплект цепи инструментов упрочнения от Glibc:

Таким образом, этот суб-проект, основанный на базе uClibc, можно рассматривать не только для "встраиваемых систем" и альтернативы glibc.

Дистрибутивы с поддержкой uClibc

В целом uClibc альтернатива Glibc, следовательно, где поддерживается Glibc можно установить uClibc.

Переход к uClibc-ng

Последнее обновление uClibc произошло в 15.05.2012. В целом, создатель проекта не заинтересован в продолжении и проект считается "мертвым". Тем не менее, кодовая база была раздвоена. Так появился новый проект uClibc-ng и активно поддерживается. Для новых пользователей в целом никаких изменений, но для тех, кто еще знаком со старой версией, нужно мигрировать uClibc до uClibc-ng. К сожалению, не существует простой миграции, но следующие пару абзацев, объясняют как это выполнить. Прежде, чем что-то изменять, рекомендуется выполнить резервное копирование, чтобы если что-то пойдет не так, у вас была "точка восстановления".
Перед тем, как начать, убедитесь, что ваш /etc/portage/savedconf/sys-libs/uclibc-ng файл именно тут, или правильно установлены USE флаги.
Во-первых, построить sys-libs/uclibc-ng и установить его в /var/tmp/sys-libs/uclibc-ng/image , но не пересылайте его в корневую файловую систему. Оба sys-libs/uclibc и uclibc-ng блокируют друг друга, так что вы не сможете просто выйти из uclibc-ng. Даже если вам удастся, это нарушит вашу систему, так как sys-libs/uclibc полностью удаляется перед sys-libs/uclibc-ng. Таким образом, мы будем отправлять пакет в корневую файловую систему в ручную.
Построим sys-libs/uclibc-n, далее все консольные команды выполнены под root пользователем:

cd /usr/portage/sys-libs/uclibc-ng
ebuild uclibc-ng-1.0.17.ebuild clean install

Создадим копию /lib в случае, когда нужно восстановить систему:

cd /
cp -a /lib /lib.bak

Затем переместим все содержимое /var/tmp/portage/sys-libs/uclibc-ng/image/lib в /lib.

cp -a /var/tmp/portage/sys-libs/uclibc-ng/image/lib /lib.new
mv /lib.new/* /lib

Теперь удостоверимся, что правильно скопировали файлы:

ls -al /lib/ld-uClibc.so.0

Вы должны удостовериться, что /lib/ld-uClibc.so.0 -> ld-uClibc-0.1.0.17.so или в зависимости от вашей рабочей версии sys-libs/uclibc-ng. Если версия до 0.9.33.2, то у Вас установлена более ранняя версия uClibc. Сейчас Вы можете удалить содержимое /lib от старых файлов uClibc, но мы будем их перемещать в случае, если они понадобятся.

mkdir /root/oldlibc
mv /lib/*0.9.33.2* /root/oldlibc

Поздравляем Ваша система была преобразована в sys-libs/uclibc-ng, но система думает, что у вас до сих пор установлена uClibc, т.е. мы должны удалить вручную оставшиеся файлы.

rm -rf /var/db/pkg/sys-libs/uclibc-0.9.33.2-r15
emerge uclibc-ng

Вы сделали, теперь вы можете использовать uClibc-ng в качестве поставщика LibC.

Обновление до sys-libs/uclibc-ng-1.0.22

uClibc-ng имеет два основных обновления. Версия 1.0.19 содержит библиотеки libcrypt.so.0, libdl.so.0 и другие. Функции в этих библиотеках, теперь включены в libuClibc-0.1.0.19.so. Версия 1.0.21 и выше используют поддержку obstack, ожидая пакеты, чтобы использовать их в комплекте GNU код Lib. Оба изменения требуют специальных процедур обновления, которые приведены ниже. Из-за изменений в структуре библиотеки в предыдущих версиях, убедитесь, что вы работаете с 1.0.19

emerge -evq @world

Это позволит убедиться, что все исполняемые файлы ссылаются непосредственно libc.so.0

USE="-symlink-compat" emerge =sys-libs/uclibc-ng-1.0.20

Избавьтесь от obstack.h заголовка с момента его используется надстроечных скриптов, чтобы искать прототипы функций и макросов:

mv /usr/include/obstack.h ~

Нам также необходимо использовать GNU Lib. Мы можем сделать это путем удаления определения _GNU_OBSTACK_INTERFACE_VERSION из Gnu-version.h

cp /usr/include/gnu-versions.h ~
sed -i -e '/#define _GNU_OBSTACK/d' /usr/include/gnu-versions.h

Мы должны сделать, чтоб stdio.h __UCLIBC_HAS_OBSTACK__ ложно. Мы делаем это с помощью файла uClibc_config.h.:

cp /usr/include/bits/uClibc_config.h ~
sed -i -e '/__UCLIBC_HAS_OBSTACK__/ s/1/0/' /usr/include/bits/uClibc_config.h

Чтобы обезопасить себя, вы можете создать резервную копию всего /lib каталога:

cp -a /lib /lib.bak

Теперь, когда Вы пересобрали @world, все пакеты будут использовать код obstack, и не в зависимости от LibC, чтобы обеспечить его:

ac_cv_func_obstack_vprintf=no emerge --keep-going --exclude sys-libs/uclibc-ng -evq @world

Теперь обновим uClibc-ng до последней версии:

emerge =sys-libs/uclibc-ng-1.0.22

Перестроим всю систему:

emerge —evq @world

Примечание

  1. uClibc [Электронный ресурс]: A C library for embedded Linux/ Дата обращения: 05.03.2017. Режим доступа: http://www.uclibc.org/FAQ.html

Источник

  1. Gentoo linux,wiki[Электронный ресурс]: Project:Hardened uClibc/ Дата обращения: 05.03.2017. Режим доступа:https://wiki.gentoo.org/wiki/Project:Hardened_uClibc