Linux 下, global variable 在汇编里是什么时候被初始化的呢?

2022-10-19 16:46:09 +08:00
 dangyuluo

以下是源码:

int duplicate(int n)
{
    return n * 2;
}
int global_var = duplicate(0x42);

int main(int argc, char** argv){
    return global_var;
}

有一个 global variable, 用以下命令编译,并查看汇编代码:

g++ -o main ./main.c -O0
objdump -C -S -s main

其输出可见: https://controlc.com/70c59b1e

总是听别人说,static storage variable(基本上就是 global variable)在进入main之前就被初始化了,但是在查看汇编代码时,我并没有找到相关的调用。

__static_initialization_and_destruction_0(int, int)看起来像是初始化global_var,被_GLOBAL__sub_I__Z9duplicatei调用,但是我没有在任何地方看到对_GLOBAL__sub_I__Z9duplicatei的调用。因此想请问我的思路对么?

707 次点击
所在节点   汇编
1 条回复
iamzuoxinyu
2022-10-19 19:13:02 +08:00
_GLOBAL_sub_I__看起来是个约定前缀,应该是链接器会搜集所有这个前缀开头的函数,并在 main 之前调用一遍。可以找 gcc 的文档看下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/888159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX