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]>, 1999Bartosz Feński <[email protected]>, 2004-2005
Robert Luberda <[email protected]>, 2006-2008
Wiktor Wandachowicz <[email protected]>, 2008
Michał Kułach <[email protected]>, 2012