Что означает флаг "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 (@- это просто часть имени) означает, что раздел не сохраняется в изображении на диске, он существует только во время выполнения (и он заполняется нулями при запуске).
# символ начинает комментарий, поэтому независимо от того, какой компилятор поставит в дополнение к тому, что вы указали, будет проигнорирован.