table of contents
other versions
- wheezy 1.16.18
dpkg-buildflags(1) | użytki dpkg | dpkg-buildflags(1) |
NAZWA¶
dpkg-buildflags - zwraca flagi budowania używane podczas budowania pakietuSKŁ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).
- 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.
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.
- --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.
- 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).
- 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.
TŁUMACZE¶
Piotr Roszatycki <dexter@debian.org>, 19992012-04-03 | Projekt Debian |