diff --git a/chapter08/gcc.xml b/chapter08/gcc.xml index 0e1b9ea..3e0ad7b 100644 --- a/chapter08/gcc.xml +++ b/chapter08/gcc.xml @@ -73,12 +73,14 @@ cd build ../configure --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ + --enable-default-pie \ + --enable-default-ssp \ --disable-multilib \ --disable-bootstrap \ --with-system-zlib - Обратите внимание, что для поддержки других языков программирования существуют - дополнительные условия, которые пока недоступны. См. страницу + GCC поддерживает семь различных языков программирования, но предварительные условия + для большинства из них еще не выполнены. См. страницу BLFS Book GCC для получения инструкций о том, как собрать все языки, поддерживаемые GCC @@ -89,7 +91,7 @@ cd build LD=ld Этот параметр указывает скрипту configure использовать ld, установленный - программой binutils, собранной ранее в этой главе, а не кросс версию, которая + программой Binutils, собранной ранее в этой главе, а не кросс версию, которая использовалась бы в противном случае. @@ -98,11 +100,29 @@ cd build --with-system-zlib Этот параметр указывает GCC ссылаться на установленную в системе копию - библиотеки zlib, а не на собственную внутреннюю копию. + библиотеки Zlib, а не на собственную внутреннюю копию. + + + + PIE (позиционно-независимые исполняемые файлы) — это двоичные программы, которые + можно загружать в любое место памяти. Без PIE функция безопасности под названием + ASLR (рандомизация размещения адресного пространства) может применяться к общим + библиотекам, но не к самим исполняемым файлам. Включение PIE позволяет использовать + ASLR для исполняемых файлов в дополнение к общим библиотекам и смягчает некоторые + атаки, основанные на фиксированных адресах конфиденциального кода или данных в + исполняемых файлах. + + + SSP (Stack Smashing Protection - защита от разрушения стека) — это метод, гарантирующий, + что стек параметров не будет поврежден. Повреждение стека может, например, изменить адрес + возврата подпрограммы, тем самым передав управление какому-то опасному коду (существующему + в программе или общих библиотеках или каким-то образом внедренному злоумышленником). + + Скомпилируйте пакет: make @@ -110,11 +130,11 @@ cd build В этом разделе набор тестов для GCC считается важным, но занимает много времени. Начинающим сборщикам не рекомендуется пропускать его. Время выполнения тестов можно - значительно сократить, добавив -jx в приведенную ниже команду make, где x - количество - ядер в вашей системе. + значительно сократить, добавив -jx в приведенную ниже команду make -k check, + где x - количество ядер в вашей системе. - Известно, что один набор тестов GCC исчерпывает стек по умолчанию, поэтому увеличьте + Известно, что один набор тестов GCC переполняет стек по умолчанию, поэтому увеличьте размер стека перед запуском тестов: ulimit -s 32768 @@ -129,15 +149,19 @@ su tester -c "PATH=$PATH make -k check" ../contrib/test_summary - Чтобы получить только итоговую сводку, передайте выходные данные grep + Чтобы отфильтровать только итоговую сводку, передайте вывод через pipe grep -A7 Summ. Результаты можно сравнить с результатами, размещенными на и . - Известно, что в g++ четыре теста, относящиеся к PR100400, сообщают как XPASS, - так и FAIL. Это потому, что тестовый файл написан не очень хорошо. + Известно, что одиннадцать тестов в наборе тестов i386 для компилятора gcc завершаются + неудачно. Это связано с тем, что в тестовых файлах не учитывается параметр + --enable-default-pie. + + Четыре теста, относящиеся к PR100400, сообщают как XPASS, так и FAIL при проверке + компилятора g++. Это происходит потому что тестовый файл написан не очень хорошо. Не всегда удается избежать неожиданных сбоев. Разработчики GCC обычно знают об этих проблемах, но еще не решили их. Если результаты теста не сильно отличаются @@ -157,9 +181,9 @@ su tester -c "PATH=$PATH make -k check" make install Каталог сборки GCC теперь принадлежит пользователю - tester, и владелец на - каталог (и его содержимое) указан неверно. Измените владельца - на пользователя и группу root: + tester, и владелец каталога заголовочных файлов (и его содержимого) указан + неверно. Измените владельца на пользователя и группу + root: chown -v -R root:root \ /usr/lib/gcc/$(gcc -dumpmachine)/&gcc-version;/include{,-fixed} @@ -196,11 +220,11 @@ readelf -l a.out | grep ': /lib' Теперь убедитесь, что мы настроили использование правильных стартовых файлов: -grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log +grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log Вывод последней команды должен быть: -/usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../lib/crt1.o succeeded +/usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../lib/Scrt1.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../lib/crti.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../lib/crtn.o succeeded @@ -241,7 +265,7 @@ SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib"); - 32-разрядная система может видеть несколько разных каталогов. Например, вот + 32-разрядная система может использовать несколько других каталогов. Например, вот вывод с компьютера i686: SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32") @@ -302,10 +326,10 @@ mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib libgcc_s.so, libgcov.a, libgomp.{a,so}, libitm.{a,so}, liblsan.{a,so}, liblto_plugin.so, libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a, - libstdc++.{a,so}, libstdc++fs.a, libsupc++.a, libtsan.{a,so}, + libstdc++.{a,so}, libstdc++fs.a, libsupc++.a, libtsan.{a,so} и libubsan.{a,so} - /usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc, и + /usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc и /usr/share/gcc-&gcc-version; @@ -339,7 +363,7 @@ mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib cpp Препроцессор C; он используется компилятором для расширения инструкций - #include, #define и аналогичных инструкций в исходных файлах + #include, #define и подобные директивы в исходных файлах cpp @@ -486,8 +510,7 @@ mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib libgcov - Эта библиотека компонуется с программой, когда для GCC указано - использовать профилирование + Эта библиотека компонуется с программой, когда в GCC включено профилирование libgcov @@ -528,7 +551,7 @@ mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib liblto_plugin - Плагин GCC LTO позволяет binutils обрабатывать объектные файлы, + Плагин GCC LTO позволяет Binutils обрабатывать объектные файлы, созданные GCC с включенным LTO. liblto_plugin @@ -549,7 +572,8 @@ mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib libssp - Содержит подпрограммы, поддерживающие функциональность защиты стека GCC. + Содержит подпрограммы, поддерживающие функциональность защиты стека GCC. + Обычно они не используются, потому что Glibc также предоставляет эти подпрограммы. libssp diff --git a/chapter08/gdbm.xml b/chapter08/gdbm.xml index a5fc019..bc19d30 100644 --- a/chapter08/gdbm.xml +++ b/chapter08/gdbm.xml @@ -25,7 +25,7 @@ Пакет GDBM содержит менеджер баз данных GNU. Это библиотека функций базы данных, использующая расширяемое хеширование и работающая аналогично - стандартной UNIX dbm. Библиотека предоставляет примитивы для хранения пар + стандартной СУБД UNIX. Библиотека предоставляет примитивы для хранения пар ключ/значение, поиска и извлечения данных по его ключу и удаления ключа вместе с его данными. diff --git a/chapter08/gettext.xml b/chapter08/gettext.xml index cf2d545..3426ed0 100644 --- a/chapter08/gettext.xml +++ b/chapter08/gettext.xml @@ -60,8 +60,8 @@ BISON_LOCALEDIR=/usr/share/locale Since bison is not yet installed in /usr, configure hardcodes - the directory containing translations for the bison program (the - "locale" directory) as /tools/share/locale. Passing this variable + the directory containing translations for the bison program (the + "locale" directory) as /tools/share/locale. Passing this variable to make allows overriding the choice made by configure. @@ -337,7 +337,7 @@ chmod -v 0755 /usr/lib/preloadable_libintl.so libasprintf - определяет класс autosprintf, который делает + Определяет класс autosprintf, который делает подпрограммы вывода в формате C пригодными для использования в программах на C++ для использования со строками <string> и потоками <iostream> @@ -350,9 +350,8 @@ chmod -v 0755 /usr/lib/preloadable_libintl.so libgettextlib - Приватная библиотека, в которой находятся общие подпрограммы, - используемые в различных программах Gettext; они не предназначены - для общего использования + Содержит общие подпрограммы, используемые различными программами + Gettext; они не предназначены для общего использования libgettextlib @@ -376,9 +375,8 @@ chmod -v 0755 /usr/lib/preloadable_libintl.so libgettextsrc - Приватная библиотека, в которой находятся общие подпрограммы, - используемые в различных программах Gettext; они не предназначены - для общего использования + Предоставляет общие подпрограммы, используемые различными программами + Gettext; они не предназначены для общего использования libgettextsrc