dpkg-buildflags - geeft de bij pakketbouw te gebruiken bouwvlaggen
terug
dpkg-buildflags [optie...] [commando]
dpkg-buildflags is gereedschap om de compilatievlaggen op
te halen die tijdens het bouwen van Debian pakketten gebruikt moeten
worden.
De standaardvlaggen worden gedefinieerd door de leverancier, maar
ze kunnen op verschillende manieren uitgebreid/vervangen worden:
- 1.
- voor het hele systeem met /etc/dpkg/buildflags.conf;
- 2.
- voor de huidige gebruiker met
$XDG_CONFIG_HOME/dpkg/buildflags.conf,
waarbij $XDG_CONFIG_HOME als
standaardwaarde $HOME/.config
heeft;
- 3.
- tijdelijk door de gebruiker met omgevingsvariabelen (zie het onderdeel
"OMGEVING");
- 4.
- dynamisch door de pakketbeheerder met omgevingsvariabelen die ingesteld
worden via debian/rules (zie het onderdeel
"OMGEVING").
De configuratiebestanden kunnen vier types opdrachten
bevatten:
- SET vlag
waarde
- De vlag met vlag als naam overschrijven om ze de waarde
waarde te geven.
- STRIP vlag
waarde
- Van de vlag met vlag als naam alle bouwvlaggen verwijderen die in
waarde opgesomd worden. Sinds dpkg 1.16.1.
- APPEND vlag
waarde
- De vlag met vlag als naam uitbreiden door er de opties aan toe te
voegen die in waarde opgegeven worden. Er wordt een spatie
geplaatst voor de waarde die toegevoegd wordt, indien de huidige waarde
van de vlag niet leeg is.
- PREPEND
vlag waarde
- De vlag met vlag als naam uitbreiden door er vooraan de opties aan
toe te voegen die in waarde opgegeven worden. Er wordt een spatie
geplaatst achter de waarde die toegevoegd wordt, indien de huidige waarde
van de vlag niet leeg is. Sinds dpkg 1.16.1.
De configuratiebestanden kunnen commentaar bevatten op regels die
beginnen met een hekje (#). Ook lege regels worden genegeerd.
Dit programma werd geïntroduceerd in dpkg 1.15.7.
- --dump
- Op standaarduitvoer alle compilatievlaggen en hun waarden tonen. Dit geeft
per regel één vlag en de waarde ervan weer met daartussenin
een gelijkheidsteken (“vlag=waarde”). Dit is
de standaardactie.
- --list
- Een lijst weergeven van vlaggen die door de huidige leverancier
ondersteund worden (één per regel). Zie het onderdeel
"ONDERSTEUNDE VLAGGEN" voor meer informatie daarover.
- --status
- Eventuele informatie laten zien welke nuttig kan zijn om het gedrag te
verklaren van dpkg-buildflags (sinds dpkg 1.16.5): relevante
omgevingsvariabelen, huidige leverancier, toestand van alle
functievlaggen. Ook de resulterende compileervlaggen met hun oorsprong
weergeven.
Het is de bedoeling dat dit uitgevoerd wordt vanuit
debian/rules, zodat de bouwlog een duidelijk spoor van de
gebruikte vlaggen kan bijhouden. Dit kan nuttig zijn om ermee verband
houdende problemen te diagnosticeren.
- --export=indeling
- Op standaarduitvoer commando's weergeven die gebruikt kunnen worden om
alle compilatievlaggen te exporteren ten behoeve van een specifiek
gereedschap. Indien de waarde indeling niet opgegeven werd, wordt
sh verondersteld. Enkel compilatievlaggen die met een hoofdletter
beginnen worden opgenomen. Van de andere wordt aangenomen dat ze niet
bruikbaar zijn voor de omgeving. Ondersteunde indelingen:
- sh
- Shell-opdrachten om alle compilatievlaggen in de omgeving in te stellen en
te exporteren. Er worden aanhalingstekens geplaatst rond de vlagwaarden
waardoor de uitvoer gereed is om door een shell geëvalueerd te
worden.
- cmdline
- Argumenten om door te geven aan de commandoregel van een bouwprogramma om
al de compilatievlaggen te gebruiken (sinds dpkg 1.17.0). De vlagwaarden
worden volgens de shell-syntaxis tussen haakjes geplaatst.
- configure
- Dit is een verouderde alias voor cmdline.
- make
- Make-opdrachten om alle compilatievlaggen in de omgeving in te stellen en
te exporteren. De uitvoer kan naar een Makefile-fragment geschreven worden
en geëvalueerd met behulp van een include-opdracht.
- --get
vlag
- De waarde van de vlag op de standaarduitvoer weergeven. Sluit af met 0 bij
een gekende vlag en sluit anders af met 1.
- --origin
vlag
- De origine weergeven van de waarde die teruggegeven wordt door
--get. Sluit af met 0 bij een gekende vlag en sluit anders af met
1. De origine kan één van de volgende waarden hebben:
- vendor
- de originele vlag die door de leverancier ingesteld werd, wordt
teruggegeven;
- system
- de vlag werd ingesteld/gewijzigd door een systeemconfiguratie;
- user
- de vlag werd ingesteld/gewijzigd door een gebruikersspecifieke
configuratie;
- env
- de vlag werd ingesteld/gewijzigd door een omgevingsspecifieke
configuratie.
- --query
- Alle informatie tonen welke nuttig kan zijn om het gedrag van het
programma te verklaren: huidige leverancier, relevante
omgevingsvariabelen, functiegebieden, toestand van alle functievlaggen, of
een functie door de compiler als een ingebouwde standaard wordt behandeld
(sinds dpkg 1.21.14) en de compileervlaggen met hun oorsprong (sinds dpkg
1.19.0).
Bijvoorbeeld:
Vendor: Debian
Environment:
DEB_CFLAGS_SET=-O0 -Wall
Area: qa
Features:
bug=no
canary=no
Builtins:
Area: hardening
Features:
pie=no
Builtins:
pie=yes
Area: reproducible
Features:
timeless=no
Builtins:
Flag: CFLAGS
Value: -O0 -Wall
Origin: env
Flag: CPPFLAGS
Value: -D_FORTIFY_SOURCE=3
Origin: vendor
- --query-features
gebied
- Print the features enabled for a given area (since dpkg 1.16.2). If the
feature is handled (even if only on some architectures) as a builtin
default by the compiler, then a Builtin field is printed (since
dpkg 1.21.14). See the "FEATURE AREAS" section for more details
about the currently recognized areas. Exits with 0 if the area is known
otherwise exits with 1.
De uitvoer is in RFC822-indeling met één sectie
per functie. Bijvoorbeeld:
Feature: pie
Enabled: yes
Builtin: yes
Feature: stackprotector
Enabled: yes
- --help
- Info tonen over het gebruik en afsluiten.
- --version
- De versie tonen en afsluiten.
- ASFLAGS
- Opties voor de host-assembler. Standaardwaarde: leeg. Sinds dpkg
1.21.0.
- CFLAGS
- Opties voor de host-C-compiler. De door de leverancier ingestelde
standaardwaarde bestaat uit -g en het standaardniveau van
optimalisatie (gewoonlijk -O2, of -O0 indien de
omgevingsvariabele DEB_BUILD_OPTIONS noopt aangeeft).
- CPPFLAGS
- Opties voor de host-C-preprocessor. Standaardwaarde: leeg.
- CXXFLAGS
- Opties voor de host-C++ compiler. Hetzelfde als CFLAGS.
- OBJCFLAGS
- Opties voor de host-Objective C compiler. Hetzelfde als CFLAGS.
Sinds dpkg 1.17.7.
- OBJCXXFLAGS
- Opties voor de host-Objective C++ compiler. Hetzelfde als CXXFLAGS.
Sinds dpkg 1.17.7.
- DFLAGS
- Opties voor de host-D-compiler (ldc of gdc). Sinds dpkg 1.20.6.
- FFLAGS
- Opties voor de host-Fortran 77 compiler. Een subset van
CFLAGS.
- FCFLAGS
- Opties voor de host-Fortran 9x compiler. Hetzelfde als FFLAGS.
Sinds dpkg 1.17.7.
- LDFLAGS
- Opties die aan de host-compiler doorgegeven worden bij het linken van
uitvoerbare programma's en gedeelde objecten (indien de linker
rechtstreeks aangeroepen wordt, dan moeten -Wl en , van die
opties verwijderd worden). Standaardwaarde: leeg.
- ASFLAGS_FOR_BUILD
- Opties voor de bouwassembler. Standaardwaarde: leeg. Sinds dpkg
1.21.0.
- CFLAGS_FOR_BUILD
- Opties voor de bouw-C-compiler. De door de leverancier ingestelde
standaardwaarde bestaat uit -g en het standaardniveau van
optimalisatie (gewoonlijk -O2, of -O0 indien de
omgevingsvariabele DEB_BUILD_OPTIONS noopt aangeeft). Sinds
dpkg 1.22.1.
- CPPFLAGS_FOR_BUILD
- Opties voor de bouw-C-preprocessor. Standaardwaarde: leeg. Sinds dpkg
1.22.1.
- CXXFLAGS_FOR_BUILD
- Opties voor de bouw-C++ compiler. Hetzelfde als CFLAGS_FOR_BUILD.
Sinds dpkg 1.22.1.
- OBJCFLAGS_FOR_BUILD
- Opties voor de bouw-Objective C compiler. Hetzelfde als
CFLAGS_FOR_BUILD. Sinds dpkg 1.22.1.
- OBJCXXFLAGS_FOR_BUILD
- Opties voor de bouw-Objective C++ compiler. Hetzelfde als
CXXFLAGS_FOR_BUILD. Sinds dpkg 1.22.1.
- DFLAGS_FOR_BUILD
- Opties voor de bouw-D-compiler (ldc of gdc). Sinds dpkg 1.22.1.
- FFLAGS_FOR_BUILD
- Opties voor de bouw-Fortran 77 compiler. Een deelverzameling van
CFLAGS_FOR_BUILD. Sinds dpkg 1.22.1.
- FCFLAGS_FOR_BUILD
- Opties voor de bouw-Fortran 9x compiler. Hetzelfde als
FFLAGS_FOR_BUILD. Sinds dpkg 1.22.1.
- LDFLAGS_FOR_BUILD
- Opties die aan de bouw-compiler doorgegeven worden bij het linken van
uitvoerbare programma's of gedeelde objecten (indien de linker
rechtstreeks aangeroepen wordt, dan moeten -Wl en , van die
opties verwijderd worden). Standaardwaarde: leeg. Sinds dpkg 1.22.1.
In de toekomst kunnen nog andere vlaggen toegevoegd worden als
daar behoefte aan ontstaat (bijvoorbeeld om andere talen te
ondersteunen).
Feature areas are currently vendor specific, and the ones
described below are only recognized on Debian and derivatives.
Each area feature can be enabled and disabled in the
DEB_BUILD_OPTIONS and DEB_BUILD_MAINT_OPTIONS environment
variable's area value with the ‘+’ and
‘-’ modifier. Following the general syntax of these
variables (described in dpkg-buildpackage(1)), multiple feature areas
can be specified separated by spaces, where each get feature specifiers as
mandatory parameters after an equal sign (‘=’). The
feature specifiers are comma-separated and parsed from left to right, where
the settings within the same feature specifier override previous ones, even
if the feature specifiers are split across multiple space-separated feature
area settings for the same area.
For example, to enable the hardening “pie”
feature and disable the “fortify” feature you can do this in
debian/rules:
export DEB_BUILD_MAINT_OPTIONS = hardening=+pie,-fortify
De bijzondere functie all (geldig in elk gebied) kan
gebruikt worden om gelijktijdig alle gebiedsfunctionaliteit te activeren of
uit te schakelen. Alles uitschakelen in het gebied hardening en enkel
“format” en “fortify” activeren kunt u dus doen
met:
export DEB_BUILD_MAINT_OPTIONS = hardening=-all,+format,+fortify
Multiple feature areas can be set:
export DEB_BUILD_MAINT_OPTIONS = hardening=+pie abi=+lfs
The override behavior applies as much to the all special
feature, as to specific features, which should allow for composition. Thus
to enable “lfs” in the abi area, and only
“pie” and “fortify” in the hardening
area, but “format” only when CONDITION is defined, this could
be done with:
export DEB_BUILD_MAINT_OPTIONS = hardening=-all,+pie,+format abi=+lfs
…
DEB_BUILD_MAINT_OPTIONS += hardening=+fortify
ifdef CONDITION
DEB_BUILD_MAINT_OPTIONS += hardening=-format
endif
Er kunnen verschillende compilatieopties (die hierna beschreven
worden) gebruikt worden om functies te activeren die de ABI van een pakket
kunnen veranderen, maar om redenen van terugwaartse compatibiliteit niet
standaard geactiveerd kunnen worden tenzij gecoördineerd of
individueel gecontroleerd.
- lfs
- Deze instelling (sinds dpkg 1.22.0; standaard uitgezet) activeert
ondersteuning voor grote bestanden (Large File Support) op 32-bits
architecturen waarvan de ABI standaard geen LFS-ondersteuning biedt, door
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 toe te voegen aan
CPPFLAGS.
Wanneer deze functie is ingeschakeld, wordt de waarde van
dezelfde functie in het functiegebied future overschreven.
- time64
- This setting (since dpkg 1.22.0; enabled by default except for i386,
hurd-i386 and kfreebsd-i386 since dpkg 1.22.5) enables 64-bit time_t
support on 32-bit architectures where their ABI does not include it by
default, by adding -D_TIME_BITS=64 to CPPFLAGS. This setting
automatically enables the lfs feature from the abi feature
area.
If the setting is enabled explicitly then it gets enabled on
all architectures including i386 but not hurd-i386 nor kfreebsd-i386
(where the kernel does not have time64 interfaces), ignoring the binary
backwards compatibility default.
It is also enabled by default by gcc on the armel, armhf,
hppa, m68k, mips, mipsel, powerpc and sh4 Debian architectures, where
disabling the feature will add instead -U_LARGEFILE_SOURCE
-U_FILE_OFFSET_BITS -U_TIME_BITS to CPPFLAGS.
Er kunnen verschillende compilatieopties (die hierna beschreven
worden) gebruikt worden om functies te activeren die standaard geactiveerd
zouden moeten zijn, maar dat niet zijn om redenen van terugwaartse
compatibiliteit.
- lfs
- Deze instelling (sinds dpkg 1.19.0; standaard uitgeschakeld) is nu een
alias voor de functie lfs in het gebied abi. Gebruik die in
plaats daarvan. De functie uit het abi-gebied overschrijft deze
instelling.
Er kunnen verschillende compilatieopties (die hierna beschreven
worden) gebruikt worden om problemen in de broncode of het bouwsysteem te
helpen detecteren.
- bug-implicit-func
- This setting (since dpkg 1.22.3; enabled by default since dpkg 1.22.6)
adds -Werror=implicit-function-declaration to CFLAGS.
- bug
- Deze instelling (sinds dpkg 1.17.4; standaard uitgeschakeld) voegt alle
waarschuwingsopties toe die op een betrouwbare wijze problematische
broncode opsporen. De waarschuwingen zijn fataal. De enige vlaggen die
momenteel ondersteund worden zijn CFLAGS en CXXFLAGS waarbij
de vlaggen ingesteld staan op -Werror=array-bounds,
-Werror=clobbered, -Werror=implicit-function-declaration en
-Werror=volatile-register-var.
Deze functionaliteit verwerkt
-Werror=implicit-function-declaration via de functionaliteit
bug-implicit-func, als die niet is gespecificeerd.
- canary
- Deze instelling (sinds dpkg 1.17.14; standaard uitgeschakeld) voegt loze
kanarievogelopties toe aan de bouwvlaggen, zodat in de bouwlogs nagekeken
kan worden hoe de bouwvlaggen doorgegeven worden en zodat het eventueel
ontbreken van normale bouwvlaginstellingen ontdekt kan worden. Momenteel
zijn de enige ondersteunde vlaggen CPPFLAGS, CFLAGS,
OBJCFLAGS, CXXFLAGS en OBJCXXFLAGS, waarbij die
vlaggen als
-D__DEB_CANARY_vlag_willekeurige-id__
ingesteld worden, en LDFLAGS dat ingesteld wordt op
-Wl,-z,deb-canary-willekeurige-id.
Er kunnen verschillende compilatieopties (die hierna beschreven
worden) gebruikt worden om een resulterend binair bestand te optimaliseren
(sinds dpkg 1.21.0). Opmerking: het inschakelen van al deze
opties kan resulteren in niet-reproduceerbare ongewenste bijverschijnselen
in het binair bestand.
- lto
- Deze instelling (sinds dpkg 1.21.0; standaard uitgeschakeld) zet Link Time
Optimization aan door -flto=auto -ffat-lto-objects toe te voegen
aan CFLAGS, CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS,
FFLAGS, FCFLAGS of LDFLAGS.
Er kunnen verschillende compilatie-opties (die hierna beschreven
worden) gebruikt worden om te helpen bij het gezond houden van een
resulterend binair pakket op het vlak van geheugenvervuiling,
geheugenlekkage, geheugengebruik na vrijgave, dataraces bij threads en bugs
door ongedefinieerd gedrag. Noot: deze opties zouden niet
gebruikt mogen worden voor een bouw voor productiedoeleinden, aangezien ze
een verminderde betrouwbaarheid bieden inzake codeconformiteit en de
beveiliging en zelfs de functionaliteit reduceren.
- address
- Deze instelling (sinds dpkg 1.18.0; standaard uitgeschakeld) voegt
-fsanitize=address toe aan LDFLAGS en -fsanitize=address
-fno-omit-frame-pointer aan CFLAGS en aan CXXFLAGS.
- thread
- Deze instelling (sinds dpkg 1.18.0; standaard uitgeschakeld) voegt
-fsanitize=thread toe aan CFLAGS, CXXFLAGS en
LDFLAGS.
- leak
- Deze instelling (sinds dpkg 1.18.0; standaard uitgeschakeld) voegt
-fsanitize=leak toe aan LDFLAGS. Ze wordt automatisch
uitgeschakeld als ofwel de address-functionaliteit of de
thread-functionaliteit geactiveerd is, aangezien die dit
impliceren.
- undefined
- Deze instelling (sinds dpkg 1.18.0; standaard uitgeschakeld) voegt
-fsanitize=undefined toe aan CFLAGS, CXXFLAGS en
LDFLAGS.
Er kunnen verschillende compilatie-opties (die hierna beschreven
worden) gebruikt worden om te helpen bij het versterken van een resulterend
binair pakket tegen geheugenvervuilingsaanvallen of om bijkomende
waarschuwingsberichten te geven tijdens het compileren. Behalve wanneer
hierna anders aangegeven is, worden deze opties standaard geactiveerd voor
architecturen die ze ondersteunen.
- format
- Deze instelling (sinds dpkg 1.16.1; standaard geactiveerd) voegt
-Wformat -Werror=format-security toe aan CFLAGS,
CXXFLAGS, OBJCFLAGS en OBJCXXFLAGS. Dit zal
waarschuwingen geven bij verkeerd gebruik van indelingstekenreeksen en zal
mislukken als indelingsfuncties gebruikt worden op een manier die
mogelijke veiligheidsproblemen tot gevolg kunnen hebben. Momenteel geeft
dit een waarschuwing als een printf-functie of een
scanf-functie aangeroepen wordt met een indelingstekenreeks die
geen letterlijke tekenreeks is en er ook geen indelingsargumenten
opgegeven werden, zoals bij printf(foo); in plaats van
printf("%s", foo);. Dit kan een veiligheidslek zijn als
de indelingstekenreeks afkomstig was van onbetrouwbare invoer en
‘%n’ bevat.
- fortify
- Deze instelling (sinds dpkg 1.16.1; standaard geactiveerd) voegt
-D_FORTIFY_SOURCE=3 toe aan CPPFLAGS. Tijdens het produceren
van de code heeft de compiler een heleboel informatie over buffergroottes
(waar mogelijk), en tracht een functieaanroep met een onveilige
ongelimiteerde buffergrootte te vervangen door een functieaanroep met een
gelimiteerde buffergrootte. Dit is in het bijzonder nuttig bij oude en
slecht geschreven code. Daarnaast wordt het gebruik in het voor schrijven
toegankelijk geheugen van indelingstekenreeksen die ‘%n’
bevatten, geblokkeerd. Indien een toepassing op een dergelijke
indelingstekenreeks steunt, zal het er een alternatief voor moeten
gebruiken.
Merk op dat de code ook met -O1 of hoger gecompileerd
moet worden opdat deze optie effect zou hebben. Indien de
omgevingsvariabele DEB_BUILD_OPTIONS noopt bevat, dan
wordt ondersteuning voor fortify uitgeschakeld. Dit is te wijten
aan nieuwe waarschuwingen die gegeven worden door glibc 2.16 en
hoger.
- stackprotector
- Deze instelling (sinds dpkg 1.16.1; standaard geactiveerd als
stackprotectorstrong niet gebruikt wordt) voegt -fstack-protector
--param=ssp-buffer-size=4 toe aan CFLAGS, CXXFLAGS,
OBJCFLAGS, OBJCXXFLAGS, FFLAGS en FCFLAGS. Dit
voegt beveiligingscontroles tegen het overschrijven van de stack toe. Dit
maakt dat bij veel mogelijke code-injectieaanvallen afgebroken wordt. In
het beste geval wordt op die manier een kwetsbaarheid voor code-injectie
omgebogen tot een denial-of-service (dienst niet beschikbaar) of een
fictief probleem (afhankelijk van de toepassing).
Deze functionaliteit vereist het linken van de code met glibc
(of een andere aanbieder van __stack_chk_fail) en moet dus
uitgeschakeld worden als er gebouwd wordt met -nostdlib of
-ffreestanding of iets gelijkaardigs.
- stackprotectorstrong
- Deze instelling (sinds dpkg 1.17.11; standaard geactiveerd) voegt
-fstack-protector-strong toe aan CFLAGS, CXXFLAGS,
OBJCFLAGS, OBJCXXFLAGS, FFLAGS en FCFLAGS. Dit
is een sterkere variant van stackprotector, maar zonder
noemenswaardig prestatieverlies.
Het uitzetten van stackprotector schakelt ook deze
functionaliteit uit.
Deze functionaliteit stelt dezelfde vereisten als
stackprotector en heeft daarenboven ook gcc 4.9 of een recentere
versie nodig.
- stackclash
- Deze instelling (sinds dpkg 1.22.0; standaard geactiveerd) voegt op
amd64, arm64, armhf en armel
-fstack-protector-strong toe aan CFLAGS, CXXFLAGS,
OBJCFLAGS, OBJCXXFLAGS, FFLAGS en FCFLAGS.
Hiermee wordt code toegevoegd om aanvallen van het type stack-clash te
voorkomen.
- branch
- Deze instelling (sinds dpkg 1.22.0; standaard geactiveerd) voegt
-fstack-protector-strong toe aan CFLAGS, CXXFLAGS,
OBJCFLAGS, OBJCXXFLAGS, FFLAGS en FCFLAGS. Dit
voegt takbeveiliging toe aan indirecte aanroepen, sprongen en retouren om
te controleren of deze geldig zijn tijdens het uitvoeren.
- relro
- Deze instelling (sinds dpkg 1.16.1; standaard geactiveerd) voegt
-Wl,-z,relro toe aan LDFLAGS. Tijdens het laden van het
programma moet de linker in verschillende ELF-geheugensecties schrijven.
Dit zet voor de programmalader een vlag zodat die deze secties
alleen-lezen maakt alvorens de controle over te dragen aan het programma.
Het meest noemenswaardige effect is dat dit aanvallen door het
overschrijven van de Global Offset Table (GOT) voorkomt. Indien deze optie
uitgeschakeld wordt, wordt ook bindnow uitgezet.
- bindnow
- Deze instelling (sinds dpkg 1.16.1; standaard uitgeschakeld) voegt
-Wl,-z,now toe aan LDFLAGS. Tijdens het laden van het
programma worden alle dynamische symbolen omgezet, waardoor de volledige
PLT (Procedure Linkage Table) als alleen lezen gemarkeerd kan worden (ten
gevolge van relro hiervoor). Deze optie kan niet aangezet worden
als relro niet geactiveerd is.
- pie
- Deze instelling (sinds dpkg 1.16.1; zonder algemene standaardinstelling
sinds dpkg 1.18.23, aangezien het nu standaard geactiveerd wordt door gcc
op de Debian-architecturen amd64, arm64, armel, armhf, hurd-i386, i386,
kfreebsd-amd64, kfreebsd-i386, mips, mipsel, mips64el, powerpc, ppc64,
ppc64el, riscv64, s390x, sparc en sparc64) voegt zo nodig de vereiste
opties toe om PIE te activeren of te deactiveren via gcc specs-bestanden,
afhankelijk van het feit of gcc op die architectuur de vlaggen zelf
injecteert of niet. Indien de instelling geactiveerd is en gcc de vlaggen
injecteert, voegt ze niets toe. Indien de instelling geactiveerd is en gcc
de vlaggen niet injecteert, voegt ze -fPIE toe (via
/usr/share/dpkg/pie-compiler.specs) aan CFLAGS,
CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS, FFLAGS en
FCFLAGS, en -fPIE -pie (via
/usr/share/dpkg/pie-link.specs) aan LDFLAGS. Indien de
instelling gedeactiveerd is en gcc de vlaggen injecteert, voegt ze
-fno-PIE toe (via /usr/share/dpkg/no-pie-compile.specs) aan
CFLAGS, CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS,
FFLAGS en FCFLAGS, en -fno-PIE -no-pie (via
/usr/share/dpkg/no-pie-link.specs) aan LDFLAGS.
Position Independent Executable (PIE - positie-onafhankelijke
programma) is nodig om voordeel te halen uit Address Space Layout
Randomization (ASLR - de adresruimte rangschikken in toevallige
volgorde), hetgeen door sommige kernelversies ondersteund wordt. Hoewel
ASLR reeds voor datagebieden in de stack en de heap opgelegd kan worden
(brk and mmap), moeten de codegebieden als positieonafhankelijk
gecompileerd worden. Gedeelde bibliotheken doen dit reeds
(-fPIC), waardoor zij automatisch ASLR krijgen, maar binaire
.text-gebieden moeten als PIE gebouwd worden om ASLR te krijgen. Als dit
gebeurt, worden aanvallen van het type ROP (Return Oriented Programming
- op terugkeerwaarde georiënteerd programmeren) veel moeilijker
aangezien er geen statische locaties meer zijn die bij een aanval van
geheugenvervuiling als springplank gebruikt kunnen worden.
PIE is niet compatibel met -fPIC, dus over het algemeen
moet men voorzichtig zijn bij het bouwen van gedeelde objecten. Maar
aangezien de PIE-vlaggen die meegegeven worden geïnjecteerd
worden via specs-bestanden van gcc, zou het altijd veilig moeten zijn om
ze onvoorwaardelijk in te stellen ongeacht het objecttype dat
gecompileerd of gelinkt wordt.
Statische bibliotheken kunnen door programma's of door andere
gedeelde bibliotheken gebruikt worden. Afhankelijk van de gebruikte
vlaggen bij het compileren van alle objecten in een statische
bibliotheek, zullen deze bibliotheken door verschillende reeksen
objecten gebruikt kunnen worden:
- geen
- Kan niet gelinkt worden aan een PIE-programma, noch aan een gedeelde
bibliotheek.
- -fPIE
- Kan gelinkt worden aan elk programma, maar niet aan een gedeelde
bibliotheek (aanbevolen).
- -fPIC
- Kan gelinkt worden aan elk programma en elke gedeelde bibliotheek.
Indien er een behoefte bestaat om deze vlaggen manueel in te
stellen en de gcc specs-injectie te overbruggen, moet u rekening houden met
verschillende zaken. Het onvoorwaardelijk en expliciet doorgeven van
-fPIE, -fpie of -pie aan een bouwsysteem dat libtool
gebruikt, is veilig aangezien deze vlaggen weggelaten worden bij het bouwen
van gedeelde bibliotheken. Bij projecten waarin daarentegen zowel
programma's als gedeelde bibliotheken gebouwd worden, moet u ervoor zorgen
dat bij het bouwen van de gedeelde bibliotheken -fPIC steeds als
laatste doorgegeven wordt (waardoor het een eventuele voorafgaande
-PIE opheft) aan compilatievlaggen zoals CFLAGS en dat
-shared als laatste doorgegeven wordt (waardoor het een eventuele
voorafgaande -pie opheft) aan linkvlaggen zoals LDFLAGS.
Opmerking: dit is niet nodig met het standaard specs-mechanisme van
gcc.
Aangezien PIE via een algemeen register geïmplementeerd
wordt, kunnen bovendien bij sommige architecturen (maar niet meer bij i386
sinds de optimalisaties die in gcc >= 5 toegepast zijn)
prestatieverminderingen tot 15% optreden bij zeer zware belasting met
tekstsegmenten van toepassingen. De meeste belastingen hebben minder dan 1%
prestatievermindering tot gevolg. Architecturen met meer algemene registers
(bijv. amd64) vertonen niet zo een hoge terugval in de ergste gevallen.
De hierna behandelde compilatieopties kunnen gebruikt worden om de
bouwreproduceerbaarheid te helpen verbeteren of om bijkomende
waarschuwingsberichten af te leveren tijdens het compileren. Behalve wanneer
het hierna aangegeven wordt, worden deze opties standaard geactiveerd voor
architecturen die ze ondersteunen.
- timeless
- Deze instelling (sinds dpkg 1.17.14; standaard geactiveerd) voegt
-Wdate-time toe bij CPPFLAGS. Dit leidt tot waarschuwingen
als de macros __TIME__, __DATE__ en __TIMESTAMP__
gebruikt worden.
- fixfilepath
- Deze instelling (sinds dpkg 1.19.1; standaard geactiveerd) voegt
-ffile-prefix-map=BUILDPATH=. toe aan CFLAGS,
CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS, FFLAGS en
FCFLAGS, waarbij BUILDPATH ingesteld wordt op de basismap
van het pakket dat gebouwd wordt. Dit heeft als effect dat het bouwpad
verwijderd wordt van elk gegenereerd bestand.
Indien zowel fixdebugpath als fixfilepath
ingesteld zijn, heeft deze laatste optie voorrang, omdat het een
superset is van de eerste.
Opmerking: Als het bouwproces de bouwvlaggen in de
resulterende gebouwde objecten vastlegt, wordt het pakket niet
reproduceerbaar. En hoewel het uitschakelen van deze optie sommige
objecten weer reproduceerbaar zou kunnen maken, zou dit ook het
uitschakelen van fixdebugpath vereisen, waardoor alle
gegenereerde debug-symbolenobjecten niet reproduceerbaar zouden kunnen
worden. De ideale oplossing is om te stoppen met het vastleggen van
bouwvlaggen.
- fixdebugpath
- Deze instelling (sinds dpkg 1.18.5; standaard geactiveerd) voegt
-fdebug-prefix-map=BUILDPATH=. toe aan CFLAGS,
CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS, FFLAGS en
FCFLAGS, waarbij BUILDPATH ingesteld wordt op de basismap
van het pakket dat gebouwd wordt. Dit heeft als effect dat het bouwpad
verwijderd wordt van eventueel gegenereerde debug-symbolen.
Opmerking: deze functie heeft vergelijkbare
reproduceerbare eigenschappen als fixfilepath.
Er zijn twee sets omgevingsvariabelen die dezelfde operaties
uitvoeren. De eerste (DEB_vlag_operatie) zou nooit gebruikt
mogen worden binnen debian/rules. Die is bedoeld voor eventuele
gebruikers die het bronpakket opnieuw willen bouwen met andere bouwvlaggen.
De tweede set (DEB_vlag_MAINT_operatie) zou door
pakketbeheerders enkel in debian/rules gebruikt moeten worden om de
resulterende bouwvlaggen aan te passen.
- DEB_vlag_SET
- DEB_vlag_MAINT_SET
(sinds dpkg 1.16.1)
- Deze variabele kan gebruikt worden om de teruggegeven waarde voor de
opgegeven vlag vlag af te dwingen.
- DEB_vlag_STRIP
(sinds dpkg 1.16.1)
- DEB_vlag_MAINT_STRIP
(sinds dpkg 1.16.1)
- Deze variabele kan gebruikt worden om in een lijst met witruimte als
scheidingsteken opties op te geven die weggehaald zullen worden uit de set
vlaggen die teruggegeven wordt voor de opgegeven vlag.
- DEB_vlag_APPEND
- DEB_vlag_MAINT_APPEND
(sinds dpkg 1.16.1)
- Deze variabele kan gebruikt worden om bijkomende opties toe te voegen aan
de waarde die teruggegeven wordt voor de opgegeven vlag.
- DEB_vlag_PREPEND
(sinds dpkg 1.16.1)
- DEB_vlag_MAINT_PREPEND
(sinds dpkg 1.16.1)
- Deze variabele kan gebruikt worden om vooraan bijkomende opties toe te
voegen aan de waarde die teruggegeven wordt voor de opgegeven
vlag.
- DEB_BUILD_OPTIONS
- DEB_BUILD_MAINT_OPTIONS
(sinds dpkg 1.16.1)
- Deze variabelen kunnen door een gebruiker of een beheerder gebruikt worden
om diverse gebiedsfuncties die bouwvlaggen beïnvloeden, te
activeren of uit te zetten. De variabele DEB_BUILD_MAINT_OPTIONS
vervangt eventuele instellingen in de functionaliteitsgebieden
DEB_BUILD_OPTIONS. Zie het onderdeel
"FUNCTIONALITEITSGEBIEDEN" voor de details.
- DEB_VENDOR
- Deze instelling definieert de huidige leverancier. Indien zij niet
ingesteld is, zal gezocht worden naar de huidige leverancier door te gaan
lezen in /etc/dpkg/origins/default.
- DEB_BUILD_PATH
- Deze variabele stelt in welk bouwpad (sinds dpkg 1.18.8) gebruikt moet
worden bij functionaliteit zoals fixdebugpath waardoor die
gesuperviseerd kan worden door het aanroepende programma. Momenteel is
deze variabele Debian- en derivaat-specifiek.
- DPKG_COLORS
- Stelt de kleurmodus in (sinds dpkg 1.18.5). Waarden die momenteel gebruikt
mogen worden zijn: auto (standaard), always en
never.
- DPKG_NLS
- Indien dit ingesteld is, zal het gebruikt worden om te beslissen over het
activeren van moedertaalondersteuning, ook gekend als
internationaliseringsondersteuning (of i18n) (sinds dpkg 1.19.0). Geldige
waarden zijn: 0 and 1 (standaard).
- /etc/dpkg/buildflags.conf
- Configuratiebestand dat voor het hele systeem geldt.
- $XDG_CONFIG_HOME/dpkg/buildflags.conf of
- $HOME/.config/dpkg/buildflags.conf
- Configuratiebestand dat gebruikersafhankelijk is.
- /usr/share/dpkg/buildflags.mk
- Makefile-fragment dat alle vlaggen die door dpkg-buildflags
ondersteund worden, laadt in variabelen (en eventueel exporteert) (sinds
dpkg 1.16.1).
Om in een Makefile bouwvlaggen door te geven aan een
bouwcommando:
$(MAKE) $(shell dpkg-buildflags --export=cmdline)
./configure $(shell dpkg-buildflags --export=cmdline)
Om in een shell-script of shell-fragment bouwvlaggen in te
stellen, kan eval gebruikt worden om de uitvoer te interpreteren en
de vlaggen in de omgeving te exporteren:
eval "$(dpkg-buildflags --export=sh)" && make
of om de positieparameters in te stellen die aan een commando
doorgegeven moeten worden:
eval "set -- $(dpkg-buildflags --export=cmdline)"
for dir in a b c; do (cd $dir && ./configure "$@" && make); done
Om de benodigde bouwvlaggen te bekomen die aan het bouwsysteem
doorgegeven moeten worden, moet u vanuit het bestand debian/rules
dpkg-buildflags aanroepen of buildflags.mk invoegen. Merk op
dat oudere versies van dpkg-buildpackage (voor dpkg 1.16.1) deze
vlaggen automatisch exporteerden. U zou hierop echter niet mogen betrouwen,
aangezien dit het handmatig aanroepen van debian/rules defect
maakt.
Voor pakketten met een autoconf-achtig bouwsysteem, kunt u de
relevante opties rechtstreeks doorgeven aan configure of make(1),
zoals hiervoor geïllustreerd werd.
Voor andere bouwsystemen, of indien u een meer fijnmazige controle
nodig heeft over welke vlaggen waar doorgegeven worden, kunt u --get
gebruiken. Of in de plaats daarvan kunt u buildflags.mk invoegen, dat
zorgt voor het aanroepen van dpkg-buildflags en het opslaan van de
bouwvlaggen in variabelen voor make.
Indien u alle bouwvlaggen naar de omgeving wenst te exporteren
(waar ze door uw bouwsysteem opgepikt kunnen worden):
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk
Als u bijkomende controle wenst over wat geëxporteerd
wordt, kunt u de variabelen handmatig exporteren (aangezien er standaard
geen enkele geëxporteerd wordt):
include /usr/share/dpkg/buildflags.mk
export CPPFLAGS CFLAGS LDFLAGS
En u kunt de vlaggen natuurlijk ook handmatig doorgeven aan
commando's:
include /usr/share/dpkg/buildflags.mk
build-arch:
$(CC) -o hello hello.c $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)