gpt4 book ai didi

c - 使用 __attribute__ ((section "STACK")) 将变量准确地放在 ("STACK"部分中可能有什么意义?

转载 作者:IT王子 更新时间:2023-10-29 01:19:57 28 4
gpt4 key购买 nike

In gcc doc给出了使用 section 的一个原因。这个原因是映射到特殊硬件。但这似乎不是我的情况。

所以我给了一个任务来修改我们在项目中使用的共享库。它是一个 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 准确地放在“STACK”部分中有什么意义呢?


更新 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"))) 并且它在某种程度上有所帮助。


最佳答案

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

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

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

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

关于c - 使用 __attribute__ ((section "STACK")) 将变量准确地放在 ("STACK"部分中可能有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9921782/

28 4 0