Опции ARM компилятора GCC |
![]() |
Добавил(а) microsin |
Следующие опции, которые начинаются с префикса '-m', определены для порта ARM компилятора GCC: -mabi=name Генерирует код для указанного ABI [2]. Резрешенные значения для name: apcs-gnu, atpcs, aapcs, aapcs-linux и iwmmxt. -mapcs-frame Генерирует фрейм стека, своместимый с ARM Procedure Call Standard для всех функций, даже если для этого нет обязательной необходимости, чтобы код выполнялся корректно. Указание -fomit-frame-pointer с этой опцией приводит к тому, что для leaf-функций [8] фреймы стека не генерируются. По умолчанию используется -mno-apcs-frame. Эта опция является устаревшей. -mapcs Это синоним -mapcs-frame, и является устаревшей опцией. -mthumb-interwork Генерирует код, который поддерживает вызовы между наборами инструкций ARM и Thumb. Без этой опции на архитектурах до ARMv5 два набора инструкций ARM и Thumb нельзя надежно использовать внутри одной программы. По умолчанию используется -mno-thumb-interwork, что дает несколько больший объем кода в сравнении с использованием -mthumb-interwork. В конфигурациях AAPCS эта опция не имеет смысла. -mno-sched-prolog Предотвращает переупорядочивание инструкций в прологе функции, или объединение этих инструкций с инструкциями тела функции. Это означает, что все функции начинаются с распознаваемого набора инструкций (или фактически начинаются с одного из небольшого количества вариантов набора инструкций), и эта информация может использоваться для определения начала функций внутри исполняемой области кода. По умолчанию используется -msched-prolog. -mfloat-abi=name Указывает, какой использовать ABI для операций с плавающей запятой (floating-point). Возможные значения: soft, softfp и hard. Указание soft заставляет GCC генерировать вывод, содержащий вызовы библиотеки для операций с плавающей запятой. Вариант softfp позволяет генерацию кода, использующего аппаратные инструкции плавающей точки, но все еще используя соглашения о вызовах soft-float. Вариант hard позволяет генерировать инструкции floating-point, и использовать соглашения о вызовах, специфичные для конкретной реализации FPU. Умолчание здесь зависит от определенной конфигурации target (целевой архитектуры процессора). Имейте в виду, что hard-float и soft-float ABI не совместимы на уровне линковки; вы должны компилировать всю программу с одним и тем же ABI, и линковать свой код с совместимым набором библиотек. -mgeneral-regs-only Генерировать код, который использует только регистры общего назначения (general-purpose registers). Это не даст компилятору использовать регистры floating-point и Advanced SIMD, но не накладывает никакие подобные ограничения на код ассемблера. -mlittle-endian Генерирует код ля процессора, работающий в режиме little-endian [3]. Это умолчание для всех стандартных конфигураций. -mbig-endian Генерирует код ля процессора, работающий в режиме big-endian [3]. По умолчанию код компилируется для режима little-endian процессора. -mbe8 Когда линкуется образ big-endian, делает выбор между форматами BE8 и BE32 [3]. Эта опция не дает никакого эффекта для образов little-endian, и для таких образов игнорируется. Умолчание зависит от выбранной целевой архитектуры. Для ARMv6 и более свежих архитектур по умолчанию используется BE8, для более старых архитектур умолчание BE32. Формат BE32 для ARM считается устаревшим. -march=name[+extension…] Задает имя (name) для целевой архитектуры ARM. GCC использует это имя для определения вида инструкций кода ассемблера, которые нужно генерировать. Эта опция может использоваться вместе с опцией -mcpu= или вместо неё. Возможны следующие имена: armv4t, armv5t, armv5te, armv6, armv6j, armv6k, armv6kz, armv6t2, armv6z, armv6zk, armv7, armv7-a, armv7ve, armv8-a, armv8.1-a, armv8.2-a, armv8.3-a, armv8.4-a, armv8.5-a, armv8.6-a, armv9-a, armv7-r, armv8-r, armv6-m, armv6s-m, armv7-m, armv7e-m, armv8-m.base, armv8-m.main, armv8.1-m.main, armv9-a, iwmmxt и iwmmxt2. Дополнительно распознаются следующие архитектуры, в которых отсутствует поддержка состояния выполнения кода Thumb, однако их поддержка устаревает: armv4. Многие архитектуры поддерживают расширения. Они могут быть добавлены присоединением +extension (опция расширения) к имени архитектуры. Опции расширения обрабатываются по порядку, и их возможности накапливаются. Расширение будет также разрешать любые необходимые базовые расширения, от которых оно зависит. Например, расширение +crypto всегда разрешит расширение +simd. Имеется исключение их аддитивной конструкции для расширений с префиксом +no...: эти расширения запрещают указанную опцию расширения и любые другие расширения, от которых может зависеть присутствие этой опции расширения. Например, -march=armv7-a+simd+nofp+vfpv4 является эквивалентом -march=armv7-a+vfpv4, поскольку опция +simd полностью запрещена следующей за ней опцией +nofp. Большинство имен расширений традиционные и одинаковые, однако их эффект зависит от архитектуры, к которой расширение применяется. Например, опция +simd может быть применена к обоим архитектурам armv7-a и armv8-a, но для armv7-a будут разрешены оригинальный вариант расширений ARMv7-A Advanced SIMD (Neon), а для armv8-a вариант расширений ARMv8-A. Ниже во врезке перечислены поддерживаемые расширения для каждой архитектуры. Не упомянутые архитектуры не поддерживают какие-либо расширения. armv5te, armv6, armv6j, armv6k, armv6kz, armv6t2, armv6z, armv6zk +fp +nofp armv7 Общее подмножество архитектур ARMv7-A, ARMv7-R и ARMv7-M. +fp +nofp armv7-a +mp +sec +fp +simd +vfpv3 +vfpv3-d16-fp16 +vfpv3-fp16 +vfpv4-d16 +vfpv4 +neon-fp16 +neon-vfpv4 +nosimd +nofp armv7ve Расширенная версия архитектуры ARMv7-A с поддержкой виртуализации. +fp +simd +vfpv3-d16 +vfpv3 +vfpv3-d16-fp16 +vfpv3-fp16 +vfpv4-d16 +vfpv4 +neon +neon-fp16 +nosimd +nofp armv8-a +crc +simd +crypto +nocrypto +nofp +sb +predres armv8.1-a +simd +crypto +nocrypto +nofp +sb +predres armv8.2-a +fp16 +fp16fml +simd +crypto +dotprod +nocrypto +nofp +sb +predres +i8mm +bf16 armv8.4-a +fp16 +simd +crypto +nocrypto +nofp +sb +predres +i8mm +bf16 armv8.5-a +fp16 +simd +crypto +nocrypto +nofp +i8mm +bf16 armv7-r +fp.sp +fp +vfpv3xd-d16-fp16 +vfpv3-d16-fp16 +nofp +idiv +noidiv armv7e-m +fp +fpv5 +fp.dp +nofp armv8.1-m.main +dsp +mve +mve.fp +fp +fp.dp +nofp +cdecp0, +cdecp1, ... , +cdecp7 Разрешение расширения Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с числами в опциях диапазона 0 .. 7. armv8-m.main +dsp +nodsp +fp +fp.dp +nofp +cdecp0, +cdecp1, ... , +cdecp7 armv8-r +crc +fp.sp +simd +crypto +nocrypto +nofp -march=native Заставляет компилятор автоматически определять архитектуру компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и распознаются не все архитектуры. Если автодетект прошел неудачно, то эта опция не дает эффекта. -mtune=name Эта опция указывает имя целевого процессора (target), для которого GCC должен настроить производительность кода. С помощью этой опции для некоторых реализаций ARM может быть получена повышенная производительность. Разрешенные имена: arm7tdmi, arm7tdmi-s, arm710t, arm720t, arm740t, strongarm, strongarm110, strongarm1100, strongarm1110, arm8, arm810, arm9, arm9e, arm920, arm920t, arm922t, arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t, arm9tdmi, arm10tdmi, arm1020t, arm1026ej-s, arm10e, arm1020e, arm1022e, arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp, arm1156t2-s, arm1156t2f-s, arm1176jz-s, arm1176jzf-s, generic-armv7-a, cortex-a5, cortex-a7, cortex-a8, cortex-a9, cortex-a12, cortex-a15, cortex-a17, cortex-a32, cortex-a35, cortex-a53, cortex-a55, cortex-a57, cortex-a72, cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a78, cortex-a78ae, cortex-a78c, cortex-a710, ares, cortex-r4, cortex-r4f, cortex-r5, cortex-r7, cortex-r8, cortex-r52, cortex-r52plus, cortex-m0, cortex-m0plus, cortex-m1, cortex-m3, cortex-m4, cortex-m7, cortex-m23, cortex-m33, cortex-m35p, cortex-m55, cortex-x1, cortex-x1c, cortex-m1.small-multiply, cortex-m0.small-multiply, cortex-m0plus.small-multiply, exynos-m1, marvell-pj4, neoverse-n1, neoverse-n2, neoverse-v1, xscale, iwmmxt, iwmmxt2, ep9312, fa526, fa626, fa606te, fa626te, fmp626, fa726te, star-mc1, xgene1. Дополнительно эта опция может указать, что GCC должен настроить производительность кода для системы big.LITTLE. Разрешены имена: cortex-a15.cortex-a7, cortex-a17.cortex-a7, cortex-a57.cortex-a53, cortex-a72.cortex-a53, cortex-a72.cortex-a35, cortex-a73.cortex-a53, cortex-a75.cortex-a55, cortex-a76.cortex-a55. -mtune=generic-arch Указывает, что GCC должен настроить производительность для смеси процессоров с архитектурой arch. Назначение опции состоит в том, чтобы генерировать код, который хорошо работает на текущих самых популярных процессорах с балансом между оптимизациями, которые приносят выгоду некоторым процессорам в диапазоне, и избегая подводных камней снижения производительности других CPU. Эффекты этой опции могут поменяться в будущих версиях GCC по мере появления новых моделей CPU. -mtune Разрешает те же опции расширения, что и -mcpu, однако опции расширения не влияют на настройку генерируемого кода. -mtune=native Заставляет компилятор автоматически детектировать CPU компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и распознаются не все архитектуры. Если автодетект прошел неудачно, то эта опция не дает эффекта. -mcpu=name[+extension…] Указывает имя name целевого процессора (target ARM). GCC использует это name, чтобы определить имя целевой архитектуры ARM (как если бы она была указана опцией -march) и тип процессора ARM, чтобы настроить для него производительность (как если бы была указана опция -mtune). Там, где эта опция используется вместе с опциями -march или -mtune, эти опции имеют преимущество над соответствующей частью этой опции. Многие поддерживаемые CPU реализуют опциональные архитектурные расширения. В этом случае архитектурные расширения обычно активируются по умолчанию. Если существуют реализации без расширения, то может использоваться синтаксис расширения для запрета этих расширений, которые отсутствуют. Для инструкций плавающей точки и Advanced SIMD (Neon) также должны учитываться установки опций -mfloat-abi и -mfpu: инструкции плавающей точки и Advanced SIMD будут использоваться только если опция -mfloat-abi не установлена в 'soft'; и любая установка -mfpu, отличная от 'auto', переназначит доступные инструкции расширения инструкций плавающей точки и SIMD. Например cortex-a9 можно найти в трех основных конфигурациях: только целые числа (integer only), только с блоком плавающей точки (floating-point unit), или с плавающей точкой и Advanced SIMD. Умолчание разрешает все инструкции, но могут использоваться расширения +nosimd и +nofp, чтобы соответственно запретить только инструкции SIMD, либо и SIMD, и инструкции плавающей точки. Разрешенные имена для этой опции те же самые, что и для -mtune. Для перечисленных CPU общими являются опции: +nodsp +nomve +nomve.fp +nofp +nofp.dp +nosimd +crypto Дополнительно generic-armv7-a pseudo target по умолчанию VFPv3 с 16 регистрами двойной точности. Это поддерживается следующими опциями расширения: mp, sec, vfpv3-d16, vfpv3, vfpv3-d16-fp16, vfpv3-fp16, vfpv4-d16, vfpv4, neon, neon-vfpv3, neon-fp16, neon-vfpv4. Смысл такой же, как и для расширений для -march=armv7-a. -mcpu=generic-arch также разрешено, и является эквивалентом для -march=arch -mtune=generic-arch. Для дополнительной информации см. -mtune. -mcpu=native Заставляет компилятор автоматически определять CPU компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и распознаются не все архитектуры. Если автодетект прошел неудачно, то эта опция не дает эффекта. -mfpu=name Указывает, что на target имеется аппаратура плавающей точки (или аппаратная эмуляция плавающей точки). Разрешены имена name: auto, vfpv2, vfpv3, vfpv3-fp16, vfpv3-d16, vfpv3-d16-fp16, vfpv3xd, vfpv3xd-fp16, neon-vfpv3, neon-fp16, vfpv4, vfpv4-d16, fpv4-sp-d16, neon-vfpv4, fpv5-d16, fpv5-sp-d16, fp-armv8, neon-fp-armv8 и crypto-neon-fp-armv8. Обратите внимание, что neon это псевдоним для neon-vfpv3, и vfp псевдоним для vfpv2. Установка auto это умолчание и имеет специальный смысл. Она заставляет компилятор выбрать инструкции плавающей точки и Advanced SIMD на основе установок -mcpu и -march. Если выбранная аппаратура плавающей точки включает расширение NEON (например -mfpu=neon), то имейте в виду, что операции плавающей точки не генерируются с помощью прохода авто-векторизации GCC, если также не указана опция -funsafe-math-optimizations. Причина в том, что аппаратура NEON не полностью реализует стандарт IEEE 754 для арифметики плавающей точки (в частности, нестандартные значения рассматриваются как 0), так что использование инструкций NEON может привести к потере точности. Вы можете также установить fpu name на уровне функции, используя атрибуты функции target("fpu=") [5], или директивы #pragma [6]. -mfp16-format=name Указывает формат типа __fp16 плавающей запятой половинной точности. Для name разрешены имена none, ieee и alternative. По умолчанию используется none, в этом случае тип __fp16 не определен. Для дополнительной информации см. описание плавающей точки половинной точности [7]. -mstructure-size-boundary=n Размеры всех структур и объединений округляются вверх, чтобы нацело делиться на количество бит, установленных этой опцией (выравнивание). Разрешены значения 8 (выравнивание отсутствует), 32 (выравнивание на границу слова) и 64 (выравнивание на границу двойного слова). Значение по умолчанию зависит от используемого тулчейна. Для тулчейнов, нацеленных на COFF, значение по умолчанию 8. Значение 64 разрешено только если нижележащий ABI [2] это поддерживает. Указание большего значения может дать быстрый, более эффективный код, однако может также увеличить размер программы. Различные значения потенциально несовместимы. Код, скомпилированный с одним значением, необязательно будет работать с кодом или библиотекой, скомпилированными с другим значением, если имеется обмен используемыми структурами или объединениями. Эта опция устарела. -mabort-on-noreturn Генерирует вызов функции abort в конце функции с атрибутом noreturn. Функция abort будет выполнена, если будет сделана попытка возврата из noreturn-функции. -mlong-calls Говорит компилятору производить вызовы функции предварительной загрузкой адреса функции в регистр, и затем выполнять вызов подпрограммы на этом регистре (long call). Этот ключ нужен, если целевая функция лежит в памяти вне 64-мегабайтного диапазона адресов для версии инструкции вызова подпрограммы, основанной на смещении. Даже если этот ключ разрешен, не все вызовы функций будут превращены в дальние вызовы. На превращаются в дальние вызовы static-функции, функции с атрибутом short_call, функции в пределах действия директивы #pragma no_long_calls, и функции, определения которых уже были скомпилированы в рамках текущей единицы компиляции и не превращены в вызовы long call. Исключения из этого правила составляют определения weak-функций, функции с атрибутом long_call или атрибутом section, и функции, которые находятся в пределах действия директивы #pragma long_calls: во всех этих случаях вызовы превращаются в дальние. По умолчанию действие этой опции не разрешено. Указание -mno-long-calls восстанавливает поведение по умолчанию, а также помещает вызовы функций в область действия директивы #pragma long_calls_off. Обратите внимание, что эти ключи не влияют на то, как компилятор генерирует код для обработки вызовов функций через указатели на функцию. -msingle-pic-base Рассматривает регистр, используемый для адресации PIC, как read-only, вместо загрузки его в пролог для каждой функции. Система времени выполнения (runtime) отвечает за инициализацию этого регистра походящим значением перед тем, как начнется выполнение. -mpic-register=reg Указывает регистр, который должен использоваться для адресации PIC (Program Instruction Counter). Для стандартного базового варианта PIC по умолчанию используется любой подходящий регистр, определенный компилятором. Для одного базового варианта PIC умолчанием является R9, если target основана на EABI, или разрешена проверка стека, иначе умолчанием будет R10. -mpic-data-is-text-relative Предполагается, что смещение между сегментами text (код программы) и data (данные программы) фиксировано во время выполнения статической линковки. Это разрешает операции адресации относительно PC для доступа к данным, находящихся в сегменте data. Для target-ов non-VxWorks RTP эта опция разрешена по умолчанию. Когда это поведение запрещено для таких target, оно будет по умолчанию разрешено использованием -msingle-pic-base. -mpoke-function-name Записывает имя каждой функции в секцию text, непосредственно перед прологом функции. Получается код наподобие следующего: t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 При выполнении обратной трассировки стека код может проверять значение PC, сохраненное в ячейку fp + 0. Если функция трассировки затем посмотрит на ячейку PC - 12, и старшие 8 установлены, то мы знаем, что это имя функции, встроенное непосредственно перед этим местом, и длина у имени ((pc[-3]) & 0xff000000). -mthumb Выбирает между генерацией кода, выполняемого в состояниях ARM и Thumb. Умолчание для большинства конфигураций - генерировать код, который выполняется в состоянии ARM, но это умолчание может быть изменено конфигурированием GCC опцией --with-mode=state. Вы также можете отменить режим ARM и Thumb для каждой функции, используя атрибуты функции target("thumb") и target("arm"), см. описание атрибутов функций [5], или используя директивы #pragma, см. [6]. -mflip-thumb Переключает режимы ARM/Thumb на чередующихся функциях. Эта опция предоставлена для тестирования регрессии генерации смешанного кода Thumb/ARM, и она не предназначена для обычного использования скомпилированного кода. -mtpcs-frame Генерирует стек фрейма, совместимый со спецификацией Thumb Procedure Call Standard для всех non-leaf функций (leaf-функция это такая функция, которая не вызывает никакие другие функции [8]. По умолчанию используется -mno-tpcs-frame. -mtpcs-leaf-frame Генерирует стек фрейма, совместимый со спецификацией Thumb Procedure Call Standard для всех leaf функций. По умолчанию используется -mno-apcs-leaf-frame. -mcallee-super-interworking Предоставляет всем видимым снаружи функциям в файле, который компилируется, заголовок набора инструкций ARM, который переключает выполнение в режим Thumb перед выполнением остальной части функции. Это дает возможность этим функциям выполняться в режиме non-interworking. Эта опция недопустима в конфигурациях AAPCS, потому что по умолчанию разрешен смешанный код interworking. -mcaller-super-interworking Позволяет вызовам через указатели на функцию (включая virtual-функции) выполняться корректно несмотря на то, был ли скомпилирован target-код для interworking, или нет. Это приводит к небольшим накладным расходам на выполнение через указатель на функцию, если эта опция разрешена. Эта опция недопустима в конфигурациях AAPCS, потому что по умолчанию разрешен смешанный код interworking. -mtp=name Указывает модель доступа для указателя на локальное хранилище потока (Thread Local Storage, TLS). Допустимы модели: soft Генерирует вызовы для __aeabi_read_tp. -mtls-dialect=dialect Указывает используемый диалект для доступа к локальному хранилищу потока (TLS). Поддерживаются два диалекта: gnu и gnu2. Диалект gnu выбирает оригинальную схему GNU для поддержки local и global dynamic моделей TLS. Диалект gnu2 выбирает схему дескриптора GNU, которая предоставляет лучшее быстродействие для общих (shared) библиотек. Схема GNU descriptor совместима с оригинальной схемой, но требует поддержки нового ассемблера, линкера и библиотеки. На initial и local exec TLS модели эта опция не влияет, и всегда используется оригинальная схема. -mword-relocations Генерировать абсолютные релокации только по значениям размера слова (например R_ARM_ABS32). Это разрешено по умолчанию на target-ах (uClinux, SymbianOS), где runtime-загрузчик накладывает это ограничение, и когда указано -fpic или -fPIC. Эта опция конфликтует с -mslow-flash-data. -mfix-cortex-m3-ldrd Некоторые ядра Cortex-M3 могут приводить к повреждению данных, когда используются инструкции ldrd с перекрывающимися адресатами и базовыми регистрами. Эта опция предотвращает генерацию таких инструкций. По умолчанию эта опция разрешена, когда указана опция -mcpu=cortex-m3. -mfix-cortex-a57-aes-1742098 Разрешает (или запрещает) смягчение erratum на Cortex-A57 и Cortex-A72, которое влияет на инструкции криптографии AES. Эта опция по умолчанию разрешена, когда указана либо опция -mcpu=cortex-a57, либо опция -mcpu=cortex-a72. -munaligned-access Разрешает (или запрещает) чтение и запись 16- и 32-битных значений из адресов, которые не выровнены на 16 или 32 бита. По умолчанию невыровненный доступ запрещен для архитектур pre-ARMv6, ARMv6-M и ARMv8-M Baseline, и разрешен для всех других архитектур. Если невыровненный доступ не разрешен, то к словам в упакованных структурах данных осуществляется доступ по одному байту. В зависимости от этой опции ARM-атрибут Tag_CPU_unaligned_access установливается в сгенерированном файле в значение true или false. Если невыровненный доступ разрешен, то также определяется символ препроцессора __ARM_FEATURE_UNALIGNED. -mneon-for-64bits Эта опция устарела и не дает никакого эффекта. -mslow-flash-data Предполагается загрузка данных из flash медленнее, чем выборка инструкции. Таким образом, литеральная загрузка минимизируется с целью повышения производительности. Эта опция по умолчанию выключена, и поддерживается только когда компиляция происходит для ARMv7 M-profile. Эта опция конфликтует с -mword-relocations. -masm-syntax-unified Предполагается, что inline-ассемблер использует унифицированный синтаксис (unified asm). По умолчанию в настоящий момент выключено, что подразумевает divided-синтаксис. Эта опция не влияет на Thumb2. Однако поведение опции может поменяться в будущих релизах GCC. Divided-синтаксис должен считаться устаревшим. -mrestrict-it Ограничивает генерацию IT блоков, чтобы удовлетворять правилам ARMv8-A. IT-блоки могут содержать только 16-битную инструкцию из выбранного набора инструкций. Эта опция по умолчанию включена для режима ARMv8-A Thumb. -mprint-tune-info Печатает информацию настройки CPU в виде комментария в файле ассемблера. Эта опция используется только для теста регрессии компилятора, и не предназначена для компиляции обычного рабочего кода. По умолчанию эта опция запрещена. -mverbose-cost-dump Разрешает подробную модель дампа (verbose cost model dumping) в файлах отладки (debug dump files). Эта опция предоставлена для отладки компилятора. -mpure-code Не позволяет данным констант размещаться в секциях кода. Дополнительно, когда компиляция происходит для объектного формата ELF, все специфичные для процессора text-секции ELF получают атрибут SHF_ARM_PURECODE. Эта опция доступа только когда генерируется non-pic код для target-ов M-profile. -mcmse Генерирует безопасный код, как описано в спецификации расширений безопасности ARMv8-M [9]. -mfix-cmse-cve-2021-35465 Смягчает потенциальную проблему безопасности, связанную с инструкцией VLLDM на некоторых M-profile устройствах, когда используется CMSE (CVE-2021-365465). Эта опция разрешена по умолчанию, когда используется опция -mcpu= с именами cortex-m33, cortex-m35p, cortex-m55 и star-mc1. Для запрета этого смягчения может использоваться опция -mno-fix-cmse-cve-2021-35465. -mstack-protector-guard=guard Генерирует "канареечный" (предупреждающий) код защиты от переполнения стека (canary at guard). Поддерживаются области 'global' для global canary или 'tls' для canary-кода, доступного через регистр TLS. Опция -mstack-protector-guard-offset= предназначена для использования с -fstack-protector-guard=tls, и не предназначена для использования в коде user-land. -mfdpic Выбирает FDPIC ABI, который использует 64-разрядные дескрипторы функций для представления указателей на функции. Когда компилятор сконфигурирован для target-ов arm-*-uclinuxfdpiceabi, эта опция по умолчанию включена, и подразумевает -fPIE, если не предоставлена ни одна из опций, связанных с PIC/PIE. На других target, эта опция только разрешает генерацию специфичного для FDPIC кода, и пользователь должен явно предоставить опции PIC/PIE по мере необходимости. Обратите внимание, что статическая линковка не поддерживается, поскольку это все еще вовлекает динамический линкер, когда программа использует самостоятельное перемещение по адресному пространству (self-relocates). Если такое поведение допустимо, используйте опции -static и -Wl,-dynamic-linker. Полезна (и необходима) противоположная опция -mno-fdpic для сборки ядра Linux, с использованием того же самого (arm-*-uclinuxfdpiceabi) тулчейна как тот, который использовался для сборки userland-программ. [Ссылки] 1. GCC ARM Options site:gcc.gnu.org. |