сбой макроса командной строки 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.