сбой макроса командной строки GNU ARM assembler с " недопустимым идентификатором для.ifdef"
My toolchain-это последняя версия arm-gcc.
у меня есть фрагмент кода в файле сборки, который должен быть условно включен/собран.
.ifdef MACRO_FROM_CMDLINE
Assembly instr1
Assembly instr2
.endif
инкапсулированный код является недавним дополнением.
Я пробовал так:
gcc -x assembler-with-cpp --defsym MACRO_FROM_CMDLINE=1 <along with other necessary options>
gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 <along with other necessary options>
на -D
результат "неверный идентификатор .ifdef "and".endif без .если" ошибки.
на --defsym
результаты в "MACRO_FROM_CMDLINE=1: Нет такого файла или каталога", " нераспознанный параметр --defsym" ошибки.
2 ответов
на gcc
binary управляет процессом компиляции, вызывая ряд других программ в последовательности, чтобы фактически выполнить различные этапы работы (компиляция, сборка, связывание).
когда вы говорите:
gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...
вы просите его запустить источник через препроцессор C, а затем запустить результат через ассемблер.
шаг препроцессора C превратится:
.ifdef MACRO_FROM_CMDLINE
в:
.ifdef 1
перед передавая его ассемблеру, который затем не может понять его. Вот почему вы получаете ошибку" недопустимый идентификатор". Это также объясняет, почему использование препроцессора c #ifdef
решает проблему.
--defsym
не работает, потому что это опция ассемблера, а не gcc
программы драйвер. (The gcc
водитель понимает и проходит через некоторые варианты некоторые программ, которые он вызывает, но не все.)
вы можете, однако, передайте произвольные параметры ассемблеру, используя
-Wa,option[,option...]
синтаксис, который говорит gcc
драйвер для передачи этих параметров ассемблеру (в виде списка параметров, разделенных пробелами).
например:
gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...
добавляет
--defsym MACRO_FROM_CMDLINE=1
в список опций перешел к as
, когда gcc
вызывает его, и вот как сделать ваш оригинальный .ifdef
пример работа.
вы можете увидеть отдельные программы, вызываемые gcc
, и параметры, которые он фактически передает им, добавив .
в этом случае вы должны увидеть что-то под названием cc1
(фактический двоичный файл компилятора GCC C) вызывается с помощью -E
флаг (только предварительная обработка) для предварительной обработки ввода во временный файл, а затем as
вызывается во временном файле для его сборки.
странно, но оказывается, мне нужно было использовать синтаксис C в файле сборки.
#ifdef MACRO
Assembly Instruction
Assembly Instruction
#endif
и макрос должен был быть передан с помощью опции-D.