dpkg-buildflags(1) zwraca flagi budowania używane podczas budowania pakietu

SKŁADNIA

dpkg-buildflags [opcja...] [polecenie]

OPIS

dpkg-buildflags 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:
1.
systemowo, używając /etc/dpkg/buildflags.conf;
2.
dla bieżącego użytkownika $XDG_CONFIG_HOME/dpkg/buildflags.conf, gdzie $XDG_CONFIG_HOME domyślnie jest $HOME/.config;
3.
tymczasowo przez użytkownika za pomocą zmiennych środowiskowych (patrz ZMIENNE ŚRODOWISKA).
4.
dynamicznie przez opiekuna pakietu za pomocą zmiennych środowiskowych ustawianych poprzez debian/rules (patrz ZMIENNE ŚRODOWISKA).

Pliki konfiguracyjne mogą zawierać dwa typy dyrektyw:

SET wartość flaga
Przesłania flagę flaga tak, aby miała wartość wartość.
STRIP flaga wartość
Usuwa z flagi flaga wszystkie flagi budowania umieszczone w wartości.
APPEND flaga wartość
Rozszerza flagę flaga dodając opcje podane w wartości. Do dodawanych wartości na początku dodawana jest spacja, jeśli bieżąca wartość flagi nie jest pusta.
PREPEND flaga wartość
Rozszerza flagę flaga przez dopisanie przed nią opcji podanej w wartości. Do dopisywanej opcji jest dopisywana spacja, jeśli bieżąca wartość flagi nie jest pusta.

Pliki konfiguracyjne mogą zawierać komentarze w wierszach zaczynających się kratką (#). Ignorowane są również puste wiersze.

POLECENIA

--dump
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 ("flaga=wartość"). Jest to działanie domyślne.
--list
Wypisuje listę flag obsługiwanych przez bieżącego dostawce (po jednym na wiersz). Rozdział OBSŁUGIWANE FLAGI zawiera o nich więcej informacji.
--status
Wyświetla informacje, które mogą okazać się przydatne do wyjaśnienia zachowania dpkg-buildflags: 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 debian/rules, 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.

--export=format
Wypisuje na standardowe wyjście powłoki (jeśli formatem jest sh) lub make (jeśli formatem jest make) polecenia, które mogą być użyte do wyeksportowania wszystkich flag kompilacji w środowisku. Jeśli formatem jest configure, to wyjście może być użyte w wierszu poleceń ./configure. Jeśli wartość format nie została podana, przyjmowane jest sh. Załączone są jedynie flagi kompilacji zaczynające się od wielkiej litery, inne są przyjmowane za nienadające się do środowiska.
--get flaga
Wypisuje wartość flagi na standardowe wyjście. Wychodzi z 0, jeśli flaga jest znana, w przeciwnym wypadku kończy z 1.
--origin flaga
Wypisuje pochodzenie wartości zwracanej przez --get. Wychodzi z 0 jeśli flaga jest znana, w przeciwnym wypadku z 1. Pochodzenie może mieć następujące wartości:
vendor
zwracana jest oryginalna flaga ustawiona przez dostawcę,
system
flaga jest ustawiana/modyfikowana przez konfigurację systemową,
user
flaga jest ustawiana/modyfikowana przez konfigurację użytkownika,
env
flaga jest ustawiana/modyfikowana przez konfigurację środowiskową.
--query-features obszar
Wypisuje funkcje włączone w danym obszarze. Jedynym obecnie rozpoznawanym jest hardening. Wychodzi z 0 jeśli obszar jest znany i z 1 w przeciwnym wypadku.
Format wyjścia jest nagłówkiem zgodnym z RFC822, z jednym rozdziałem na funkcję. Na przykład:
  Feature: pie
  Enabled: no
  Feature: stackprotector
  Enabled: yes
--help
Wyświetla informację o użytkowaniu i kończy działanie.
--version
Wyświetla informację o wersji i pomyślnie kończy działanie.

OBSŁUGIWANE FLAGI

CFLAGS
Opcje do kompilatora C. Domyślne wartości ustawiane przez dostawcę obejmują -g i domyślny poziom optymalizacji (zwykle -O2 lub -O0, jeśli zmienna środowiskowa DEB_BUILD_OPTIONS definiuje noopt).
CPPFLAGS
Opcje do preprocesora C, Domyślna wartość: pusta.
CXXFLAGS
Opcje do kompilatora C++. Jak CFLAGS.
FFLAGS
Opcje do kompilatora Fortran. Jak CFLAGS.
LDFLAGS
Opcje przekazywane do kompilatora podczas łączenia plików wykonywalnych lub współdzielonych bibliotek (jeśli linker jest wywoływany bezpośrednio, -Wl i , muszą być usunięte z tych opcji). Wartość domyślna: puste.

PLIKI

/etc/dpkg/buildflags.conf
Plik konfiguracji ogólnosystemowej.
$XDG_CONFIG_HOME/dpkg/buildflags.conf lub $HOME/.config/dpkg/buildflags.conf
Plik konfiguracyjny użytkownika.

ŚRODOWISKO

Są 2 zestawy zmiennych środowiskowych wykonujących te same operacje. Pierwszy (DEB_flaga_op) nie powinien być nigdy używany z debian/rules. Jest on przeznaczony dla użytkownika, który chciałby przebudować pakiet źródłowy używając innych flag budowania. Drugi zestaw (DEB_flaga_MAINT_op) powinien być używany wyłącznie przez opiekunów pakietów do zmiany wynikowych flag budowania.
DEB_flaga_SET
DEB_flaga_MAINT_SET Zmienna może być użyta do wymuszenia wartości zwracanej przez daną flagę.
DEB_flaga_STRIP
DEB_flaga_MAINT_STRIP 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ą flagę
DEB_flaga_APPEND
DEB_flaga_MAINT_APPEND Zmienna może być użyta do dodania (za) opcji uzupełniających do wartości zwróconej przez daną flagę.
DEB_flaga_PREPEND
DEB_flaga_MAINT_PREPEND Zmienna może być użyta do dodania (przed) opcji uzupełniających do wartości zwróconej przez daną flagę.
DEB_BUILD_MAINT_OPTIONS
Zmienna może być użyta do włączenia/wyłączenia różnych flag hartujących budowania poprzez opcję hardening. Rozdział HARDENING zawiera więcej szczegółów.

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ą.

Każda funkcja hartowania może zostać włączona lub wyłączona za pomocą wartości hardening zmiennej środowiskowej DEB_BUILD_MAINT_OPTIONS, 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 debian/rules:


  export DEB_BUILD_MAINT_OPTIONS=hardening=+pie,-fortify

Specjalna funkcja all 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:


  export DEB_BUILD_MAINT_OPTIONS=hardening=-all,+format,+fortify

format
To ustawienie (domyślnie włączone) dodaje -Wformat -Werror=format-security do CFLAGS i CXXFLAGS. 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 printf i scanf, gdy łańcuch formatu nie jest dosłownym łańcuchem oraz nie ma argumentów formatu, jak w printf(foo); zamiast printf("%s", foo);. Może stanowić to dziurę bezpieczeństwa, gdy łańcuch formatu pochodzi z niezaufanego źródła i zawiera "%n".
fortify
To ustawienie (domyślnie włączone) dodaje -D_FORTIFY_SOURCE=2 do CPPFLAGS. 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 -01 lub wyższym.

stackprotector
To ustawienie (domyślnie włączone) dodaje -fstack-protector --param=ssp-buffer-size=4 do CFLAGS i CXXFLAGS. 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 __stack_chk_fail), więc musi być wyłączona podczas budowania -nostdlib lub -ffreestanding lub podobnych.

relro
To ustawienie (domyślnie włączone) dodaje -Wl,-z,relro do LDFLAGS. 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ż bindnow.
bindnow
To ustawienie (domyślnie wyłączone) dodaje -Wl,-z,now do LDFLAGS. 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 relro). Ta opcja nie może zostać włączona, jeśli relro nie jest włączone.
pie
To ustawienie (domyślnie wyłączone) dodaje -fPIE do CFLAGS i CXXFLAGS oraz -fPIE -pie do LDFLAGS. 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 -fPIC, 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.

TŁUMACZE

Piotr Roszatycki <[email protected]>, 1999
Bartosz Feński <[email protected]>, 2004-2005
Robert Luberda <[email protected]>, 2006-2008
Wiktor Wandachowicz <[email protected]>, 2008
Michał Kułach <[email protected]>, 2012