【问题标题】:What does the "aw" flag in the section attribute mean?部分属性中的“aw”标志是什么意思?
【发布时间】:2011-06-06 13:35:41
【问题描述】:

在下面的代码行(声明一个全局变量)中,

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

“aw”标志是什么意思?

我的理解是 nobits 标志会阻止变量被初始化为零,但我正在努力寻找有关“aw”标志的信息。

另外,nobits 标志周围的 @ 和 # 有什么含义?

【问题讨论】:

    标签: gcc attributes linker


    【解决方案1】:

    section("section-name") 属性通过生成以下汇编行将变量放置在特定节中:

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

    当您将section-name 设置为".myVarSection,\"aw\",@nobits#" 时,您会利用GCC 中的一种“code injection”来产生:

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

    注意# 符号开始一行注释。

    有关.section 指令的完整说明,请参阅GNU Assembler manual。一般语法是

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

    所以"aw" 是标志:

    • a:部分是可分配的
    • w:部分可写

    @nobits 是一个类型:

    • @nobits:节不包含数据(即节只占用空间)

    以上所有内容也适用于functions,而不仅仅是变量。

    【讨论】:

    • 请注意,这种代码注入在 Clang 中不起作用(但诚实的顶级内联汇编在一定程度上可以)。
    【解决方案2】:

    “aw”标志是什么意思?

    这意味着该部分是可分配的(即它在运行时加载到内存中)和可写的(当然是可读的)。

    我的理解是 nobits 标志会阻止变量被初始化为零,但我正在努力寻找有关“aw”标志的信息。

    另外,nobits 标志周围的 @ 和 # 有什么含义?

    @nobits(@ 只是名称的一部分)表示该部分不存储在磁盘上的映像中,它只存在于运行时(并且在启动时用零填充)。

    # 字符开始注释,因此除了您指定的内容之外编译器将添加的任何内容都将被忽略。

    【讨论】:

    • 那么如何阻止变量在启动时被初始化为零?
    • 如果你使用@progbits 而不是@nobits,它不会在启动时被初始化为零,而是存储在磁盘上的映像中(如果您没有指定其他值)。你想达到什么目的?
    • 我想在引导加载程序和嵌入式微控制器上的应用程序之间传递一个标志(在 RAM 中)。我发现在链接器文件中添加一个部分会阻止变量被初始化。
    • 在哪里可以找到预处理文件?我想知道被注释掉的内容。
    猜你喜欢
    • 2021-06-02
    • 2011-04-29
    • 2011-04-21
    • 1970-01-01
    • 2019-09-13
    • 2014-06-04
    • 2014-02-27
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多