In gcc doc给出了使用section
的一个原因。原因是to map to special hardware
。但这似乎不是我的情况。
因此,我已经下达了修改项目中使用的共享库的任务。这是一个Linux库。库中有变量声明让我感到困惑。它们看起来像这样(大致):
static int my_var_1 __attribute__((section("STACK"))) = 0;
__attribute__((section("STACK")))
)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
确切地放在“堆栈”部分中可能有什么意义呢?
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
__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")))
,它以某种方式有所帮助。
首先STACK
部分不会是任何正在运行的任务的堆栈。
可能有很多原因,没有细节很难分辨。一些原因可能是:
在某些操作系统中,每个线程的堆栈都使用相同的地址空间区域;当执行在线程之间切换时,该空间的映射也会相应更改。在这样的系统上,每个线程将在地址空间的该区域内具有自己的独立的任何静态变量集。将需要为每个线程分别维护的变量放在这样的地址范围内,可以避免与每个任务开关手动交换它们的需要。