На языке сборки gnu (для arm64), как я могу указать переменную, которая будет помещена в определенный раздел?

#assembly #linker #arm64

#собрание #линкер #arm64

Вопрос:

В ассемблерном коде этот код

 .data myval : .long 0x11111111  

помещает переменную myval в .data раздел. Поэтому я хотел определить свой собственный раздел по определенному адресу в SDRAM и использовать его в ассемблерном коде для записи некоторых данных для отладки. Я добавил свой раздел в скрипт компоновщика следующим образом (это первый раздел, выводимый в .sdram, поэтому я знаю начальный адрес).

 .mydebug : {  . = ALIGN(8);  KEEP(*(.__mydebug)); } gt;.sdram  

и использовал его в ассемблерном коде вот так.

 .global ... skip ... mov x6, #0x70 ldr x7, =myval str x6, [x7] ... skip ... .__mydebug myval: .long 0x11111111  

Но компилятор жалуется

 Error: unknown pseudo-op: `.__mydebug'  

Как я могу это сделать?

Ответ №1:

Используйте .section директиву.

 .section .__mydebug myval: .long 0x11111111  

Одно нужно знать: пользовательские разделы не должны иметь названия, начинающегося с точки. Такие имена зарезервированы для разделов, определенных ABI. Так что, возможно, назовите этот раздел чем-то вроде mydebug . Хотя это противоречит спецификации ELF, также часто используется такое имя .data.mydebug для раздела, который похож на .data раздел, но должен быть отделен от обычных данных.

Комментарии:

1. Nit: обычно это хорошая идея, чтобы начать раздел с align / balign директивой, чтобы убедиться, что требования к выравниванию данных выполнены