Что означает флаг "aw" в атрибуте раздела?

В следующей строке кода (который объявляет глобальную переменную),

unsigned int __attribute__((section(".myVarSection,\"aw\",@nobits#"))) myVar;

Что означает флаг aw?

Я понимаю, что флаг nobates предотвратит инициализацию переменной до нуля, но я изо всех сил пытаюсь найти информацию о знаке "aw".

Кроме того, какой смысл имеют @и # вокруг знатного знака?

Ответ 1

Атрибут section("section-name") помещает переменную в конкретный раздел, создавая следующую строку ассемблера:

.section    section-name,"aw",@progbits

Когда вы устанавливаете section-name в ".myVarSection,\"aw\",@nobits#", вы используете в GCC " впрыск кода в GCC для создания:

.section    .myVarSection,"aw",@nobits#,"aw",@progbits

Обратите внимание, что знак # запускает однострочный комментарий.

См. руководство GNU Assembler для полного описания директивы .section. Общий синтаксис

.section name [, "flags"[, @type[,flag_specific_arguments]]]

поэтому "aw" являются флагами:

  • a: раздел выделяется
  • w: раздел доступен для записи

и @nobits - тип:

  • @nobits: раздел не содержит данных (т.е. раздел занимает только пространство)

Все вышесказанное применимо также к функциям, а не только к переменным.

Ответ 2

Что означает флаг aw?

Это означает, что раздел является распределяемым (т.е. он загружается в память во время выполнения) и доступен для записи (и, конечно, доступен для чтения).

Я понимаю, что флаг nobates предотвратит инициализацию переменной до нуля, но я изо всех сил пытаюсь найти информацию о знаке "aw".

Кроме того, какой смысл имеют @и # вокруг знатного знака?

@nobits (@- это просто часть имени) означает, что раздел не сохраняется в изображении на диске, он существует только во время выполнения (и он заполняется нулями при запуске).

# символ начинает комментарий, поэтому независимо от того, какой компилятор поставит в дополнение к тому, что вы указали, будет проигнорирован.