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