using arm-elf-g++ to compile a simple file with a single int in it:
int fred = 10;
If I do arm-elf-objdump I can see fred.
NOW, if I make fred a const:
const int fred = 10;
it is no longer visible in the object file. In fact, the object file is
smaller and I think the data is not there! (I have done this with a
const array and you can see its not in the object file)
Note that this is NOT a startup problem, it is actually missing from the
object file directly after compiling.
Can anybody explain where its gone and what I should do about it?
Thanks for any help.
Regads,
Chris.

OK. But although I don't use it in this file, I want to link to it from
a second source file! In a separate file I have:
extern const int fred;
If I take the const out of both files this would work. With them in it
does not.
I have taken out all the compiler options to make sure they are not
having any effect.
Are there any options the would FORCE the output I want?
Thanks for taking time to think about this.
Regards,
Chris.

Errm, only now I notice you're using C++. I've been thinking of C.
In C++, const declares a real constant, rather than an unmodifiable
object. AFAICT (I'm not a C++ expert), a const declaration must have an
initializer, and the compiler will only use it when referenced within
the compilation unit. IOW, you cannot have "external constants",
as there is no actual object associated to it.
Someone more knowledgable about C++ might correct me if I'm wrong
here.

That's an interesting idea!
I have just tried compiling the same under Linux. If you compile it as a
'C' file it works. If you make it a C++ file it fails!
So, there are 2 questions:
1. Under Gnu-Arm even if I make it a 'C' file it still does not work.
Looks like it is compiling as C++ regardless. How do I force a 'C'
compile?
2. If its C++, how do I handle such a situation? Actually what I have is
a bit map as a C array that I have generated. I simply want to compile
it and access it from another file. Of course I want to fore it into
flash memory, NOT into RAM.
Thanks for some great help.
Regards,
Chris.

Chris Williams wrote:> 1. Under Gnu-Arm even if I make it a 'C' file it still does not work.> Looks like it is compiling as C++ regardless. How do I force a 'C'> compile?
Is your source file named with .cpp, .cc or .C (capital C) extension?
Especially the capital C case can be a bugger on Windows since Windows
filesystems are case insensitive, however GCC treats the filename case
sensitively AFAIK.
If so, gcc will compile it as C++ even if called via "gcc". You can
force it to use C via the "-x c" parameter. The parameter has to come
before the first source file on the command line, since it only affects
language selection for files following it.
> 2. If its C++, how do I handle such a situation? Actually what I have is> a bit map as a C array that I have generated.
Define it as "extern const int fred = 10;", this will put it into the
object file (as constant data, just like for example string literals)
even when compiling as C++.
Andreas

> In C++, const declares a real constant, rather than an unmodifiable> object.
It's both. You can use it as a real constant, e.g. for array sizes or
template arguments, but you can still e.g. take its address.
> AFAICT (I'm not a C++ expert), a const declaration
definition
> must have an initializer,
Yes, unless it's of a class type with a default constructor.
> and the compiler will only use it when referenced within> the compilation unit.
Even with const, it's still a regular variable. The difference is that
has internal linkage by default, so it's as if you had made it static.