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)
__attribute__((section("STACK"))))
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准确地放入"堆叠"部分可能是什么意思?
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)
__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"))),它有所帮助.
首先,该STACK部分不是任何正在运行的任务的堆栈.
将变量,函数放在特定的Section中允许为它们选择一个内存区域(感谢链接器脚本).在某些(主要是嵌入式)架构上,您希望将经常访问的数据放在更快的内存中.
其他解决方案,一些开发后链接脚本将所有STACK部分设置为1:开发软件将始终如此do_something_else().并且发布的软件可以保持默认值0.
另一种可能性,如果该STACK部分中有其他变量,开发人员希望将它们保持在内存中.该STACK部分中的所有变量将彼此靠近.可能是缓存优化?
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |