用__attribute__((section(“ STACK”))将变量准确地放在“ STACK”部分中的意义是什么?

问题描述 投票:5回答:3

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

因此,我已经下达了修改项目中使用的共享库的任务。这是一个Linux库。库中有变量声明让我感到困惑。它们看起来像这样(大致):

static int my_var_1 __attribute__((section("STACK"))) = 0;


更新1:通过这种方式定义了许多变量(__attribute__((section("STACK")))


更新2:my_var_1不是常数。初始化期间可能会在代码中更改my_var_1
my_var_1 = atoi(getenv("MY_VAR_1") ? getenv("MY_VAR_1") : "0");

在库中,它的用法如下:

inline void do_something() __attribute__((always_inline));
inline void do_something()
{
  if (my_var_1)
    do_something_else();
}

使用__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


更新4设法从共享库的作者那里获取信息。添加了__attribute__((section("STACK"))),因为他没有设法在Solaris上构建该库。然后,他找到了解决方法。解决方法之前,my_var_1的定义如下:
int my_var_1 = 0;

一切都很好。然后他更改了它,因为实际上仅在此翻译单元中才需要my_var_1

static int my_var_1 = 0;

并且在更改之后,他没有设法在Solaris上构建该库。因此他添加了__attribute__((section("STACK"))),它以某种方式有所帮助。


c linux gcc shared-libraries
3个回答
5
投票

首先STACK部分不会是任何正在运行的任务的堆栈。


1
投票

可能有很多原因,没有细节很难分辨。一些原因可能是:


0
投票

在某些操作系统中,每个线程的堆栈都使用相同的地址空间区域;当执行在线程之间切换时,该空间的映射也会相应更改。在这样的系统上,每个线程将在地址空间的该区域内具有自己的独立的任何静态变量集。将需要为每个线程分别维护的变量放在这样的地址范围内,可以避免与每个任务开关手动交换它们的需要。

© www.soinside.com 2019 - 2024. All rights reserved.