----- Original Message ----- From: "chandru srikan" <uttarafriends2003@yahoo.com> To: "Vijay Kumar R Zanvar" <vijoeyz@hotpop.com> Sent: Tuesday, November 11, 2003 2:01 PM Subject: Re: [UTTARA] Static variable >if static var decleared inside the function then > where it is stored This one didn't strike my mind. I also didn't know where the static varible declared inside a function would go? Later, I set on studying the assembly code generated by gcc. Following is, according to my knowledge, the explaination: If it is static, it is more likely that it will be placed in the data section. Now, how a compiler hides a static identifier from the loader is upto itself. Please note that the following discussion is GCC specific. /* * static.c - `static' storage analysis * Date - Nov 12, 2003 */ #include <stdio.h> /* Avoid warning: `ident' defined but not used */ #ifdef __GNUC__ #define UNUSED __attribute__ (( unused )) /* Turbo C/C++ specific */ #elif __TCPLUSPLUS__ && __MSDOS__ #define UNUSED #pragma warn -var #else #define UNUSED #endif static int i UNUSED; /* 1 See explaination */ static int j UNUSED = 10; int ii UNUSED; int main ( void ) { static int i UNUSED; /* 2 */ static int j UNUSED = 20; return 0; } void fun ( void ) { static int i UNUSED; /* 3 */ static int j UNUSED = 30; } /* End of program */ The following is the assembly code generated by: $ gcc static.c -S -Wall .file "static.c" .section .data .p2align 2 _j: /* 1 */ .long 10 .lcomm _i.0,16 /* 2 : main () */ .p2align 2 _j.1: /* 2 : main () */ .long 20 .section .text .globl _main _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax subl %eax, %esp movl $0, %eax leave ret .lcomm _i.2,16 /* 3 */ .section .data .p2align 2 _j.3: /* 3 */ .long 30 .section .text .globl _fun _fun: pushl %ebp movl %esp, %ebp popl %ebp ret .lcomm _i,16 /* 1 */ .comm _ii,16 .ident "GCC: (GNU) 3.3.2" /* End of static.s */ Explaination: Notice the following two assembler pseudo-ops: i) .lcomm ii) .comm Both are used to allocate space in the BSS. The .lcomm (stands for local common) is used for static and .comm for non-static global variables. For more information, see "info as". Notice also that the gcc compiler prepends a global variable with an /underscore/. .globl directive of the assembler makes a symbol visible to the loader (ld). /* 1 */ A global static indentifier falls into the data section, but doesn't come under .globl section. This means the loader doesn't even know the existence of j and i here. .locomm directive used for static variables. But, if you see .comm is used for ii, viz., the loader can see the symbol ii. /* 2 */ i and j (_i.0 and _j.1) of main are represented as shown. Notice the postion with respect to .globl directive. /* 3 */ i and j (_i.2 and _j.3) of fun () are again represented in the same way. I hope this is not complex. Thanks. vijay-z.