My program contains many externally defined variables. When I compile it with -O0 flag, I see them in the symbol table, but not when I use -O1 or -O2. How can I force the compil
With `-O1' and '-O2', the compiler tries to reduce code size and execution time. One of the optimizations used to reduce the size of the resulting executable is to 'throw everything overboard' that is not required for execution. The symbol table of an executable is one of those debugging niceties that is really not required for execution; so it is excluded from the final output file.
('-O0' means "Do no optimizations").
If your foo.c
only (essentially) has
extern const int my_symbol;
then compile it with -O1
or -O2
, that symbol will be optimized out. However, if you use that symbol in foo.c
, for example
extern const int my_symbol;
extern int my_flag;
void foo(void)
{
if (my_symbol)
my_flag = 1;
}
All of those symbols will exist in foo.o
even if you compile it with -O1
or -O2
.