Cross debugger and load address (want download to VMA, not LMA)
Duane Ellis
duane@franklin.com
Mon Apr 19 12:44:00 GMT 2004
toralf>> If not, is there any way to produce a version of the binary
with LMA = VMA for .text and .data, besides relinking with a
separate linker script?
You might want to try something like this: Note that the MY_ROM_START
is a SYMBOL - and it is not defined in the linker script, instead
define it on the linker command line.
>> SECTIONS {
>> . = MY_ROM_START;
>> .vectors : { *(.vectors) }
>> . = MY_TEXT_START;
>>
>> [snip]
>> }
For info about the .vectors segment see:
>> http://sources.redhat.com/ml/crossgcc/2004-03/msg00194.html
>> http://sources.redhat.com/ml/crossgcc/2004-03/msg00195.html
Then, specify the value these symbols on the LINKER command line
>> ld --defsym=MY_ROM_START=0x123456 --defsym=MY_LMA=0x654321 \
>> --script=./MyLinkerScript
The trick of this is: On the LD command line the --defsym statements
must occure *BEFORE* the --script option, not the other way around.
There are other helpful tricks you can do with --defsym too.
Some people like to tag date/time builds with the built in __DATE__
and __TIME__. PROBLEM: These sometimes end up in a stale .o file that
gets out of sync with real life. SOLUTION: Functionally equivlent
method on the linker command line is like this:
>> ld ... options ... \
>> --defsym __LINK_DATE__=`date +"0x%Y%m%d"` \
>> --defsym __LINK_TIME__=`date +"0x%H%M%S"` \
>> --defsym __LINK_TIMESTAMP__=`date +"%s"`
Or with GCC, you use these options:
>> gcc ... options ... \
>> -Wl,--defsym,__LINK_DATE__=`date +"0x%Y%m%d"` \
>> -Wl,--defsym,__LINK_TIME__=`date +"0x%H%M%S"` \
>> -Wl,--defsym,__LINK_TIMESTAMP__=`date +"%s"` \
You could also add a few others - much like your problem - of
different linked versions - DEBUG vrs FLASH...
>> --defsym __BUILD_TYPE__=0x44454247
>> or --defsym __BUILD_TYPE__=0x464C5548
In this case, the hex numbers are ascii for DEBG and FLSH...
In your C code, you reference them like this:
>> extern const char __LINK_DATE__[];
>> extern const char __LINK_TIME__[];
>> printf("BUILT: %08lx %08lx\n",
>> (unsigned long)(&__LINK_DATE__[0]),
>> (unsigned long)(&__LINK_TIME__[0]) );
Or - insert them into variables like this:
>> extern char __BUILD_TYPE__[];
>>
>> unsigned long build_type = (unsigned long)(&__BUILD_TYPE__[0]));
-Duane.
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com
More information about the crossgcc
mailing list