【问题标题】:The placement order of __attribute__((section("name")))__attribute__((section("name"))) 的放置顺序
【发布时间】:2021-11-25 07:49:08
【问题描述】:

我正在使用我有此定义的代码示例:

#define PLACE_IN_SECTION( __x__ )  __attribute__((section (__x__)))

全部代码。

例如

     //file1.cpp
PLACE_IN_SECTION("A") static int a1;
    

    //file2.cpp
PLACE_IN_SECTION("A") static int a2;

我找不到有关变量放置在特定部分中的顺序的信息。 Keil 只是告诉我将所有内容放在一个结构中以控制地址。 但是我仍然想知道每个编译器是否有关于顺序的任何规则。

所以基本上问题是谁会是第一个,为什么?

同时使用 gcc 和 arm 编译器 (v6)

编辑: 这些变量与另一个 CPU 分片,它们获得的地址对系统很重要。

【问题讨论】:

  • 我提出了一个非常愚蠢的问题......对不起......但是你到底为什么要关心订单呢?如果您有特定的订单(出于未知原因),请将它们放在单独的部分并通过链接器脚本进行排序
  • 变量的地址在该代码中很重要,它与另一个 CPU 共享,我无法控制。
  • the order the variables are placed in a specific section 未指定。它们按链接器希望它们的任何顺序放置。 The address of the variables 然后将每个变量放在自己的部分中。
  • 如果你想确保精确的顺序,要么将变量放在不同的部分并在链接描述文件中设置地址,要么将它们全部放在一个部分和一个文件中的顺序中。否则你只是在玩特定版本的工具链链接器的猜谜游戏。

标签: gcc arm


【解决方案1】:

由编译器决定变量在内存中的顺序。同一编译器的不同版本可以在同一代码上给出不同的顺序。

为了保持源中变量的顺序,GCC 有优化标志-fno-toplevel-reorder

不要对顶级函数、变量和 asm 语句重新排序。以它们在输入文件中出现的相同顺序输出它们。使用此选项时,不会删除未引用的静态变量。此选项旨在支持依赖特定排序的现有代码。对于新代码,最好尽可能使用属性。

-ftoplevel-reorder 是 -O1 和更高版本的默认值,如果显式请求 -fsection-anchors 也是 -O0 的默认值。此外 -fno-toplevel-reorder 意味着 -fno-section-anchors。

link

这可能会降低优化质量。为防止它在全局范围内发生,必须以已知顺序放置的变量应移动到使用此选项编译的单独文件中。

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 2020-05-23
    • 2016-03-31
    • 1970-01-01
    • 2016-02-13
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多