V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dangyuluo
V2EX  ›  汇编

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

  •  
  •   dangyuluo · 2022-10-19 16:46:09 +08:00 · 848 次点击
    这是一个创建于 751 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下是源码:

    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的调用。因此想请问我的思路对么?

    1 条回复    2022-10-19 19:13:02 +08:00
    iamzuoxinyu
        1
    iamzuoxinyu  
       2022-10-19 19:13:02 +08:00
    _GLOBAL_sub_I__看起来是个约定前缀,应该是链接器会搜集所有这个前缀开头的函数,并在 main 之前调用一遍。可以找 gcc 的文档看下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:15 · PVG 03:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.