关于.bss段的讨论,全局未定义变量和未定义的局部静态变量

    技术2022-05-20  45

    由《程序员的自我修养》给出的例子:

    /* SimpleSection.c test the coff obj's structure author:wuyichao date: 2011-2-26 */ int printf( const char* format,... ); int global_var; ///并没有放到.bss段里面,由符号表里看而是放到了.data段中,与elf有区别 void func1(int i) { printf("%d/n", i); } int main(void) { static int static_var ; static int static_var2; static int static_var3; int a = 1; int b; func1(static_var + static_var2 + a + b); return a; } 

    在linux的elf格式中,

    .bss段存放的是未初始化的全局变量和局部静态变量。其实更准确地说法是.bss为它们预留了空间。本来.bss的大小应该是8 bytes

    然而察看.bss段的大小却是4 bytes.这是说原因呢,gcc编译器不把global_uninit_var放在任何段,只是个为定义的"common符号".(这跟编译器实现有关)

    在符号表中可以看见,这里只是预留一个未定义的全局变量符号,等到最终连接成可执行文件的时候再在.bss段分配空间。

    而编译单元内部可见的静态变量总是存放在.bss段的。

     

    在windows生成的目标文件coff格式:

    vc编译器也是这么实现的。

    gloal_uninit_var也没放在任何段,在符号表中标志为:UNDEF(未定义)

     

     

    参考文献:《linkers and loaders》 john R. Levine著

                   《程序员的自我修养》       俞甲子,石凡

     


    最新回复(0)