使用__attribute __((section("STACK"))将变量准确地放在"STACK"部分中可能是什么意思?

Ser*_*kov 5 c linux gcc shared-libraries

在gcc doc中给出了一个使用原因section.这个原因是to map to special hardware.但这似乎不是我的情况.

所以我已经完成了修改我们在项目中使用的共享库的任务.它是一个Linux库.库中有变量声明让我感到困惑.他们看起来像这样(大致):

static int my_var_1 __attribute__((section("STACK"))) = 0;
Run Code Online (Sandbox Code Playgroud)


更新1:
以这种方式定义了十几个变量(__attribute__((section("STACK"))))



更新2:
my_var_1 不是常数.my_var_1在初始化期间可能会在代码中更改:

my_var_1 = atoi(getenv("MY_VAR_1") ? getenv("MY_VAR_1") : "0");
Run Code Online (Sandbox Code Playgroud)

稍后在库中使用它像这样:

inline void do_something() __attribute__((always_inline));
inline void do_something()
{
  if (my_var_1)
    do_something_else();
}
Run Code Online (Sandbox Code Playgroud)


使用中可能有什么意义__attribute__((section("STACK")))?我明白这section告诉编译器在特定部分放置一个变量.然而,static int准确地放入"堆叠"部分可能是什么意思?


更新3
这些行摘自输出readelf -t my_lib.so

  [23] .got.plt
       PROGBITS         00000000002103f0  00000000000103f0  0
       00000000000003a8 0000000000000008  0                 8
       [0000000000000003]: WRITE, ALLOC
  [24] .data
       PROGBITS         00000000002107a0  00000000000107a0  0
       00000000000000b0 0000000000000000  0                 16
       [0000000000000003]: WRITE, ALLOC
  [25] STACK
       PROGBITS         0000000000210860  0000000000010860  0
       00000000000860e0 0000000000000000  0                 32
       [0000000000000003]: WRITE, ALLOC
  [26] .bss
       NOBITS           0000000000296940  0000000000096940  0
       0000000000000580 0000000000000000  0                 32
       [0000000000000003]: WRITE, ALLOC
Run Code Online (Sandbox Code Playgroud)


更新4
托管以从共享库的作者获取信息. __attribute__((section("STACK")))因为他没有设法在Solaris上构建库而添加了.然后他发现了这个解决方法.在变通办法之前,定义my_var_1是:

int my_var_1 = 0;
Run Code Online (Sandbox Code Playgroud)

一切都很好.然后他改变了它,因为my_var_1实际上只需要在这个翻译单元中:

static int my_var_1 = 0;
Run Code Online (Sandbox Code Playgroud)

在那次改变之后,他没有设法在Solaris上构建库.所以他补充说__attribute__((section("STACK"))),它有所帮助.


Nim*_*lar 5

首先,该STACK部分不是任何正在运行的任务的堆栈.

将变量,函数放在特定的Section中允许为它们选择一个内存区域(感谢链接器脚本).在某些(主要是嵌入式)架构上,您希望将经常访问的数据放在更快的内存中.

其他解决方案,一些开发后链接脚本将所有STACK部分设置为1:开发软件将始终如此do_something_else().并且发布的软件可以保持默认值0.

另一种可能性,如果该STACK部分中有其他变量,开发人员希望将它们保持在内存中.该STACK部分中的所有变量将彼此靠近.可能是缓存优化?