【发布时间】:2012-03-29 08:32:05
【问题描述】:
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"))),它在某种程度上有所帮助。
【问题讨论】:
-
您的项目是在普通的 x86 机器上运行,还是类似于 ARM 片上系统 (SoC)?你能找到一个链接器脚本(由 ld 使用,因此通常以“.ld”结尾)吗?这将明确地将堆栈部分放入内存区域,因此找到链接描述文件将提供更多线索。
-
该程序用于普通的 x64_86 服务器和 HP-UX Itanium2。没有 ARM 系统。
-
可能值得在您的问题中添加有关机器的信息。我可以想象 Itanium2 可能触发某些东西(我对此知之甚少,但它是不同的 :-)
标签: c linux gcc shared-libraries