Re: Automatically initialize all global variables/arrays in GCC.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Kevin,

In principle it is possible to do what you want.

We have to distinguish a few things here. Yes, ANSI-C requires that all uninitialized static/global variables have to be initialized with 0. However, it is not the compiler who does this, it is the startup code or the loader.

The C compiler usually puts variables that are supposed to be initialized with 0 in the .bss section instead of the .data section. Opposed to the .data section, the .bss section does not contain actual data, it just specifies the size of all elements it contains. The C compiler just *assumes* that the linker, loader, or the startup code of the C library initializes this block of memory with 0. This is an optimization; .data elements occupy space in the image (or ROM or flash memory) and in RAM whereas .bss elements neet to occupy RAM space only if they are initialized at run-time. (Gcc provides even an option (-fno-zero-initialized-in-bss) to do not rely on this optimization, that is, to put all 0-initialized elements into the .data section as well.)

Therefore, you have a couple of options:

1) You may modify the startup or write some own initalization code to override the .bss section at runtime with whatever value you want.

2) You may use __attribute__((section, ".mysection)) on every uninitialized variable to instruct the compiler to put it into your own section. You may then use the linker or a runtime initialization routine to initialize this section.

The second solution is probably better, as other parts of the code (expecially SWIG) may rely on having 0-initialized globals. However, as you see all this is not so much a gcc thing, but more related to the binutils and library. You would probably have to extend or modify the linker script or exchange the startup code of the C library. I do not know the exact details about doing this on Linux (had to look them up) as I use gcc almost only on embedded targets. But what you want to achieve is definitely possible.

Daniel

Kevin Hung schrieb:
Hi Michael,

Thanks for your reply. So I guess the answer is that this cannot be done in C.

My area is in DSP and so our C code runs on the DSP chip. In DSP C
linker, it allows us to fill a memory area with a magic constant. This
is why I want to see if GCC allows us to do something like this and it
seems the answer is no.

Based on your reply, it seems that the DSP linker violates the ISO C standard.


On 7/6/07, Michael Meissner <michael.meissner@xxxxxxx> wrote:
On Thu, Jul 05, 2007 at 01:20:47PM -0700, Kevin Hung wrote:
> I am using gcc to compile our C code under Linux. After compiling and
> linking, we use SWIG to create python wrapper for the C code so that
> we can execute C functions in python.
>
> My question is: When our C program gets loaded into python, is it
> possible to have all global variables/arrays in our C code to be
> initialized to some magic constants (say all ones)? I think if this is
> possible, it would be a linker option under GCC. My gcc version is:

The ISO C standard mandates that all static/global variables that aren't
otherwise initialized are initialized to 0. Under Linux, variables that aren't explicitly initialized get put into the bss sections that aren't allocated space in the disk image, but the OS guarantees will be set to 0 when you touch
the page.

In general, you probably don't want to do something like zap the bss area in a startup routine, because you don't know what other modules might have put stuff
there.

If you want to initialize a static/global to a value, you should create the
definition with an initializer.

--
Michael Meissner, AMD
90 Central Street, MS 83-29, Boxborough, MA, 01719, USA
michael.meissner@xxxxxxx




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux