C++是不能在全局Scope里写表达式, 原来一直以为指令的执行都是在main函数里的. 但C++里可以调用类的构造函数对类初始化. 构造函数显然不能是在main函数里调用, 那在什么时候调用呢?
是在一段叫做init的代码段里.
Linux的ELF可执行文件格式分为若干段:
ELF Header |
Segment header table |
.init 初始化段 |
.text 代码段 |
.rodata 只读数据(常量等) |
.data 可读写数据(全局变量等) |
.bss 未初始化数据 |
.symtab 符号表(似乎只有全局的吧) |
.debug 调试信息 |
.line 指令和源文件行对应 |
.strtab 符号字符串实际存放处 |
Section Header Table |
在可执行程序载入时, 在调用main函数之前, 会依次调用其他东西:
call __libc_init_first
call _init
call atexit
call main
call _exit
而全局变量的初始化代码, 就是在init段里的.
另外, 在调用全局构造函数的时候, 还会顺便调用atexit把需要在结束时调用的全局析构函数安装上. 由于atexit允许安装多个函数(按安装的反序执行). 所以不会跟ELF载入时在main前面调用的那次atexit冲突.