man-pages/nl/man1/dpkg-buildflags.1.html
2021-03-31 01:06:50 +01:00

716 lines
31 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML><HEAD><TITLE>Man page of dpkg-buildflags</TITLE>
</HEAD><BODY>
<H1>dpkg-buildflags</H1>
Section: dpkg-suite (1)<BR>Updated: 2020-03-23<BR><A HREF="#index">Index</A>
<A HREF="/cgi-bin/man/man2html">Return to Main Contents</A><HR>
<A NAME="lbAB">&nbsp;</A>
<H2>NAAM</H2>
dpkg-buildflags - geeft de bij pakketbouw te gebruiken bouwvlaggen terug
<A NAME="lbAC">&nbsp;</A>
<H2>OVERZICHT</H2>
<B>dpkg-buildflags</B> [<I>optie</I>...] [<I>commando</I>]
<A NAME="lbAD">&nbsp;</A>
<H2>BESCHRIJVING</H2>
<B>dpkg-buildflags</B> 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:
<DL COMPACT>
<DT id="1">1.<DD>
voor het hele systeem met <B>/etc/dpkg/buildflags.conf</B>;
<DT id="2">2.<DD>
voor de huidige gebruiker met <B>$XDG_CONFIG_HOME/dpkg/buildflags.conf</B>,
waarbij <B>$XDG_CONFIG_HOME</B> als standaardwaarde <B>$HOME/.config</B> heeft;
<DT id="3">3.<DD>
tijdelijk door de gebruiker met omgevingsvariabelen (zie het onderdeel
<B>OMGEVING</B>);
<DT id="4">4.<DD>
dynamisch door de pakketonderhouder met omgevingsvariabelen die ingesteld
worden via <B>debian/rules</B> (zie het onderdeel <B>OMGEVING</B>).
</DL>
<P>
De configuratiebestanden kunnen vier types opdrachten bevatten:
<DL COMPACT>
<DT id="5"><B>SET</B><I> vlag waarde</I><DD>
Vervang de waarde van de vlag die <I>vlag</I> als naam heeft in waarde
<I>waarde</I>.
<DT id="6"><B>STRIP</B><I> vlag waarde</I><DD>
Verwijder van de vlag die <I>vlag</I> als naam heeft alle bouwvlaggen die in
<I>waarde</I> opgesomd worden.
<DT id="7"><B>APPEND</B><I> vlag waarde</I><DD>
Breid de vlag die <I>vlag</I> als naam heeft uit door er de opties aan toe te
voegen die in <I>waarde</I> opgegeven worden. Er wordt een spatie geplaatst voor
de waarde die toegevoegd wordt, indien de huidige waarde van de vlag niet
leeg is.
<DT id="8"><B>PREPEND</B><I> vlag waarde</I><DD>
Breid de vlag die <I>vlag</I> als naam heeft uit door er vooraan de opties aan
toe te voegen die in <I>waarde</I> opgegeven worden. Er wordt een spatie
geplaatst achter de waarde die toegevoegd wordt, indien de huidige waarde
van de vlag niet leeg is.
</DL>
<P>
De configuratiebestanden kunnen commentaar bevatten op regels die beginnen
met een hekje (#). Ook lege regels worden genegeerd.
<A NAME="lbAE">&nbsp;</A>
<H2>COMMANDO'S</H2>
<DL COMPACT>
<DT id="9"><B>--dump</B><DD>
Laat op standaarduitvoer alle compilatievlaggen en hun waarden zien. Dit
geeft per regel &eacute;&eacute;n vlag en de waarde ervan weer met daartussenin een
gelijkheidsteken ("<I>vlag</I>=<I>waarde</I>"). Dit is de standaardactie.
<DT id="10"><B>--list</B><DD>
Geeft een lijst weer van vlaggen die door de huidige leverancier ondersteund
wordt (&eacute;&eacute;n per regel). Zie het onderdeel <B>SUPPORTED FLAGS</B> (ondersteunde
vlaggen) voor meer informatie daarover.
<DT id="11"><B>--status</B><DD>
Laat eventuele informatie zien die nuttig kan zijn om het gedrag te
verklaren van <B>dpkg-buildflags</B> (sinds dpkg 1.16.5): relevante
omgevingsvariabelen, huidige leverancier, toestand van alle
functievlaggen. Geef ook de resulterende compileervlaggen met hun oorsprong
weer.
<P>
Het is de bedoeling dat dit uitgevoerd wordt vanuit <B>debian/rules</B>, zodat
de bouwlog een duidelijk spoor van de gebruikte vlaggen kan bijhouden. Dit
kan nuttig zijn om ermee verband houdende problemen te diagnosticeren.
<DT id="12"><B>--export=</B><I>indeling</I><DD>
Geef op standaarduitvoer commando's weer die gebruikt kunnen worden om alle
compilatievlaggen te exporteren ten behoeve van een specifiek
gereedschap. Indien de waarde <I>indeling</I> niet opgegeven werd, wordt <B>sh</B>
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:
<DL COMPACT><DT id="13"><DD>
<DL COMPACT>
<DT id="14"><B>sh</B><DD>
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&euml;valueerd te worden.
<DT id="15"><B>cmdline</B><DD>
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.
<DT id="16"><B>configure</B><DD>
Dit is een verouderde alias voor <B>cmdline</B>.
<DT id="17"><B>make</B><DD>
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&euml;valueerd met behulp van een <B>include</B>-opdracht.
</DL>
</DL>
<DT id="18"><B>--get</B><I> vlag</I><DD>
Geef de waarde van de vlag weer op de standaarduitvoer. Sluit af met 0 bij
een gekende vlag en sluit anders af met 1.
<DT id="19"><B>--origin</B><I> vlag</I><DD>
Geef de origine weer van de waarde die teruggegeven wordt door
<B>--get</B>. Sluit af met 0 bij een gekende vlag en sluit anders af met 1. De
origine kan &eacute;&eacute;n van de volgende waarden hebben:
<DL COMPACT><DT id="20"><DD>
<DL COMPACT>
<DT id="21"><B>vendor</B><DD>
de originele vlag die door de leverancier ingesteld werd, wordt
teruggegeven;
<DT id="22"><B>system</B><DD>
de vlag werd ingesteld/gewijzigd door een systeemconfiguratie;
<DT id="23"><B>user</B><DD>
de vlag werd ingesteld/gewijzigd door een gebruikersspecifieke configuratie;
<DT id="24"><B>env</B><DD>
de vlag werd ingesteld/gewijzigd door een omgevingsspecifieke configuratie.
</DL>
</DL>
<DT id="25"><B>--query</B><DD>
Laat alle informatie zien die nuttig kan zijn om het gedrag van het
programma te verklaren: huidige leverancier, relevante omgevingsvariabelen,
functiegebieden, toestand van alle functievlaggen en de compileervlaggen met
hun oorsprong (sinds dpkg 1.19.0).
<DT id="26"><DD>
Bijvoorbeeld:
<PRE>
Vendor: Debian
Environment:
DEB_CFLAGS_SET=-O0 -Wall
Area: qa
Features:
bug=no
canary=no
Area: reproducible
Features:
timeless=no
Flag: CFLAGS
Value: -O0 -Wall
Origin: env
Flag: CPPFLAGS
Value: -D_FORTIFY_SOURCE=2
Origin: vendor
</PRE>
<DT id="27"><B>--query-features</B><I> gebied</I><DD>
Geef de functies weer die voor een opgegeven gebied geactiveerd zijn (sinds
dpkg 1.16.2). Momenteel worden door Debian en zijn derivaten enkel de
gebieden <B>future</B>, <B>qa</B>, <B>reproducible</B>, <B>sanitize</B> en <B>hardening</B>
herkend. Zie het onderdeel <B>FUNCTIEGEBIEDEN</B> voor meer details. Sluit af
met 0 als het gebied gekend is, anders met 1.
<DT id="28"><DD>
De uitvoer is in RFC822-indeling met &eacute;&eacute;n sectie per functie. Bijvoorbeeld:
<DT id="29"><DD>
<PRE>
Feature: pie
Enabled: yes
Feature: stackprotector
Enabled: yes
</PRE>
<DT id="30"><B>--help</B><DD>
Toon info over het gebruik en sluit af.
<DT id="31"><B>--version</B><DD>
Toon de versie en sluit af.
</DL>
<A NAME="lbAF">&nbsp;</A>
<H2>ONDERSTEUNDE VLAGGEN</H2>
<DL COMPACT>
<DT id="32"><B>CFLAGS</B><DD>
Opties voor de C-compiler. De door de leverancier ingestelde standaardwaarde
bestaat uit <B>-g</B> en het standaardniveau van optimalisatie (gewoonlijk
<B>-O2</B>, of <B>-O0</B> indien de omgevingsvariabele <B>DEB_BUILD_OPTIONS</B> <I>noopt</I>
aangeeft).
<DT id="33"><B>CPPFLAGS</B><DD>
Opties voor de C-preprocessor. Standaardwaarde: leeg.
<DT id="34"><B>CXXFLAGS</B><DD>
Opties voor de C++ compiler. Hetzelfde als <B>CFLAGS</B>.
<DT id="35"><B>OBJCFLAGS</B><DD>
Opties voor de Objective C compiler. Hetzelfde als <B>CFLAGS</B>.
<DT id="36"><B>OBJCXXFLAGS</B><DD>
Opties voor de Objective C++ compiler. Hetzelfde als <B>CXXFLAGS</B>.
<DT id="37"><B>GCJFLAGS</B><DD>
Opties voor de GNU Java compiler (gcj). Een subset van <B>CFLAGS</B>.
<DT id="38"><B>FFLAGS</B><DD>
Opties voor de Fortran 77 compiler. Een subset van <B>CFLAGS</B>.
<DT id="39"><B>FCFLAGS</B><DD>
Opties voor de Fortran 9x compiler. Hetzelfde als <B>FFLAGS</B>.
<DT id="40"><B>LDFLAGS</B><DD>
Opties die aan de compiler doorgegeven worden bij het linken van uitvoerbare
programma's en gedeelde objecten (indien de linker rechtstreeks aangeroepen
wordt, dan moeten <B>-Wl</B> en <B>,</B> van die opties verwijderd
worden). Standaardwaarde: leeg.
</DL>
<P>
In de toekomst kunnen nog andere vlaggen toegevoegd worden als daar behoefte
aan ontstaat (bijvoorbeeld om andere talen te ondersteunen).
<A NAME="lbAG">&nbsp;</A>
<H2>FUNCTIEGEBIEDEN</H2>
<P>
Elke gebiedsfunctie kan in de gebiedswaarde van de omgevingsvariabelen
<B>DEB_BUILD_OPTIONS</B> en <B>DEB_BUILD_MAINT_OPTIONS</B> ingeschakeld en
uitgeschakeld worden met de schakelaars '<B>+</B>' en '<B>-</B>'. Om bijvoorbeeld de
<B>hardening</B>-functionaliteit "pie" te activeren en de functionaliteit
"fortify" uit te schakelen, kunt u in <B>debian/rules</B> het volgende doen:
<P>
<BR>&nbsp;&nbsp;export&nbsp;DEB_BUILD_MAINT_OPTIONS=hardening=+pie,-fortify
<P>
De bijzondere functie <B>all</B> (geldig in elk gebied) kan gebruikt worden om
gelijktijdig alle gebiedsfunctionaliteit te activeren of uit te
schakelen. Alles uitschakelen in het gebied <B>hardening</B> en enkel "format"
en "fortify" activeren kunt u dus doen met:
<P>
<BR>&nbsp;&nbsp;export&nbsp;DEB_BUILD_MAINT_OPTIONS=hardening=-all,+format,+fortify
<A NAME="lbAH">&nbsp;</A>
<H3>future</H3>
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.
<DL COMPACT>
<DT id="41"><B>lfs</B><DD>
Deze instelling (standaard uitgezet) activeert ondersteuning voor grote
bestanden (Large File Support) op 32-bits architecturen waarvan de ABI
standaard geen LFS-ondersteuning biedt, door <B>-D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64</B> toe te voegen aan <B>CPPFLAGS</B>.
</DL>
<A NAME="lbAI">&nbsp;</A>
<H3>qa (kwaliteitsbevordering)</H3>
Er kunnen verschillende compilatieopties (die hierna beschreven worden)
gebruikt worden om problemen in de broncode of het bouwsysteem te helpen
detecteren.
<DL COMPACT>
<DT id="42"><B>bug</B><DD>
Deze instelling (die standaard uitgeschakeld is) voegt alle
waarschuwingsopties toe die op een betrouwbare wijze problematische broncode
opsporen. De waarschuwingen zijn fataal. De enige vlaggen die momenteel
ondersteund worden zijn <B>CFLAGS</B> en <B>CXXFLAGS</B> waarbij de vlaggen
ingesteld staan op <B>-Werror=array-bounds</B>, <B>-Werror=clobbered</B>,
<B>-Werror=implicit-function-declaration</B> en
<B>-Werror=volatile-register-var</B>.
<DT id="43"><B>canary</B><DD>
Deze instelling (die standaard uitgeschakeld is) 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 <B>CPPFLAGS</B>, <B>CFLAGS</B>, <B>OBJCFLAGS</B>,
<B>CXXFLAGS</B> en <B>OBJCXXFLAGS</B>, waarbij die vlaggen als
<B>-D__DEB_CANARY_</B><I>vlag</I>_<I>willekeurige-id</I><B>__</B> ingesteld worden, en
<B>LDFLAGS</B> dat ingesteld wordt op <B>-Wl,-z,deb-canary-</B><I>willekeurige-id</I>.
</DL>
<A NAME="lbAJ">&nbsp;</A>
<H3>sanitize (saneren)</H3>
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. <B>Noot</B>: deze opties zouden <B>niet</B> gebruikt mogen
worden voor een bouw voor productiedoeleinden, aangezien ze een verminderde
betrouwbaarheid bieden inzake codeconformiteit en de beveiliging en zelfs de
functionaliteit reduceren.
<DL COMPACT>
<DT id="44"><B>address</B><DD>
Deze instelling (standaard uitgeschakeld) voegt <B>-fsanitize=address</B> toe
aan <B>LDFLAGS</B> en <B>-fsanitize=address -fno-omit-frame-pointer</B> aan
<B>CFLAGS</B> en aan <B>CXXFLAGS</B>.
<DT id="45"><B>thread</B><DD>
Deze instelling (standaard uitgeschakeld) voegt <B>-fsanitize=thread</B> toe aan
<B>CFLAGS</B>, <B>CXXFLAGS</B> en <B>LDFLAGS</B>.
<DT id="46"><B>leak</B><DD>
Deze instelling (standaard uitgeschakeld) voegt <B>-fsanitize=leak</B> toe aan
<B>LDFLAGS</B>. Ze wordt automatisch uitgeschakeld als ofwel de
<B>address</B>-functionaliteit of de <B>thread</B>-functionaliteit geactiveerd is,
aangezien die dit impliceren.
<DT id="47"><B>undefined</B><DD>
Deze instelling (standaard uitgeschakeld) voegt <B>-fsanitize=undefined</B> toe
aan <B>CFLAGS</B>, <B>CXXFLAGS</B> en <B>LDFLAGS</B>.
</DL>
<A NAME="lbAK">&nbsp;</A>
<H3>hardening (kwetsbaarheidsreductie)</H3>
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.
<DL COMPACT>
<DT id="48"><B>format</B><DD>
Deze instelling (standaard geactiveerd) voegt <B>-Wformat
-Werror=format-security</B> toe aan <B>CFLAGS</B>, <B>CXXFLAGS</B>, <B>OBJCFLAGS</B> en
<B>OBJCXXFLAGS</B>. 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 <B>printf</B>-functie of
een <B>scanf</B>-functie aangeroepen wordt met een indelingstekenreeks die geen
letterlijke tekenreeks is en er ook geen indelingsargumenten opgegeven
werden, zoals bij <B>printf(foo);</B> in plaats van <B>printf(&quot;%s&quot;, foo);</B>. Dit
kan een veiligheidslek zijn als de indelingstekenreeks afkomstig was van
onbetrouwbare invoer en '%n' bevat.
<DT id="49"><B>fortify</B><DD>
Deze instelling (standaard geactiveerd) voegt <B>-D_FORTIFY_SOURCE=2</B> toe aan
<B>CPPFLAGS</B>. 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.
<P>
Merk op dat de code ook met <B>-O1</B> of hoger gecompileerd moet worden opdat
deze optie effect zou hebben. Indien de omgevingsvariabele
<B>DEB_BUILD_OPTIONS</B> <I>noopt</I> bevat, dan wordt ondersteuning voor <B>fortify</B>
uitgeschakeld. Dit is te wijten aan nieuwe waarschuwingen die gegeven worden
door glibc 2.16 en hoger.
<DT id="50"><B>stackprotector</B><DD>
Deze instelling (standaard geactiveerd als stackprotectorstrong niet
gebruikt wordt) voegt <B>-fstack-protector --param=ssp-buffer-size=4</B> toe aan
<B>CFLAGS</B>, <B>CXXFLAGS</B>, <B>OBJCFLAGS</B>, <B>OBJCXXFLAGS</B>, <B>GCJFLAGS</B>, <B>FFLAGS</B>
en <B>FCFLAGS</B>. 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).
<P>
Deze functionaliteit vereist het linken van de code met glibc (of een andere
aanbieder van <B>__stack_chk_fail</B>) en moet dus uitgeschakeld worden als er
gebouwd wordt met <B>-nostdlib</B> of <B>-ffreestanding</B> of iets gelijkaardigs.
<DT id="51"><B>stackprotectorstrong</B><DD>
Deze instelling (standaard geactiveerd) voegt <B>-fstack-protector-strong</B>
toe aan <B>CFLAGS</B>, <B>CXXFLAGS</B>, <B>OBJCFLAGS</B>, <B>OBJCXXFLAGS</B>, <B>GCJFLAGS</B>,
<B>FFLAGS</B> en <B>FCFLAGS</B>. Dit is een sterkere variant van <B>stackprotector</B>,
maar zonder noemenswaardig prestatieverlies.
<P>
Het uitzetten van <B>stackprotector</B> schakelt ook deze functionaliteit uit.
<P>
Deze functionaliteit stelt dezelfde vereisten als <B>stackprotector</B> en heeft
daarenboven ook gcc 4.9 of een recentere versie nodig.
<DT id="52"><B>relro</B><DD>
Deze instelling (standaard geactiveerd) voegt <B>-Wl,-z,relro</B> toe aan
<B>LDFLAGS</B>. 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 <B>bindnow</B>
uitgezet.
<DT id="53"><B>bindnow</B><DD>
Deze instelling (standaard uitgeschakeld) voegt <B>-Wl,-z,now</B> toe aan
<B>LDFLAGS</B>. 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 <B>relro</B> hiervoor). Deze
optie kan niet aangezet worden als <B>relro</B> niet geactiveerd is.
<DT id="54"><B>pie</B><DD>
Deze instelling (zonder 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
<B>-fPIE</B> toe (via <I>/usr/share/dpkg/pie-compiler.specs</I>) aan <B>CFLAGS</B>,
<B>CXXFLAGS</B>, <B>OBJCFLAGS</B>, <B>OBJCXXFLAGS</B>, <B>GCJFLAGS</B>, <B>FFLAGS</B> en
<B>FCFLAGS</B>, en <B>-fPIE -pie</B> (via <I>/usr/share/dpkg/pie-link.specs</I>) aan
<B>LDFLAGS</B>. Indien de instelling gedeactiveerd is en gcc de vlaggen
injecteert, voegt ze <B>-fno-PIE</B> toe (via
<I>/usr/share/dpkg/no-pie-compile.specs</I>) aan <B>CFLAGS</B>, <B>CXXFLAGS</B>,
<B>OBJCFLAGS</B>, <B>OBJCXXFLAGS</B>, <B>GCJFLAGS</B>, <B>FFLAGS</B> en <B>FCFLAGS</B>, en
<B>-fno-PIE -no-pie</B> (via <I>/usr/share/dpkg/no-pie-link.specs</I>) aan <B>LDFLAGS</B>.
<P>
Position Independent Executable (PIE - positie-onafhankelijke programma's)
zijn 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 (<B>-fPIC</B>), 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&euml;nteerd programmeren) veel moeilijker aangezien er geen
statische locaties meer zijn die bij een aanval van geheugenvervuiling als
springplank gebruikt kunnen worden.
<P>
PIE is niet compatibel met <B>-fPIC</B>, dus over het algemeen moet men
voorzichtig zijn bij het bouwen van gedeelde objecten. Maar aangezien de
PIE-vlaggen die meegegeven worden ge&iuml;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.
<P>
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:
<P>
<DL COMPACT><DT id="55"><DD>
<DL COMPACT>
<DT id="56">geen<DD>
Kan niet gelinkt worden aan een PIE-programma, noch aan een gedeelde
bibliotheek.
<DT id="57"><B>-fPIE</B><DD>
Kan gelinkt worden aan elk programma, maar niet aan een gedeelde bibliotheek
(aanbevolen).
<DT id="58"><B>-fPIC</B><DD>
Kan gelinkt worden aan elk programma en elke gedeelde bibliotheek.
</DL>
</DL>
<P>
<DT id="59"><DD>
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 <B>-fPIE</B>, <B>-fpie</B> of
<B>-pie</B> 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 <B>-fPIC</B> steeds als laatste doorgegeven wordt (waardoor het een
eventuele voorafgaande <B>-PIE</B> opheft) aan compilatievlaggen zoals <B>CFLAGS</B>
en dat <B>-shared</B> als laatste doorgegeven wordt (waardoor het een eventuele
voorafgaande <B>-pie</B> opheft) aan linkvlaggen zoals <B>LDFLAGS</B>. <B>Opmerking:</B>
dit is niet nodig met het standaard specs-mechanisme van gcc.
<P>
<DT id="60"><DD>
Aangezien PIE via een algemeen register ge&iuml;mplementeerd wordt, kunnen
bovendien bij sommige architecturen (maar niet meer bij i386 sinds de
optimalisaties die in gcc &gt;= 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.
</DL>
<A NAME="lbAL">&nbsp;</A>
<H3>reproducible (reproduceerbaar)</H3>
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.
<DL COMPACT>
<DT id="61"><B>timeless</B><DD>
Deze instelling (standaard geactiveerd) voegt <B>-Wdate-time</B> toe bij
<B>CPPFLAGS</B>. Dit leidt tot waarschuwingen als de macros <B>__TIME__</B>,
<B>__DATE__</B> en <B>__TIMESTAMP__</B> gebruikt worden.
<DT id="62"><B>fixfilepath</B><DD>
Deze instelling (standaard gedeactiveerd) voegt
<B>-ffile-prefix-map=</B><I>BUILDPATH</I><B>=.</B> toe aan <B>CFLAGS</B>, <B>CXXFLAGS</B>,
<B>OBJCFLAGS</B>, <B>OBJCXXFLAGS</B>, <B>GCJFLAGS</B>, <B>FFLAGS</B> en <B>FCFLAGS</B>, waarbij
<B>BUILDPATH</B> ingesteld wordt op de basismap van het pakket dat gebouwd
wordt. Dit heeft als effect dat het bouwpad verwijderd wordt van eventueel
gegenereerde bestanden.
<P>
Indien zowel <B>fixdebugpath</B> als <B>fixfilepath</B> ingesteld zijn, heeft deze
laatste optie voorrang, omdat het een superset is van de eerste.
<DT id="63"><B>fixdebugpath</B><DD>
Deze instelling (standaard geactiveerd) voegt
<B>-fdebug-prefix-map=</B><I>BUILDPATH</I><B>=.</B> toe aan <B>CFLAGS</B>, <B>CXXFLAGS</B>,
<B>OBJCFLAGS</B>, <B>OBJCXXFLAGS</B>, <B>GCJFLAGS</B>, <B>FFLAGS</B> en <B>FCFLAGS</B>, waarbij
<B>BUILDPATH</B> 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.
</DL>
<A NAME="lbAM">&nbsp;</A>
<H2>OMGEVING</H2>
Er zijn twee sets omgevingsvariabelen die dezelfde operaties uitvoeren. De
eerste (DEB_<I>vlag</I>_<I>operatie</I>) zou nooit gebruikt mogen worden binnen
<B>debian/rules</B>. Die is bedoeld voor eventuele gebruikers die het bronpakket
opnieuw willen bouwen met andere bouwvlaggen. De tweede set
(DEB_<I>vlag</I>_MAINT_<I>operatie</I>) zou door pakketonderhouders enkel in
<B>debian/rules</B> gebruikt moeten worden om de resulterende bouwvlaggen aan te
passen.
<DL COMPACT>
<DT id="64"><B>DEB_</B><I>vlag</I><B>_SET</B><DD>
<B>DEB_</B><I>vlag</I><B>_MAINT_SET</B>
Deze variabele kan gebruikt worden om de teruggegeven waarde voor de
opgegeven vlag <I>vlag</I> af te dwingen.
<DT id="65"><B>DEB_</B><I>vlag</I><B>_STRIP</B><DD>
<B>DEB_</B><I>vlag</I><B>_MAINT_STRIP</B>
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 <I>vlag</I>.
<DT id="66"><B>DEB_</B><I>vlag</I><B>_APPEND</B><DD>
<B>DEB_</B><I>vlag</I><B>_MAINT_APPEND</B>
Deze variabele kan gebruikt worden om bijkomende opties toe te voegen aan de
waarde die teruggegeven wordt voor de opgegeven <I>vlag</I>.
<DT id="67"><B>DEB_</B><I>vlag</I><B>_PREPEND</B><DD>
<B>DEB_</B><I>vlag</I><B>_MAINT_PREPEND</B>
Deze variabele kan gebruikt worden om vooraan bijkomende opties toe te
voegen aan de waarde die teruggegeven wordt voor de opgegeven <I>vlag</I>.
<DT id="68"><B>DEB_BUILD_OPTIONS</B><DD>
<B>DEB_BUILD_MAINT_OPTIONS</B>
Deze variabelen kunnen door een gebruiker of een onderhouder gebruikt worden
om diverse gebiedsfuncties die bouwvlaggen be&iuml;nvloeden, te activeren of uit
te zetten. De variabele <B>DEB_BUILD_MAINT_OPTIONS</B> vervangt eventuele
instellingen in de functionaliteitsgebieden <B>DEB_BUILD_OPTIONS</B>. Zie het
onderdeel <B>FUNCTIONALITEITSGEBIEDEN</B> voor de details.
<DT id="69"><B>DEB_VENDOR</B><DD>
Deze instelling definieert de huidige leverancier. Indien zij niet ingesteld
is, zal gezocht worden naar de huidige leverancier door te gaan lezen in
<B>/etc/dpkg/origins/default</B>.
<DT id="70"><B>DEB_BUILD_PATH</B><DD>
Deze variabele stelt in welk bouwpad (sinds dpkg 1.18.8) gebruikt moet
worden bij functionaliteit zoals <B>fixdebugpath</B> waardoor die gesuperviseerd
kan worden door het aanroepende programma. Momenteel is deze variabele
Debian- en derivaat-specifiek.
<DT id="71"><B>DPKG_COLORS</B><DD>
Stelt de kleurmodus in (sinds dpkg 1.18.5). Waarden die momenteel gebruikt
mogen worden zijn: <B>auto</B> (standaard), <B>always</B> en <B>never</B>.
<DT id="72"><B>DPKG_NLS</B><DD>
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: <B>0</B> and <B>1</B> (standaard).
</DL>
<A NAME="lbAN">&nbsp;</A>
<H2>BESTANDEN</H2>
<A NAME="lbAO">&nbsp;</A>
<H3>Configuratiebestanden</H3>
<DL COMPACT>
<DT id="73"><B>/etc/dpkg/buildflags.conf</B><DD>
Configuratiebestand dat voor het hele systeem geldt.
<DT id="74"><B>$XDG_CONFIG_HOME/dpkg/buildflags.conf</B> of <DD>
<B>$HOME/.config/dpkg/buildflags.conf</B>
Configuratiebestand dat gebruikersafhankelijk is.
</DL>
<A NAME="lbAP">&nbsp;</A>
<H3>Ondersteuning bij het maken van een pakket</H3>
<DL COMPACT>
<DT id="75"><B>/usr/share/dpkg/buildflags.mk</B><DD>
Makefile-fragment dat alle vlaggen die door <B>dpkg-buildflags</B> ondersteund
worden, laadt in variabelen (en eventueel exporteert) (sinds dpkg 1.16.1).
</DL>
<A NAME="lbAQ">&nbsp;</A>
<H2>VOORBEELDEN</H2>
Om in een Makefile bouwvlaggen door te geven aan een bouwcommando:
<P>
<DL COMPACT><DT id="76"><DD>
<PRE>
$(MAKE) $(shell dpkg-buildflags --export=cmdline)
./configure $(shell dpkg-buildflags --export=cmdline)
</PRE>
</DL>
<P>
Om in een shell-script of shell-fragment bouwvlaggen in te stellen, kan
<B>eval</B> gebruikt worden om de uitvoer te interpreteren van en de vlaggen
naar de omgeving te exporteren:
<P>
<DL COMPACT><DT id="77"><DD>
<PRE>
eval &quot;$(dpkg-buildflags --export=sh)&quot; &amp;&amp; make
</PRE>
</DL>
<P>
of om de positieparameters in te stellen die aan een commando doorgegeven
moeten worden:
<P>
<DL COMPACT><DT id="78"><DD>
<PRE>
eval &quot;set -- $(dpkg-buildflags --export=cmdline)&quot;
for dir in a b c; do (cd $dir &amp;&amp; ./configure &quot;$@&quot; &amp;&amp; make); done
</PRE>
</DL>
<A NAME="lbAR">&nbsp;</A>
<H3>Het gebruik in debian/rules</H3>
Om de benodigde bouwvlaggen te bekomen die aan het bouwsysteem doorgegeven
moeten worden, moet u vanuit het bestand <B>debian/rules</B> <B>dpkg-buildflags</B>
aanroepen of <B>buildflags.mk</B> invoegen. Merk op dat oudere versies van
<B>dpkg-buildpackage</B> (voor dpkg 1.16.1) deze vlaggen automatisch
exporteerden. U zou hierop echter niet mogen betrouwen, aangezien dit het
handmatig aanroepen van <B>debian/rules</B> defect maakt.
<P>
Voor pakketten met een autoconf-achtig bouwsysteem, kunt u de relevante
opties rechtstreeks doorgeven aan configure of <B><A HREF="/cgi-bin/man/man2html?1+make">make</A></B>(1), zoals hiervoor
ge&iuml;llustreerd werd.
<P>
Voor andere bouwsystemen, of indien u een meer fijnmazige controle nodig
heeft over welke vlaggen waar doorgegeven worden, kunt u <B>--get</B>
gebruiken. Of in de plaats daarvan kunt u <B>buildflags.mk</B> invoegen, dat
zorgt voor het aanroepen van <B>dpkg-buildflags</B> en het opslaan van de
bouwvlaggen in variabelen voor make.
<P>
Indien u alle bouwvlaggen naar de omgeving wenst te exporteren (waar ze door
uw bouwsysteem opgepikt kunnen worden):
<P>
<DL COMPACT><DT id="79"><DD>
<PRE>
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk
</PRE>
</DL>
<P>
Als u bijkomende controle wenst over wat ge&euml;xporteerd wordt, kunt u de
variabelen handmatig exporteren (aangezien er standaard geen enkele
ge&euml;xporteerd wordt):
<P>
<DL COMPACT><DT id="80"><DD>
<PRE>
include /usr/share/dpkg/buildflags.mk
export CPPFLAGS CFLAGS LDFLAGS
</PRE>
</DL>
<P>
En u kunt de vlaggen natuurlijk ook handmatig doorgeven aan commando's:
<P>
<DL COMPACT><DT id="81"><DD>
<PRE>
include /usr/share/dpkg/buildflags.mk
build-arch:
$(CC) -o hello hello.c $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
</PRE>
</DL>
<P>
<HR>
<A NAME="index">&nbsp;</A><H2>Index</H2>
<DL>
<DT id="82"><A HREF="#lbAB">NAAM</A><DD>
<DT id="83"><A HREF="#lbAC">OVERZICHT</A><DD>
<DT id="84"><A HREF="#lbAD">BESCHRIJVING</A><DD>
<DT id="85"><A HREF="#lbAE">COMMANDO'S</A><DD>
<DT id="86"><A HREF="#lbAF">ONDERSTEUNDE VLAGGEN</A><DD>
<DT id="87"><A HREF="#lbAG">FUNCTIEGEBIEDEN</A><DD>
<DL>
<DT id="88"><A HREF="#lbAH">future</A><DD>
<DT id="89"><A HREF="#lbAI">qa (kwaliteitsbevordering)</A><DD>
<DT id="90"><A HREF="#lbAJ">sanitize (saneren)</A><DD>
<DT id="91"><A HREF="#lbAK">hardening (kwetsbaarheidsreductie)</A><DD>
<DT id="92"><A HREF="#lbAL">reproducible (reproduceerbaar)</A><DD>
</DL>
<DT id="93"><A HREF="#lbAM">OMGEVING</A><DD>
<DT id="94"><A HREF="#lbAN">BESTANDEN</A><DD>
<DL>
<DT id="95"><A HREF="#lbAO">Configuratiebestanden</A><DD>
<DT id="96"><A HREF="#lbAP">Ondersteuning bij het maken van een pakket</A><DD>
</DL>
<DT id="97"><A HREF="#lbAQ">VOORBEELDEN</A><DD>
<DL>
<DT id="98"><A HREF="#lbAR">Het gebruik in debian/rules</A><DD>
</DL>
</DL>
<HR>
This document was created by
<A HREF="/cgi-bin/man/man2html">man2html</A>,
using the manual pages.<BR>
Time: 00:06:19 GMT, March 31, 2021
</BODY>
</HTML>