| dpkg-buildflags(1) | dpkg suite | dpkg-buildflags(1) |
نام (NAME)
dpkg-buildflags - بازگرداندن پرچمهای ساخت جهت استفاده در هنگام ساخت بستهها
خلاصه دستور (SYNOPSIS)
dpkg-buildflags [گزینه...] [دستور]
توضیحات (DESCRIPTION)
ابزار dpkg-buildflags ابزاری برای بازیابی پرچمهای کامپایل جهت استفاده در زمان ساخت بستههای دبیان است.
پرچمهای پیشفرض توسط توزیعکننده (vendor) تعریف میشوند، اما میتوان آنها را به چندین روش گسترش داد یا بازنویسی کرد:
- 1.
- در سطح کل سیستم با /etc/dpkg/buildflags.conf؛
- 2.
- برای کاربر جاری با $XDG_CONFIG_HOME/dpkg/buildflags.conf که در آن مقدار پیشفرض $XDG_CONFIG_HOME برابر با $HOME/.config است؛
- 3.
- به صورت موقت توسط کاربر با استفاده از متغیرهای محیطی (بخش «محیط (ENVIRONMENT)» را ببینید)؛
- 4.
- به صورت پویا توسط نگهدارندهٔ بسته با متغیرهای محیطی تنظیمشده از طریق debian/rules (بخش «محیط (ENVIRONMENT)» را ببینید).
پروندههای پیکربندی میتوانند شامل چهار نوع دستورالعمل (directive) باشند:
- SET flag value
- بازنویسی پرچم با نام flag برای داشتن مقدار value.
- STRIP flag value
- حذف تمام پرچمهای ساخت فهرستشده در value از پرچم با نام flag. از نسخهٔ dpkg 1.16.1 به بعد.
- APPEND flag value
- گسترش پرچم با نام flag از طریق افزودن گزینههای دادهشده در value به انتهای آن. در صورتی که مقدار فعلی پرچم خالی نباشد، یک فاصله به ابتدای مقدار اضافهشونده افزوده میشود.
- PREPEND flag value
- گسترش پرچم با نام flag از طریق افزودن گزینههای دادهشده در value به ابتدای آن. در صورتی که مقدار فعلی پرچم خالی نباشد، یک فاصله به انتهای مقدار اضافهشونده افزوده میشود. از نسخهٔ dpkg 1.16.1 به بعد.
پروندههای پیکربندی میتوانند در خطوطی که با علامت هش (#) آغاز میشوند شامل توضیحات (کامنت) باشند. خطوط خالی نیز نادیده گرفته میشوند.
این برنامه در dpkg 1.15.7 معرفی شد.
دستورها (COMMANDS)
- --dump
- چاپ تمام پرچمهای کامپایل و مقادیر آنها در خروجی استاندارد. در هر خط یک پرچم چاپ میشود که با علامت مساوی از مقدار خود جدا شده است (“flag=value”). این رفتار پیشفرض است.
- --list
- چاپ فهرست پرچمهای پشتیبانیشده توسط توزیعکنندهٔ فعلی (در هر خط یکی). برای اطلاعات بیشتر دربارهٔ آنها بخش «پرچمهای پشتیبانیشده (SUPPORTED FLAGS)» را ببینید.
- --status
- نمایش
هرگونه
اطلاعاتی
که برای
توضیح
رفتار dpkg-buildflags
مفید باشد
(از نسخهٔ dpkg 1.16.5
به بعد):
متغیرهای
محیطی
مرتبط،
توزیعکنندهٔ
فعلی،
وضعیت تمام
پرچمهای
ویژگیها.
همچنین
پرچمهای
کامپایلر
حاصل را به
همراه منشأ
آنها چاپ
میکند.
این دستور برای اجرا از درون debian/rules در نظر گرفته شده است تا لاگ ساخت رد مشخصی از پرچمهای ساخت مورد استفاده را نگه دارد. این میتواند برای عیبیابی مشکلات مرتبط با آنها مفید باشد.
- --export=format
- چاپ دستوراتی در خروجی استاندارد که میتوانند برای صادر کردن تمام پرچمهای کامپایل برای ابزاری خاص استفاده شوند. اگر مقدار format داده نشود، sh فرض میشود. تنها پرچمهای کامپایلی که با یک حرف بزرگ آغاز میشوند گنجانده میشوند، فرض بر این است که سایر پرچمها برای محیط مناسب نیستند. قالبهای پشتیبانیشده:
- sh
- دستورات پوسته برای تنظیم و صادر کردن تمام پرچمهای کامپایل در محیط. مقادیر پرچمها درون نقلقول قرار میگیرند تا خروجی برای ارزیابی توسط یک پوسته آماده باشد.
- cmdline
- آرگومانهایی برای ارسال به خط فرمان برنامهٔ ساخت جهت استفاده از تمام پرچمهای کامپایل (از نسخهٔ dpkg 1.17.0 به بعد). مقادیر پرچمها طبق نحو پوسته نقلقول میشوند.
- configure
- این یک نام مستعار قدیمی (legacy) برای cmdline است.
- make
- دستورالعملهای Make برای تنظیم و صادر کردن تمام پرچمهای کامپایل در محیط. خروجی را میتوان در یک قطعهکد Makefile نوشت و با استفاده از دستورالعمل include ارزیابی کرد.
- --get flag
- چاپ مقدار پرچم در خروجی استاندارد. اگر پرچم شناختهشده باشد با کد ۰ و در غیر این صورت با کد ۱ خارج میشود.
- --origin flag
- چاپ منشأ مقداری که توسط --get بازگردانده میشود. اگر پرچم شناختهشده باشد با کد ۰ و در غیر این صورت با کد ۱ خارج میشود. منشأ میتواند یکی از مقادیر زیر باشد:
- --query
- چاپ هر
اطلاعاتی
که بتواند
برای توضیح
رفتار
برنامه
مفید باشد:
توزیعکنندهٔ
فعلی،
متغیرهای
محیطی
مرتبط،
نواحی
ویژگیها،
وضعیت تمام
پرچمهای
ویژگی،
اینکه آیا
یک ویژگی به
عنوان
پیشفرض
توکار توسط
کامپایلر
مدیریت
میشود یا
خیر (از
نسخهٔ dpkg 1.21.14 به
بعد)، و
پرچمهای
کامپایلر
به همراه
منشأ آنها
(از نسخهٔ dpkg 1.19.0
به بعد).
به عنوان مثال:
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=2 Origin: vendor
- --query-features area
- چاپ
ویژگیهای
فعالشده
برای یک
ناحیهٔ
مشخص (از
نسخهٔ dpkg 1.16.2 به
بعد). اگر
این ویژگی
(حتی اگر
فقط در برخی
معماریها)
به عنوان
پیشفرض
توکار توسط
کامپایلر
مدیریت
شود، یک
فیلد Builtin چاپ
میشود (از
نسخهٔ dpkg 1.21.14 به
بعد). برای
جزئیات
بیشتر
دربارهٔ
نواحی
شناختهشده
فعلی، بخش
«نواحی
ویژگیها (FEATURE
AREAS)» را
ببینید. اگر
ناحیه
شناختهشده
باشد با کد
۰ و در غیر
این صورت با
کد ۱ خارج
میشود.
خروجی در قالب RFC822 است، با یک بخش برای هر ویژگی. به عنوان مثال:
Feature: pie Enabled: yes Builtin: yes Feature: stackprotector Enabled: yes
- --help
- نمایش پیام راهنمای نحوهٔ استفاده و خروج.
- --version
- نمایش نسخه و خروج.
پرچمهای پشتیبانیشده (SUPPORTED FLAGS)
- ASFLAGS
- گزینههای اسمبلر میزبان (host). مقدار پیشفرض: خالی. از نسخهٔ dpkg 1.21.0 به بعد.
- CFLAGS
- گزینههای کامپایلر C میزبان. مقدار پیشفرض تنظیمشده توسط توزیعکننده شامل -g و سطح بهینهسازی پیشفرض (معمولاً -O2، یا -O0 اگر متغیر محیطی DEB_BUILD_OPTIONS مقدار noopt را تعریف کرده باشد) است.
- CPPFLAGS
- گزینههای پیشپردازندهٔ C میزبان. مقدار پیشفرض: خالی.
- CXXFLAGS
- گزینههای کامپایلر ++C میزبان. مشابه CFLAGS.
- OBJCFLAGS
- گزینههای کامپایلر Objective C میزبان. مشابه CFLAGS. از نسخهٔ dpkg 1.17.7 به بعد.
- OBJCXXFLAGS
- گزینههای کامپایلر ++Objective C میزبان. مشابه CXXFLAGS. از نسخهٔ dpkg 1.17.7 به بعد.
- DFLAGS
- گزینههای کامپایلر D میزبان (ldc یا gdc). از نسخهٔ dpkg 1.20.6 به بعد.
- FFLAGS
- گزینههای کامپایلر Fortran 77 میزبان. زیرمجموعهای از CFLAGS.
- FCFLAGS
- گزینههای کامپایلر Fortran 9x میزبان. مشابه FFLAGS. از نسخهٔ dpkg 1.17.7 به بعد.
- LDFLAGS
- گزینههای
ارسالشده
به
کامپایلر
میزبان
هنگام
پیوند دادن
(linking)
پروندههای
اجرایی یا
اشیای
اشتراکی (shared objects).
نکته: ارسال مستقیم این متغیر به ld(1) امن نیست، اما اگر در هر صورت لازم است این متغیر ارسال شود، این گزینهها باید پالایش (sanitize) شوند تا فقط گزینههایی که عملکرد آنها تضمین شده است مجاز باشند. بهطور کلی گزینههای -Wl، -l و -L باید امن باشند، که در آن -Wl حذف شده و , در آرگومانهای آن با فاصله جایگزین میشود. اما اینکه آیا هر گزینهٔ پالایششدهای برای ارسال امن است یا خیر، به معناشناسی مورد نظر در فراخوانی ld(1) بستگی دارد.
مقدار پیشفرض: خالی.
- ASFLAGS_FOR_BUILD
- گزینههای اسمبلر ساخت (build). مقدار پیشفرض: خالی. از نسخهٔ dpkg 1.22.1 به بعد.
- CFLAGS_FOR_BUILD
- گزینههای کامپایلر C ساخت. مقدار پیشفرض تنظیمشده توسط توزیعکننده شامل -g و سطح بهینهسازی پیشفرض (معمولاً -O2، یا -O0 اگر متغیر محیطی DEB_BUILD_OPTIONS مقدار noopt را تعریف کرده باشد) است. از نسخهٔ dpkg 1.22.1 به بعد.
- CPPFLAGS_FOR_BUILD
- گزینههای پیشپردازندهٔ C ساخت. مقدار پیشفرض: خالی. از نسخهٔ dpkg 1.22.1 به بعد.
- CXXFLAGS_FOR_BUILD
- گزینههای کامپایلر ++C ساخت. مشابه CFLAGS_FOR_BUILD. از نسخهٔ dpkg 1.22.1 به بعد.
- OBJCFLAGS_FOR_BUILD
- گزینههای کامپایلر Objective C ساخت. مشابه CFLAGS_FOR_BUILD. از نسخهٔ dpkg 1.22.1 به بعد.
- OBJCXXFLAGS_FOR_BUILD
- گزینههای کامپایلر ++Objective C ساخت. مشابه CXXFLAGS_FOR_BUILD. از نسخهٔ dpkg 1.22.1 به بعد.
- DFLAGS_FOR_BUILD
- گزینههای کامپایلر D ساخت (ldc یا gdc). از نسخهٔ dpkg 1.22.1 به بعد.
- FFLAGS_FOR_BUILD
- گزینههای کامپایلر Fortran 77 ساخت. زیرمجموعهای از CFLAGS_FOR_BUILD. از نسخهٔ dpkg 1.22.1 به بعد.
- FCFLAGS_FOR_BUILD
- گزینههای کامپایلر Fortran 9x ساخت. مشابه FFLAGS_FOR_BUILD. از نسخهٔ dpkg 1.22.1 به بعد.
- LDFLAGS_FOR_BUILD
- گزینههای
ارسالشده
به
کامپایلر
ساخت هنگام
پیوند دادن
پروندههای
اجرایی یا
اشیای
اشتراکی.
نکته: ارسال مستقیم این متغیر به ld(1) امن نیست، اما اگر در هر صورت لازم است این متغیر ارسال شود، این گزینهها باید پالایش شوند تا تنها گزینههای شناختهشده و کارآمد مجاز باشند. بهطور کلی گزینههای -Wl، -l و -L باید امن باشند، که در آن -Wl حذف شده و , در آرگومانهای آن با فاصله جایگزین میشود. اما اینکه آیا هر گزینهٔ پالایششدهای برای ارسال امن است یا خیر، به معناشناسی مورد نظر در فراخوانی ld(1) بستگی دارد.
مقدار پیشفرض: خالی.
از نسخهٔ dpkg 1.22.1 به بعد.
در صورت نیاز در آینده ممکن است پرچمهای جدیدی اضافه شوند (برای مثال جهت پشتیبانی از زبانهای دیگر).
نواحی ویژگیها (FEATURE AREAS)
نواحی ویژگیها در حال حاضر وابسته به توزیعکننده هستند و موارد شرح داده شده در زیر تنها در دبیان و مشتقات آن شناخته میشوند.
هر ویژگی در یک ناحیه را میتوان در مقدار ناحیه در متغیرهای محیطی DEB_BUILD_OPTIONS و DEB_BUILD_MAINT_OPTIONS با علامتهای اصلاحکنندهٔ ‘+’ و ‘-’ فعال یا غیرفعال کرد. طبق نحو عمومی این متغیرها (توضیح داده شده در dpkg-buildpackage(1))، میتوان چندین ناحیهٔ ویژگی را با فاصله از یکدیگر مشخص کرد، به طوری که هر یک مشخصکنندههای ویژگی را به عنوان پارامترهای اجباری پس از علامت مساوی (‘=’) دریافت میکنند. مشخصکنندههای ویژگی با کاما از هم جدا شده و از چپ به راست تحلیل میشوند، به طوری که تنظیمات درون همان مشخصکنندهٔ ویژگی موارد قبلی را بازنویسی میکنند، حتی اگر مشخصکنندههای ویژگی در چندین تنظیم جداشده با فاصله برای یک ناحیه تقسیم شده باشند.
برای مثال، برای فعال کردن ویژگی “pie” و غیرفعال کردن ویژگی “fortify” در ناحیهٔ hardening میتوانید این کار را در debian/rules انجام دهید:
export DEB_BUILD_MAINT_OPTIONS = hardening=+pie,-fortify
ویژگی ویژهٔ all (معتبر در هر ناحیهای) میتواند برای فعال یا غیرفعال کردن تمام ویژگیهای یک ناحیه به طور همزمان استفاده شود. بنابراین، غیرفعال کردن همه چیز در ناحیهٔ hardening و تنها فعال کردن “format” و “fortify” میتواند با دستور زیر انجام شود:
export DEB_BUILD_MAINT_OPTIONS = hardening=-all,+format,+fortify
چندین ناحیهٔ ویژگی را میتوان تنظیم کرد:
export DEB_BUILD_MAINT_OPTIONS = hardening=+pie abi=+lfs
رفتار بازنویسی همانطور که برای ویژگیهای خاص اعمال میشود برای ویژگی ویژهٔ all نیز صدق میکند، که این امر امکان ترکیب آنها را فراهم میسازد. بنابراین برای فعال کردن “lfs” در ناحیهٔ abi، و فقط “pie” و “fortify” در ناحیهٔ hardening، اما “format” تنها زمانی که CONDITION تعریف شده باشد، میتوان بدین صورت عمل کرد:
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
چندین گزینهٔ زمان کامپایل (با جزئیات در زیر) میتوانند برای فعالسازی ویژگیهایی که میتوانند ABI یک بسته را تغییر دهند استفاده شوند، اما به دلایل سازگاری عقروعطف (backwards compatibility) به صورت پیشفرض فعال نمیشوند مگر اینکه هماهنگ شده یا به صورت جداگانه بررسی شوند.
- lfs
- این تنظیم
(از نسخهٔ dpkg
1.22.0؛ به صورت
پیشفرض
غیرفعال)
پشتیبانی
از
پروندههای
حجیم (Large File Support یا LFS)
را در
معماریهای
۳۲ بیتی که ABI
آنها به
صورت
پیشفرض
شامل LFS
نیست، با
افزودن -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64 به CPPFLAGS
فعال
میکند.
هنگامی که این ویژگی فعال شود، مقدار همان ویژگی در ناحیهٔ ویژگیهای future را بازنویسی خواهد کرد.
- time64
- این تنظیم
(از نسخهٔ dpkg
1.22.0؛ به صورت
پیشفرض
فعال به جز
برای i386 و hurd-i386 از
نسخهٔ dpkg 1.22.5 به
بعد)
پشتیبانی
از time_t شصت و
چهار بیتی
را در
معماریهای
۳۲ بیتی که ABI
آنها به
صورت
پیشفرض
فاقد آن
است، با
افزودن -D_TIME_BITS=64
به CPPFLAGS فعال
میکند. این
تنظیم به
صورت
خودکار
ویژگی lfs را
از ناحیهٔ
ویژگیهای
abi فعال
میسازد.
اگر این تنظیم به صورت صریح فعال شود، در تمامی معماریها از جمله i386 (به جز hurd-i386 که هستهٔ آن فاقد رابطهای time64 است) بدون توجه به پیشفرض سازگاری عقروعطف باینری فعال میشود.
همچنین این ویژگی توسط gcc به طور پیشفرض روی معماریهای دبیان armel، armhf، hppa، m68k، mips، mipsel، powerpc و sh4 فعال است، که در آنها غیرفعال کردن ویژگی به جای آن عبارت -U_LARGEFILE_SOURCE -U_FILE_OFFSET_BITS -U_TIME_BITS را به CPPFLAGS اضافه میکند.
future
چندین گزینهٔ زمان کامپایل (با جزئیات در زیر) میتوانند برای فعالسازی ویژگیهایی استفاده شوند که باید به صورت پیشفرض فعال باشند، اما به دلایل سازگاری عقروعطف امکانپذیر نیست.
- lfs
- این تنظیم (از نسخهٔ dpkg 1.19.0؛ به صورت پیشفرض غیرفعال) اکنون یک نام مستعار برای ویژگی lfs در ناحیهٔ abi است؛ به جای آن از مورد مذکور استفاده کنید. ویژگی ناحیهٔ abi این تنظیم را بازنویسی میکند.
qa
چندین گزینهٔ زمان کامپایل (با جزئیات در زیر) میتوانند برای کمک به تشخیص مشکلات در کد منبع یا سیستم ساخت استفاده شوند.
- bug-implicit-func
- این تنظیم (از نسخهٔ dpkg 1.22.3؛ به صورت پیشفرض فعال از نسخهٔ dpkg 1.22.6 به بعد) گزینهٔ -Werror=implicit-function-declaration را به CFLAGS اضافه میکند.
- bug
- این تنظیم
(از نسخهٔ dpkg
1.17.4؛ به صورت
پیشفرض
غیرفعال) هر
گزینهٔ
هشداری را
که کدهای
منبع
مشکلدار
را به طور
قابل
اعتمادی
تشخیص
میدهد
اضافه
میکند. این
هشدارها
مهلک (fatal)
هستند. تنها
پرچمهای
پشتیبانیشده
در حال حاضر
CFLAGS و CXXFLAGS با
پرچمهای
تنظیمشده
روی -Werror=array-bounds،
-Werror=clobbered،
-Werror=implicit-function-declaration و
-Werror=volatile-register-var
میباشند.
این ویژگی در صورتی که گزینهٔ bug-implicit-func مشخص نشده باشد، -Werror=implicit-function-declaration را از طریق آن مدیریت میکند.
- canary
- این تنظیم (از نسخهٔ dpkg 1.17.14؛ به صورت پیشفرض غیرفعال) گزینههای ساختگی قناری (canary) را به پرچمهای ساخت اضافه میکند تا لاگهای ساخت را بتوان برای چگونگی انتشار پرچمهای ساخت بررسی کرد و امکان یافتن هرگونه حذف تصادفی تنظیمات عادی پرچمهای ساخت فراهم شود. تنها پرچمهای پشتیبانیشده در حال حاضر CPPFLAGS، CFLAGS، OBJCFLAGS، CXXFLAGS و OBJCXXFLAGS با پرچمهای تنظیمشده روی -D__DEB_CANARY_flag_random-id__، و LDFLAGS تنظیمشده روی -Wl,-z,deb-canary-random-id هستند.
optimize
چندین گزینهٔ زمان کامپایل (با جزئیات در زیر) میتوانند برای کمک به بهینهسازی باینری نهایی استفاده شوند (از نسخهٔ dpkg 1.21.0 به بعد). نکته: فعالسازی all (همهٔ) این گزینهها میتواند منجر به مصنوعات باینری غیرقابل بازتولید شود.
- lto
- این تنظیم (از نسخهٔ dpkg 1.21.0؛ به صورت پیشفرض غیرفعال) بهینهسازی زمان پیوند (Link Time Optimization) را با افزودن -flto=auto -ffat-lto-objects به CFLAGS، CXXFLAGS، OBJCFLAGS، OBJCXXFLAGS، FFLAGS، FCFLAGS و LDFLAGS فعال میسازد.
sanitize
چندین گزینهٔ زمان کامپایل (با جزئیات در زیر) میتوانند برای کمک به پاکسازی (sanitize) باینری نهایی در برابر خرابیهای حافظه، نشت حافظه، استفاده پس از آزادسازی (use-after-free)، تداخلات دادهای ریس رشتهها (threading data races) و باگهای رفتار تعریفنشده استفاده شوند. نکته: این گزینهها نباید not برای ساختهای محیط عملیاتی (production) استفاده شوند، زیرا میتوانند قابلیت اطمینان کد استاندارد را کاهش دهند و امنیت یا حتی کارایی را مختل کنند.
- address
- این تنظیم (از نسخهٔ dpkg 1.18.0؛ به صورت پیشفرض غیرفعال) گزینهٔ -fsanitize=address را به LDFLAGS و -fsanitize=address -fno-omit-frame-pointer را به CFLAGS و CXXFLAGS اضافه میکند.
- thread
- این تنظیم (از نسخهٔ dpkg 1.18.0؛ به صورت پیشفرض غیرفعال) گزینهٔ -fsanitize=thread را به CFLAGS، CXXFLAGS و LDFLAGS اضافه میکند.
- leak
- این تنظیم (از نسخهٔ dpkg 1.18.0؛ به صورت پیشفرض غیرفعال) گزینهٔ -fsanitize=leak را به LDFLAGS اضافه میکند. اگر ویژگیهای address یا thread فعال باشند، این تنظیم به طور خودکار غیرفعال میشود چون این ویژگیها متضمن آن هستند.
- undefined
- این تنظیم (از نسخهٔ dpkg 1.18.0؛ به صورت پیشفرض غیرفعال) گزینهٔ -fsanitize=undefined را به CFLAGS، CXXFLAGS و LDFLAGS اضافه میکند.
hardening
چندین گزینهٔ زمان کامپایل (با جزئیات در زیر) میتوانند برای کمک به امنسازی (hardening) باینری نهایی در برابر حملات خرابی حافظه، یا ارائهٔ پیامهای هشدار اضافی در زمان کامپایل استفاده شوند. به جز موارد ذکر شده در زیر، این گزینهها برای معماریهایی که از آنها پشتیبانی میکنند به صورت پیشفرض فعال هستند.
- format
- این تنظیم (از نسخهٔ dpkg 1.16.1؛ به صورت پیشفرض فعال) گزینهٔ -Wformat -Werror=format-security را به CFLAGS، CXXFLAGS، OBJCFLAGS و OBJCXXFLAGS اضافه میکند. این گزینه دربارهٔ استفادههای نادرست از رشتههای قالببندی هشدار میدهد و هنگامی که توابع قالببندی به شیوهای استفاده شوند که مشکلات امنیتی احتمالی ایجاد کند با شکست مواجه میشود. در حال حاضر، این تنظیم دربارهٔ فراخوانیهای توابع printf و scanf که در آنها رشتهٔ قالببندی یک رشتهٔ لفظی (literal) نیست و هیچ آرگومان قالببندی وجود ندارد هشدار میدهد؛ مانند printf(foo); به جای printf("%s", foo);. اگر رشتهٔ قالببندی از یک ورودی غیرقابل اعتماد آمده باشد و شامل ‘%n’ باشد، این مورد میتواند یک حفرهٔ امنیتی باشد.
- fortify
- این تنظیم
(از نسخهٔ dpkg
1.16.1؛ به صورت
پیشفرض
فعال)
گزینهٔ
-D_FORTIFY_SOURCE=2 را به
CPPFLAGS اضافه
میکند. در
طول تولید
کد،
کامپایلر
اطلاعات
زیادی
دربارهٔ
اندازههای
بافر (در
صورت امکان)
میداند و
تلاش
میکند تا
فراخوانیهای
ناامن
توابع با
بافر با طول
نامحدود را
با توابع
دارای طول
محدود
جایگزین
کند. این
قابلیت
بهویژه
برای کدهای
قدیمی و
فرسوده
مفید است.
علاوه بر
این،
رشتههای
قالببندی
موجود در
حافظهٔ
قابل نوشتن
که شامل ‘%n’
هستند
مسدود
میشوند.
اگر
برنامهای
به چنین
رشتهٔ
قالبی
وابسته
باشد، باید
راهکاری
جایگزین
برای آن در
نظر گرفته
شود.
توجه داشته باشید برای اینکه این گزینه اثری داشته باشد، کد منبع باید با -O1 یا بالاتر کامپایل شود. اگر متغیر محیطی DEB_BUILD_OPTIONS شامل noopt باشد، به دلیل هشدارهای جدیدی که توسط glibc نسخهٔ 2.16 و بالاتر صادر میشود، پشتیبانی از fortify غیرفعال خواهد شد.
- stackprotector
- این تنظیم
(از نسخهٔ dpkg
1.16.1؛ در صورت
عدم
استفاده از
stackprotectorstrong به صورت
پیشفرض
فعال است)
گزینهٔ -fstack-protector
--param=ssp-buffer-size=4 را به
CFLAGS، CXXFLAGS، OBJCFLAGS،
OBJCXXFLAGS، FFLAGS و FCFLAGS
اضافه
میکند. این
امر
بررسیهای
ایمنی در
برابر
رونویسی
پشته (stack overwrite) را
اضافه
میکند. این
ویژگی
بسیاری از
حملات
بالقوهٔ
تزریق کد را
به
وضعیتهای
توقف
برنامه (abort)
تبدیل
میکند. در
بهترین
حالت، این
گزینه
آسیبپذیریهای
تزریق کد را
به انکار
سرویس (DoS) یا
به مواردی
بیاثر
(بسته به
برنامه)
تبدیل
میکند.
این ویژگی نیازمند پیوند دادن به glibc (یا ارائهدهندهٔ دیگری از __stack_chk_fail) است، بنابراین هنگام ساخت با -nostdlib یا -ffreestanding یا موارد مشابه باید غیرفعال شود.
- stackprotectorstrong
- این تنظیم
(از نسخهٔ dpkg
1.17.11؛ به صورت
پیشفرض
فعال)
گزینهٔ
-fstack-protector-strong را به
CFLAGS، CXXFLAGS، OBJCFLAGS،
OBJCXXFLAGS، FFLAGS و FCFLAGS
اضافه
میکند. این
یک نوع
قویتر از
stackprotector است،
اما بدون
افت عملکرد
قابل توجه.
غیرفعال کردن stackprotector این تنظیم را نیز غیرفعال میکند.
این ویژگی همان نیازمندیهای stackprotector را دارد، و علاوه بر آن به gcc نسخهٔ 4.9 یا بالاتر نیاز دارد.
- stackclash
- این تنظیم (از نسخهٔ dpkg 1.22.0؛ به صورت پیشفرض فعال) گزینهٔ -fstack-clash-protection را در معماریهای amd64، arm64، armhf و armel به CFLAGS، CXXFLAGS، OBJCFLAGS، OBJCXXFLAGS، FFLAGS و FCFLAGS اضافه میکند. این ویژگی کدی برای جلوگیری از حملات به سبک تداخل پشته (stack clash) اضافه میکند.
- branch
- این تنظیم (از نسخهٔ dpkg 1.22.0؛ به صورت پیشفرض فعال) گزینهٔ -fcf-protection را روی amd64 و -mbranch-protection=standard را روی arm64 به CFLAGS، CXXFLAGS، OBJCFLAGS، OBJCXXFLAGS، FFLAGS و FCFLAGS اضافه میکند. این ویژگی حفاظت از شاخه را به فراخوانیهای غیرمستقیم، پرشها و بازگشتها اضافه میکند تا معتبر بودن آنها در زمان اجرا بررسی شود.
- relro
- این تنظیم (از نسخهٔ dpkg 1.16.1؛ به صورت پیشفرض فعال) گزینهٔ -Wl,-z,relro را به LDFLAGS اضافه میکند. در هنگام بارگذاری برنامه، چندین بخش حافظهٔ ELF باید توسط پیونددهنده نوشته شوند. این گزینه به بارگذار علامت میدهد که این بخشها را پیش از واگذاری کنترل به برنامه، به حالت فقطخواندنی درآورد. بهویژه این ویژگی از حملات رونویسی GOT جلوگیری میکند. اگر این گزینه غیرفعال شود، bindnow نیز غیرفعال خواهد شد.
- bindnow
- این تنظیم (از نسخهٔ dpkg 1.16.1؛ به صورت پیشفرض غیرفعال) گزینهٔ -Wl,-z,now را به LDFLAGS اضافه میکند. در هنگام بارگذاری برنامه، تمام نمادهای پویا حل میشوند و امکان علامتگذاری کل PLT به عنوان فقطخواندنی (به دلیل relro در بالا) فراهم میشود. اگر relro فعال نباشد، این گزینه نمیتواند فعال شود.
- pie
- این تنظیم
(از نسخهٔ dpkg
1.16.1؛ بدون
پیشفرض
سراسری از
نسخهٔ dpkg 1.18.23 به
بعد، چرا که
اکنون به
صورت
پیشفرض
توسط gcc در
معماریهای
دبیان amd64، arm64،
armel، armhf، hurd-i386، i386، mips،
mipsel، mips64el، powerpc، ppc64،
ppc64el، riscv64، s390x، sparc و sparc64
فعال است)
گزینههای
لازم را
برای فعال
یا غیرفعال
کردن PIE از
طریق
پروندههای
مشخصات (specs)
کامپایلر gcc
اضافه
میکند،
بسته به
اینکه gcc در
آن معماری
خودش
پرچمها را
تزریق
میکند یا
خیر. هنگامی
که این
تنظیم فعال
باشد و gcc
پرچمها را
تزریق کند،
چیزی اضافه
نمیکند.
هنگامی که
این تنظیم
فعال باشد و
gcc پرچمها
را تزریق
نکند،
گزینهٔ -fPIE
(از طریق
/usr/share/dpkg/pie-compiler.specs) را
به CFLAGS، CXXFLAGS،
OBJCFLAGS، OBJCXXFLAGS، FFLAGS و
FCFLAGS، و
گزینهٔ -fPIE -pie
(از طریق
/usr/share/dpkg/pie-link.specs) را به
LDFLAGS اضافه
میکند.
هنگامی که
این تنظیم
غیرفعال
باشد و gcc
پرچمها را
تزریق کند،
گزینهٔ -fno-PIE
(از طریق
/usr/share/dpkg/no-pie-compile.specs) را
به CFLAGS، CXXFLAGS،
OBJCFLAGS، OBJCXXFLAGS، FFLAGS و
FCFLAGS، و
گزینهٔ -fno-PIE -no-pie
(از طریق
/usr/share/dpkg/no-pie-link.specs) را
به LDFLAGS اضافه
میکند.
اجرایی مستقل از موقعیت (Position Independent Executable یا PIE) برای بهرهبرداری از تصادفیسازی چیدمان فضای آدرس (Address Space Layout Randomization یا ASLR) که توسط برخی نسخههای هسته پشتیبانی میشود، مورد نیاز است. در حالی که ASLR از پیش میتواند برای نواحی داده در پشته و هیپ (brk و mmap) اعمال شود، نواحی کد باید به صورت مستقل از موقعیت کامپایل شوند. کتابخانههای اشتراکی از پیش این کار را انجام میدهند (-fPIC)، بنابراین به طور خودکار از ASLR بهرهمند میشوند، اما نواحی باینری text. برای به دست آوردن ASLR باید به عنوان PIE ساخته شوند. هنگامی که این اتفاق میافتد، حملات ROP (برنامهنویسی مبتنی بر بازگشت) بسیار دشوارتر میشوند زیرا در هنگام حملهٔ خرابی حافظه هیچ مکان ثابتی برای جهش وجود ندارد.
قابلیت PIE با -fPIC سازگار نیست، بنابراین به طور کلی هنگام ساخت اشیای اشتراکی باید دقت شود. اما از آنجا که پرچمهای PIE صادرشده از طریق پروندههای مشخصات gcc تزریق میشوند، تنظیم بدون قید و شرط آنها بدون توجه به نوع شیء در حال کامپایل یا پیوند باید همیشه امن باشد.
کتابخانههای ایستا میتوانند توسط برنامهها یا سایر کتابخانههای اشتراکی استفاده شوند. بسته به پرچمهای استفادهشده برای کامپایل تمام اشیا در یک کتابخانهٔ ایستا، این کتابخانهها توسط مجموعههای متفاوتی از اشیا قابل استفاده خواهند بود:
اگر نیازی به تنظیم دستی این پرچمها با دور زدن تزریق مشخصات gcc وجود داشته باشد، موارد متعددی باید در نظر گرفته شوند. ارسال بدون قید و شرط و صریح -fPIE، -fpie یا -pie به یک سیستم ساخت که از libtool استفاده میکند امن است زیرا این پرچمها هنگام ساخت کتابخانههای اشتراکی حذف خواهند شد. در غیر این صورت، در پروژههایی که هم برنامه و هم کتابخانههای اشتراکی را میسازند، ممکن است لازم باشد مطمئن شوید که هنگام ساخت کتابخانههای اشتراکی، -fPIC همیشه به عنوان آخرین گزینه به پرچمهای کامپایل مانند CFLAGS ارسال شود (تا هرگونه -PIE قبلی را بازنویسی کند)، و -shared به عنوان آخرین گزینه به پرچمهای پیوند مانند LDFLAGS ارسال شود (تا هرگونه -pie قبلی را بازنویسی کند). نکته: این کار نباید با سازوکار پیشفرض مشخصات gcc مورد نیاز باشد.
علاوه بر این، از آنجا که PIE از طریق یک ثبات عمومی پیادهسازی میشود، برخی معماریهای با کمبود ثبات (البته به جز i386 از زمان بهینهسازیهای پیادهسازیشده در gcc >= 5) میتوانند در بارهای کاری برنامههایی که بخش کد متنی سنگینی دارند تا ۱۵٪ افت کارایی داشته باشند؛ اکثر بارهای کاری کمتر از ۱٪ افت مشاهده میکنند. معماریهای دارای ثباتهای عمومی بیشتر (مانند amd64) جریمهٔ بدترین حالت به این بالایی را تجربه نمیکنند.
reproducible
گزینههای زمان کامپایل که در زیر به تفصیل آمدهاند میتوانند برای کمک به بهبود بازتولیدپذیری ساخت (build reproducibility) یا ارائهٔ پیامهای هشدار اضافی در هنگام کامپایل استفاده شوند. به جز موارد ذکر شده در زیر، این گزینهها برای معماریهایی که از آنها پشتیبانی میکنند به صورت پیشفرض فعال هستند.
- timeless
- این تنظیم (از نسخهٔ dpkg 1.17.14؛ به صورت پیشفرض فعال) گزینهٔ -Wdate-time را به CPPFLAGS اضافه میکند. این امر باعث ایجاد هشدار در هنگام استفاده از ماکروهای __TIME__، __DATE__ و __TIMESTAMP__ میشود.
- fixfilepath
- این تنظیم
(از نسخهٔ dpkg
1.19.1؛ به صورت
پیشفرض
فعال)
گزینهٔ
-ffile-prefix-map=BUILDPATH=. را
به CFLAGS، CXXFLAGS،
OBJCFLAGS، OBJCXXFLAGS، FFLAGS و
FCFLAGS اضافه
میکند، که
در آن BUILDPATH
برابر با
دایرکتوری
سطح بالای
بستهٔ در
حال ساخت
تنظیم
میشود. این
اثر باعث
حذف مسیر
ساخت از هر
پروندهٔ
تولیدشده
میشود.
اگر هر دو گزینهٔ fixdebugpath و fixfilepath تنظیم شده باشند، این گزینه اولویت دارد زیرا یک ابرمجموعه از گزینهٔ اول است.
نکته: اگر فرایند ساخت، پرچمهای ساخت را درون اشیای ساختهشده نهایی ذخیره کند، بسته غیرقابل بازتولید خواهد شد. و در حالی که غیرفعال کردن این گزینه ممکن است برخی از اشیا را مجدداً بازتولیدپذیر کند، این کار نیازمند غیرفعال کردن fixdebugpath نیز خواهد بود که ممکن است اشیای نمادهای اشکالزدایی تولیدشده را غیرقابل بازتولید کند. راهکار ایدهآل این است که ذخیرهسازی پرچمهای ساخت متوقف شود.
- fixdebugpath
- این تنظیم
(از نسخهٔ dpkg
1.18.5؛ به صورت
پیشفرض
فعال)
گزینهٔ
-fdebug-prefix-map=BUILDPATH=. را
به CFLAGS، CXXFLAGS،
OBJCFLAGS، OBJCXXFLAGS، FFLAGS و
FCFLAGS اضافه
میکند، که
در آن BUILDPATH
برابر با
دایرکتوری
سطح بالای
بستهٔ در
حال ساخت
تنظیم شده
است. این
اثر باعث
حذف مسیر
ساخت از
تمام
نمادهای
اشکالزدایی
تولیدشده
میشود.
نکته: این ویژگی دارای ویژگیهای بازتولیدپذیری مشابه با fixfilepath است.
محیط (ENVIRONMENT)
دو دسته از متغیرهای محیطی وجود دارند که عملیات مشابهی را انجام میدهند؛ دستهٔ اول (DEB_flag_op) هرگز نباید در درون debian/rules استفاده شود. این دسته برای هر کاربری است که میخواهد بستهٔ منبع را با پرچمهای ساخت متفاوتی دوباره بسازد. دستهٔ دوم (DEB_flag_MAINT_op) تنها باید در debian/rules توسط نگهدارندگان بسته برای تغییر پرچمهای ساخت نهایی استفاده شود.
- DEB_flag_SET
- DEB_flag_MAINT_SET (از نسخهٔ dpkg 1.16.1)
- این متغیر میتواند برای تحمیل مقدار بازگرداندهشده برای flag دادهشده استفاده شود.
- DEB_flag_STRIP (از نسخهٔ dpkg 1.16.1)
- DEB_flag_MAINT_STRIP (از نسخهٔ dpkg 1.16.1)
- این متغیر میتواند برای ارائهٔ فهرستی از گزینهها (جداشده با فاصله) استفاده شود که از مجموعهٔ پرچمهای بازگرداندهشده برای flag دادهشده حذف خواهند شد.
- DEB_flag_APPEND
- DEB_flag_MAINT_APPEND (از نسخهٔ dpkg 1.16.1)
- این متغیر میتواند برای افزودن گزینههای تکمیلی به انتهای مقدار بازگرداندهشده برای flag دادهشده استفاده شود.
- DEB_flag_PREPEND (از نسخهٔ dpkg 1.16.1)
- DEB_flag_MAINT_PREPEND (از نسخهٔ dpkg 1.16.1)
- این متغیر میتواند برای افزودن گزینههای تکمیلی به ابتدای مقدار بازگرداندهشده برای flag دادهشده استفاده شود.
- DEB_BUILD_OPTIONS
- DEB_BUILD_MAINT_OPTIONS (از نسخهٔ dpkg 1.16.1)
- این
متغیرها
میتوانند
توسط کاربر
یا
نگهدارنده
برای
غیرفعال/فعال
کردن
ویژگیهای
مختلف
نواحی که بر
پرچمهای
ساخت تأثیر
میگذارند
استفاده
شوند. متغیر
DEB_BUILD_MAINT_OPTIONS هر
تنظیمی را
در نواحی
ویژگیهای
DEB_BUILD_OPTIONS
بازنویسی
میکند.
برای
جزئیات
بیشتر بخش
«نواحی
ویژگیها (FEATURE
AREAS)» را
ببینید.
برخی از پروفایلهای ساخت ممکن است در حال حاضر نیازمند آن باشند که همتای آنها نیز در گزینههای ساخت گنجانده شود، فهرست چنین پروفایلهای ساختی وابسته به توزیعکننده است. برای اطلاعات بیشتر دربارهٔ پروفایلهای ساخت، dpkg-buildpackage(1) را ببینید.
- DEB_VENDOR
- این تنظیم، توزیعکنندهٔ فعلی را تعریف میکند. اگر تنظیم نشده باشد، توزیعکنندهٔ فعلی را با خواندن /etc/dpkg/origins/default شناسایی خواهد کرد.
- DEB_BUILD_PATH
- این متغیر مسیر ساخت را (از نسخهٔ dpkg 1.18.8 به بعد) برای استفاده در ویژگیهایی مانند fixdebugpath تنظیم میکند تا توسط فراخواننده قابل کنترل باشد. این متغیر در حال حاضر مختص دبیان و مشتقات آن است.
- DEB_HOST_ARCH
- معماری میزبان (host) را تنظیم میکند. این امر بر پرچمهای ساخت صادرشده تأثیر میگذارد، که معمولاً در هنگام کامپایل متقابل (cross-compiling) که در آن DEB_HOST_ARCH با DEB_BUILD_ARCH متفاوت است، کاربرد دارد.
- DPKG_COLORS
- حالت رنگ را تنظیم میکند (از نسخهٔ dpkg 1.18.5 به بعد). مقادیر پذیرفتهشده در حال حاضر عبارتند از: auto (پیشفرض)، always و never.
- DPKG_NLS
- در صورت تنظیم، برای تصمیمگیری در مورد فعالسازی پشتیبانی از زبان مادری (NLS)، که به عنوان پشتیبانی بینالمللیسازی (یا i18n) نیز شناخته میشود، استفاده خواهد شد (از نسخهٔ dpkg 1.19.0 به بعد). مقادیر پذیرفتهشده عبارتند از: 0 و 1 (پیشفرض).
فایلها (FILES)
پروندههای پیکربندی (Configuration files)
- /etc/dpkg/buildflags.conf
- پروندهٔ پیکربندی در سطح کل سیستم.
- $XDG_CONFIG_HOME/dpkg/buildflags.conf یا
- $HOME/.config/dpkg/buildflags.conf
- پروندهٔ پیکربندی کاربر.
پشتیبانی بستهبندی (Packaging support)
- /usr/share/dpkg/buildflags.mk
- قطعهکد Makefile که تمام پرچمهای پشتیبانیشده توسط dpkg-buildflags را در متغیرها بارگذاری میکند (و در صورت تمایل صادر مینماید) (از نسخهٔ dpkg 1.16.1 به بعد).
- /usr/share/dpkg/buildtools.mk
- قطعهکد Makefile که ابزارهای مناسب میزبان و ساخت را درون متغیرها تنظیم میکند (و در صورت تمایل آنها را صادر مینماید) (از نسخهٔ dpkg 1.19.0 به بعد).
مثالها (EXAMPLES)
برای ارسال پرچمهای ساخت به یک دستور ساخت درون یک Makefile:
$(MAKE) $(shell dpkg-buildflags --export=cmdline) ./configure $(shell dpkg-buildflags --export=cmdline)
برای تنظیم پرچمهای ساخت در یک اسکریپت شل یا قطعهکد پوسته، میتوان از eval برای تفسیر خروجی و صادر کردن پرچمها در محیط استفاده کرد:
eval "$(dpkg-buildflags --export=sh)" && make
یا برای تنظیم پارامترهای مکانی (positional) جهت ارسال به یک دستور:
eval "set -- $(dpkg-buildflags --export=cmdline)" for dir in a b c; do (cd $dir && ./configure "$@" && make); done
استفاده در debian/rules (Usage in debian/rules)
باید dpkg-buildflags را فراخوانی کنید یا buildflags.mk را از پروندهٔ debian/rules بگنجانید تا پرچمهای ساخت لازم برای ارسال به سیستم ساخت به دست آیند. توجه داشته باشید که نسخههای قدیمیتر dpkg-buildpackage (پیش از dpkg 1.16.1) این پرچمها را به طور خودکار صادر میکردند. با این حال، نباید به این موضوع اتکا کنید، زیرا این کار باعث اختلال در فراخوانی دستی debian/rules میشود.
برای بستههایی با سیستمهای ساخت مشابه autoconf، میتوانید گزینههای مربوطه را مستقیماً به configure یا make(1) همانطور که در بالا نشان داده شد ارسال کنید.
برای سایر سیستمهای ساخت، یا هنگامی که نیاز به کنترل دقیقتری در مورد اینکه کدام پرچمها به کجا ارسال شوند دارید، میتوانید از --get استفاده کنید. یا میتوانید به جای آن buildflags.mk را بگنجانید، که وظیفهٔ فراخوانی dpkg-buildflags و ذخیرهٔ پرچمهای ساخت در متغیرهای make را بر عهده دارد.
اگر میخواهید تمام پرچمهای ساخت را به متغیرهای محیطی صادر کنید (جایی که بتوانند توسط سیستم ساخت شما دریافت شوند):
DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/buildflags.mk
برای کنترل بیشتر روی آنچه صادر میشود، میتوانید متغیرها را به صورت دستی صادر کنید (زیرا هیچکدام به صورت پیشفرض صادر نمیشوند):
include /usr/share/dpkg/buildflags.mk export CPPFLAGS CFLAGS LDFLAGS
و البته میتوانید پرچمها را به صورت دستی به دستورها ارسال کنید:
include /usr/share/dpkg/buildflags.mk
build-arch:
$(CC) -o hello hello.c $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
| 2026-03-06 | 1.23.7-dirty |