.\" dpkg manual page - dpkg-buildflags(1)
.\"
.\" Copyright ÂŠ 2010-2011 RaphaĂŤl Hertzog <hertzog@debian.org>
.\" Copyright ÂŠ 2011 Kees Cook <kees@debian.org>
.\"
.\" This is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2 of the License, or
.\" (at your option) any later version.
.\"
.\" This is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License
.\" along with this program.  If not, see <http://www.gnu.org/licenses/>.
.
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH dpkg\-buildflags 1 2012\-04\-03 "Projekt Debian" "użytki dpkg"
.SH NAZWA
dpkg\-buildflags \- zwraca flagi budowania używane podczas budowania pakietu
.
.SH SKŁADNIA
\fBdpkg\-buildflags\fP [\fIopcja\fP...] [\fIpolecenie\fP]
.
.SH OPIS
\fBdpkg\-buildflags\fP jest narzędziem do pozyskiwania flag kompilacji do użycia
podczas budowania pakietów Debiana.
.
Domyślne flagi są definiowane przez dostawcę, ale mogą zostać
rozszerzone/przesłonięte na wiele sposobów:
.IP 1.
systemowo, używając \fB/etc/dpkg/buildflags.conf\fP;
.IP 2.
dla bieżącego użytkownika \fB$XDG_CONFIG_HOME/dpkg/buildflags.conf\fP, gdzie
\fB$XDG_CONFIG_HOME\fP domyślnie jest \fB$HOME/.config\fP;
.IP 3.
tymczasowo przez użytkownika za pomocą zmiennych środowiskowych (patrz
\fBZMIENNE ŚRODOWISKA\fP).
.IP 4.
dynamicznie przez opiekuna pakietu za pomocą zmiennych środowiskowych
ustawianych poprzez \fBdebian/rules\fP (patrz \fBZMIENNE ŚRODOWISKA\fP).
.P
Pliki konfiguracyjne mogą zawierać dwa typy dyrektyw:
.TP 
\fBSET\fP\fI wartość flaga\fP
Przesłania flagę \fIflaga\fP tak, aby miała wartość \fIwartość\fP.
.TP 
\fBSTRIP\fP\fI flaga wartość\fP
Usuwa z flagi \fIflaga\fP wszystkie flagi budowania umieszczone w \fIwartości\fP.
.TP 
\fBAPPEND\fP\fI flaga wartość\fP
Rozszerza flagę \fIflaga\fP dodając opcje podane w \fIwartości\fP. Do dodawanych
wartości na początku dodawana jest spacja, jeśli bieżąca wartość flagi nie
jest pusta.
.TP 
\fBPREPEND\fP\fI flaga wartość\fP
Rozszerza flagę \fIflaga\fP przez dopisanie przed nią opcji podanej w
\fIwartości\fP. Do dopisywanej opcji jest dopisywana spacja, jeśli bieżąca
wartość flagi nie jest pusta.
.P
Pliki konfiguracyjne mogą zawierać komentarze w wierszach zaczynających się
kratką (#). Ignorowane są również puste wiersze.
.SH POLECENIA
.TP 
\fB\-\-dump\fP
Wypisuje na standardowe wyjście wszystkie flagi kompilacji i ich
wartości. Wyświetla po jednej fladze na wiersz, oddzielając ją od jej
wartości znakiem równości ("\fIflaga\fP=\fIwartość\fP"). Jest to działanie
domyślne.
.TP 
\fB\-\-list\fP
Wypisuje listę flag obsługiwanych przez bieżącego dostawce (po jednym na
wiersz). Rozdział \fBOBSŁUGIWANE FLAGI\fP zawiera o nich więcej informacji.
.TP 
\fB\-\-status\fP
Wyświetla informacje, które mogą okazać się przydatne do wyjaśnienia
zachowania \fBdpkg\-buildflags\fP: powiązane zmienne środowiskowe, obecny
dostawca, stan wszystkich flag funkcyjnych. Wypisywane są również wynikowe
flagi kompilatora, razem z ich pochodzeniem.

Jest to przeznaczone do uruchamiania z \fBdebian/rules\fP, dzięki czemu log
budowania przechowuje jasny zapis użytych flag budowania. Może okazać się to
przydatne do diagnozowania związanych z nimi problemów.
.TP 
\fB\-\-export=\fP\fIformat\fP
Wypisuje na standardowe wyjście powłoki (jeśli \fIformatem\fP jest \fBsh\fP) lub
make (jeśli \fIformatem\fP jest \fBmake\fP) polecenia, które mogą być użyte do
wyeksportowania wszystkich flag kompilacji w środowisku. Jeśli \fIformatem\fP
jest \fBconfigure\fP, to wyjście może być użyte w wierszu poleceń
\&\fB./configure\fP. Jeśli wartość \fIformat\fP nie została podana, przyjmowane jest
\fBsh\fP. Załączone są jedynie flagi kompilacji zaczynające się od wielkiej
litery, inne są przyjmowane za nienadające się do środowiska.
.TP 
\fB\-\-get\fP\fI flaga\fP
Wypisuje wartość flagi na standardowe wyjście. Wychodzi z 0, jeśli flaga
jest znana, w przeciwnym wypadku kończy z 1.
.TP 
\fB\-\-origin\fP\fI flaga\fP
Wypisuje pochodzenie wartości zwracanej przez \fB\-\-get\fP. Wychodzi z 0 jeśli
flaga jest znana, w przeciwnym wypadku z 1. Pochodzenie może mieć
następujące wartości:
.RS
.TP 
\fBvendor\fP
zwracana jest oryginalna flaga ustawiona przez dostawcę,
.TP 
\fBsystem\fP
flaga jest ustawiana/modyfikowana przez konfigurację systemową,
.TP 
\fBuser\fP
flaga jest ustawiana/modyfikowana przez konfigurację użytkownika,
.TP 
\fBenv\fP
flaga jest ustawiana/modyfikowana przez konfigurację środowiskową.
.RE
.TP 
\fB\-\-query\-features\fP\fI obszar\fP
Wypisuje funkcje włączone w danym obszarze. Jedynym obecnie rozpoznawanym
jest \fBhardening\fP. Wychodzi z 0 jeśli obszar jest znany i z 1 w przeciwnym
wypadku.
.IP
Format wyjścia jest nagłówkiem zgodnym z RFC822, z jednym rozdziałem na
funkcję. Na przykład:
.IP
.nf
  Feature: pie
  Enabled: no

  Feature: stackprotector
  Enabled: yes
.fi
.TP 
\fB\-\-help\fP
Wyświetla informację o użytkowaniu i kończy działanie.
.TP 
\fB\-\-version\fP
Wyświetla informację o wersji i pomyślnie kończy działanie.
.
.SH "OBSŁUGIWANE FLAGI"
.TP 
\fBCFLAGS\fP
Opcje do kompilatora C. Domyślne wartości ustawiane przez dostawcę obejmują
\fI\-g\fP i domyślny poziom optymalizacji (zwykle \fI\-O2\fP lub \fI\-O0\fP, jeśli
zmienna środowiskowa \fBDEB_BUILD_OPTIONS\fP definiuje \fInoopt\fP).
.TP 
\fBCPPFLAGS\fP
Opcje do preprocesora C, Domyślna wartość: pusta.
.TP 
\fBCXXFLAGS\fP
Opcje do kompilatora C++. Jak \fBCFLAGS\fP.
.TP 
\fBFFLAGS\fP
Opcje do kompilatora Fortran. Jak \fBCFLAGS\fP.
.TP 
\fBLDFLAGS\fP
Opcje przekazywane do kompilatora podczas łączenia plików wykonywalnych lub
współdzielonych bibliotek (jeśli linker jest wywoływany bezpośrednio, \fB\-Wl\fP
i \fB,\fP muszą być usunięte z tych opcji). Wartość domyślna: puste.
.
.SH PLIKI
.TP 
\fB/etc/dpkg/buildflags.conf\fP
Plik konfiguracji ogólnosystemowej.
.TP 
\fB$XDG_CONFIG_HOME/dpkg/buildflags.conf\fP lub \fB$HOME/.config/dpkg/buildflags.conf\fP
Plik konfiguracyjny użytkownika.
.SH ŚRODOWISKO
Są 2 zestawy zmiennych środowiskowych wykonujących te same
operacje. Pierwszy (DEB_\fIflaga\fP_\fIop\fP) nie powinien być nigdy używany z
\fBdebian/rules\fP. Jest on przeznaczony dla użytkownika, który chciałby
przebudować pakiet źródłowy używając innych flag budowania. Drugi zestaw
(DEB_\fIflaga\fP_MAINT_\fIop\fP) powinien być używany wyłącznie przez opiekunów
pakietów do zmiany wynikowych flag budowania.
.TP 
\fBDEB_\fP\fIflaga\fP\fB_SET\fP
.TQ
\fBDEB_\fP\fIflaga\fP\fB_MAINT_SET\fP
Zmienna może być użyta do wymuszenia wartości zwracanej przez daną \fIflagę\fP.
.TP 
\fBDEB_\fP\fIflaga\fP\fB_STRIP\fP
.TQ
\fBDEB_\fP\fIflaga\fP\fB_MAINT_STRIP\fP
Zmienna może być użyta do udostępnienia listy opcji (oddzielonej spacjami),
które zostaną usunięte z zestawu flag zwróconych przez daną \fIflagę\fP
.TP 
\fBDEB_\fP\fIflaga\fP\fB_APPEND\fP
.TQ
\fBDEB_\fP\fIflaga\fP\fB_MAINT_APPEND\fP
Zmienna może być użyta do dodania (za) opcji uzupełniających do wartości
zwróconej przez daną \fIflagę\fP.
.TP 
\fBDEB_\fP\fIflaga\fP\fB_PREPEND\fP
.TQ
\fBDEB_\fP\fIflaga\fP\fB_MAINT_PREPEND\fP
Zmienna może być użyta do dodania (przed) opcji uzupełniających do wartości
zwróconej przez daną \fIflagę\fP.
.TP 
\fBDEB_BUILD_MAINT_OPTIONS\fP
Zmienna może być użyta do włączenia/wyłączenia różnych flag hartujących
budowania poprzez opcję \fBhardening\fP. Rozdział \fBHARDENING\fP zawiera więcej
szczegółów.
.
.SH "HARTOWANIE (HARDENING)"
Istnieją opcje kompilacyjne (patrz niżej), które mogą zostać użyte do
zabezpieczenia wynikowego pliku binarnego przed atakami błędu pamięci lub do
zapewnienia dodatkowych ostrzeżeń podczas kompilacji. Z wyjątkiem
odnotowanym niżej, są one włączone domyślnie dla architektur, które je
obsługują.
.P
Każda funkcja hartowania może zostać włączona lub wyłączona za pomocą
wartości \fBhardening\fP zmiennej środowiskowej \fBDEB_BUILD_MAINT_OPTIONS\fP, za
pomocą modyfikatora "+" lub "\-". Na przykład, aby włączyć funkcję "pie" i
wyłączyć "fortify" można umieścić następujący wpis w \fBdebian/rules\fP:
.P
  export DEB_BUILD_MAINT_OPTIONS=hardening=+pie,\-fortify
.P
Specjalna funkcja \fBall\fP może posłużyć do włączenia lub wyłączenia
wszystkich opcji hartowania na raz. Dlatego wyłączenie wszystkiego z
wyjątkiem opcji "format" i "fortify" można osiągnąć tak:
.P
  export DEB_BUILD_MAINT_OPTIONS=hardening=\-all,+format,+fortify
.
.TP 
\fBformat\fP
To ustawienie (domyślnie włączone) dodaje \fB\-Wformat
\-Werror=format\-security\fP do \fBCFLAGS\fP i \fBCXXFLAGS\fP. Wypisywane będą
ostrzeżenia o niepoprawnie użytych łańcuchach formatu, a jeżeli funkcja
formatu zostanie użyta w sposób, który może sprawiać problemy
bezpieczeństwa, to zakończy się niepowodzeniem. Obecnie ostrzeżenia obejmują
wywołania do funkcji \fBprintf\fP i \fBscanf\fP, gdy łańcuch formatu nie jest
dosłownym łańcuchem oraz nie ma argumentów formatu, jak w \fBprintf(foo);\fP
zamiast \fBprintf("%s", foo);\fP. Może stanowić to dziurę bezpieczeństwa, gdy
łańcuch formatu pochodzi z niezaufanego źródła i zawiera "%n".
.
.TP 
\fBfortify\fP
To ustawienie (domyślnie włączone) dodaje \fB\-D_FORTIFY_SOURCE=2\fP do
\fBCPPFLAGS\fP. Podczas tworzenia kodu kompilator zna wiele informacji o
rozmiarach bufora (tam gdzie to możliwe) i stara się zastąpić wywołania
funkcji o nieograniczonych wielkościach bufora tymi o długości
ograniczonej. Jest to użyteczne szczególnie przy starym, niechlujnym
kodzie. Dodatkowo, łańcuch formatu w pamięci zapisywalnej zawierający "%n"
jest blokowany. Jeśli jakaś aplikacja zależy na takim łańcuchu formatu musi
zostać to przeorganizowane.

Proszę zauważyć, że aby opcja ta odniosła skutek, źródło musi zostać
skompilowane z \fB\-01\fP lub wyższym.
.TP 
\fBstackprotector\fP
To ustawienie (domyślnie włączone) dodaje \fB\-fstack\-protector
\-\-param=ssp\-buffer\-size=4\fP do \fBCFLAGS\fP i \fBCXXFLAGS\fP. W ten sposób dodawane
są sprawdzenia dotyczące nadpisania stosu. Dzięki temu, zapobiega się wielu
potencjalnym atakom polegającym na wstrzyknięciu kodu, prowadzącym do
przerwania pracy. W najlepszym razie, ataki polegające na wstrzyknięciu kodu
są zmieniane na odmowę pracy (DoS) lub na brak błędu (w zależności od
aplikacji).

Ta funkcja wymaga linkowania wobec glibc (lub innej biblioteki
dostarczającej \fB__stack_chk_fail\fP), więc musi być wyłączona podczas
budowania \fB\-nostdlib\fP lub \fB\-ffreestanding\fP lub podobnych.
.
.TP 
\fBrelro\fP
To ustawienie (domyślnie włączone) dodaje \fB\-Wl,\-z,relro\fP do \fBLDFLAGS\fP.
Podczas ładowania programu, konieczne jest zapisanie wielu sekcji pamięci
ELF przez linkera. Dzięki temu ustawieniu, program ładujący jest oznaczany,
aby zmienił te sekcje na tylko do odczytu przed przejęciem kontroli przez
program. Zapobiega to głównie atakom nadpisania GOT. Jeśli ta opcja zostanie
wyłączona, wyłączane jest również \fBbindnow\fP.
.
.TP 
\fBbindnow\fP
To ustawienie (domyślnie wyłączone) dodaje \fB\-Wl,\-z,now\fP do
\fBLDFLAGS\fP. Podczas ładowania programu, wszystkie symbole dynamiczne są
rozwiązywane, pozwalając całemu PLT na bycie oznaczonym jako tylko do
odczytu (z powodu powyższego \fBrelro\fP). Ta opcja nie może zostać włączona,
jeśli \fBrelro\fP nie jest włączone.
.
.TP 
\fBpie\fP
To ustawienie (domyślnie wyłączone) dodaje \fB\-fPIE\fP do \fBCFLAGS\fP i
\fBCXXFLAGS\fP oraz \fB\-fPIE \-pie\fP do \fBLDFLAGS\fP. Position Independent
Executable (PIE) jest potrzebne, aby odnieść korzyści z Address Space Layout
Randomization, które jest obsługiwane przez niektóre wersja jądra. Ponieważ
ASLR może być już wymuszone w przypadku obszarów danych w stosie (stack i
heap \- brk i mmap), obszary kodu muszą zostać skompilowane jako niezależne
od pozycji. Biblioteki współdzielone już to czynią (\-fPIC), więc otrzymują
ASLR automatycznie, ale binarne regiony .text muszą zostać zbudować PIE aby
otrzymać ASLR. Gdy się to stanie, ataki ROP (Return Oriented Programming) są
o wiele trudniejsze, ponieważ nie istnieją statyczne lokalizacje do
przekroczenia podczas ataków uszkodzenia pamięci.

Nie jest to kompatybilne z \fB\-fPIC\fP, więc należy uważać przy budowaniu
obiektów dzielonych.

Dodatkowo, ponieważ PIE jest zaimplementowane poprzez ogólny rejestr,
niektóre architektury (głównie i386) mogą mieć wydajność zmniejszoną aż do
15% przy bardzo intensywnych obciążeniach text\-segment, jednak w większości
przypadków nie jest to więcej niż 1%. Architektury z ogólniejszymi
rejestrami (np. amd64) nie mają aż tak wysokich strat w najgorszym
przypadku.
.SH "TŁUMACZE"
Piotr Roszatycki <dexter@debian.org>, 1999
.br
Bartosz Feński <fenio@debian.org>, 2004-2005
.br
Robert Luberda <robert@debian.org>, 2006-2008
.br
Wiktor Wandachowicz <siryes@gmail.com>, 2008
.br
Michał Kułach <michal.kulach@gmail.com>, 2012
