Provided by: dpkg-dev_1.22.6ubuntu6.5_all 

NAAM
dpkg-buildflags - geeft de bij pakketbouw te gebruiken bouwvlaggen terug
OVERZICHT
dpkg-buildflags [optie...] [commando]
BESCHRIJVING
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.
COMMANDO'S
--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.
ONDERSTEUNDE VLAGGEN
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).
FUNCTIEGEBIEDEN
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
abi
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.
future
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.
kwaliteitsbevordering
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.
optimalisering
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.
sanering
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.
kwetsbaarheidsreductie
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.
reproduceerbaarheid
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.
OMGEVING
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).
BESTANDEN
Configuratiebestanden
/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.
Ondersteuning bij het maken van een pakket
/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).
VOORBEELDEN
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
Het gebruik in debian/rules
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)
1.22.6 2025-09-18 dpkg-buildflags(1)