A static global is no problem. BUT if I remove the "static" declaration, arm-elf-ld puts the global along with other non-static globals in a section starting at memory address 0. You can imagine that this is a Very Bad Thing. The behavior occurs with a linker command file that looks like the following. Interestingly, if the IROM_or_IRAM memory region is omitted from the command file, the non-static globals are put someplace sane. But the command file never mentions that anything should be put in IROM_or_IRAM -- so why does the presence of that informational line alter how the loader behaves? I'm aware there are other ways to write a linker command file, but is this approach wrong? Why should static or non-static make a difference to the linker? Isn't a .bss a .bss? Well, I'll just remove the informational IROM_or_IRAM line, it doesn't need to be there anyway. Thanks for any insights! --Bill ******** arm-elf-ld command file ******** ENTRY(main) MEMORY { IROM_or_IRAM (RWX): ORIGIN = 0, LENGTH = 64K /* On-chip */ IRAM (RWX): ORIGIN = 0x08000000, LENGTH = 64K /* Direct access */ } SECTIONS { .bundle : { *(.vectors) *(.text) *(.rodata*) *(.glue*) _end_rodata = .; *(.data) *(.bss) } > IRAM } ******** sample code ******** volatile int aGlobal; int main () { aGlobal = 1; return (aGlobal); } ******** arm-elf-nm output of the above ******** 0800002c T _end_rodata 00000000 B aGlobal <----- HELP! 08000000 T main ******** arm-elf-nm output if "static" inserted before "volatile int" ******** 0800002c T _end_rodata 0800002c t aGlobal <----- THAT'S MORE LIKE IT 08000000 T main
Forgot to mention: this was using arm-elf-gcc version 4.1.0 and arm-elf-ld version 2.16.1, both compiled for Mac OS X (downloaded from this site). --Bill
Add *(COMMON) after the *(bss)-Line - this should "help". Try to generate a map-file if in doubt about section-assignment and placement. The output might be a little confusing in the beginning but there is a lot of useful information in it. Martin Thomas
Martin Thomas wrote: > Add *(COMMON) after the *(bss)-Line - this should "help". Ah ha! So the answer to the question "when is a .bss not a .bss" is, "when it's a COMMON." My bad. Interestingly, the output of arm-elf-nm changed from: 0800002c T _end_rodata 00000000 B aGlobal 08000000 T main to: 0800002c T _end_rodata 0800002c T aGlobal 08000000 T main Interesting because nm stops calling aGlobal a "B" for bss and instead calls it a "T" for text. I wonder why in neither case does nm call it a "C" for common, especially as the linker clearly considered it a common. Well, this is just idle musing, it works and I won't complain! For the curious, the GNU ld manual section 3.6.4.3 "Input section for common symbols" goes into this in more detail. I will contact the author of the example script I used and suggest he amend it. > Try to generate a map-file if in doubt about section-assignment and > placement. The output might be a little confusing in the beginning but > there is a lot of useful information in it. I have been doing this quite a bit already but the bad placement of my few common symbols had eluded me. I didn't realize that once a symbol is made common it is no longer considered a .bss. Many thanks!! --Bill
Bill Burgess wrote: Hi Bill! > A static global is no problem. BUT if I remove the "static" > declaration, arm-elf-ld puts the global along with other non-static > globals in a section starting at memory address 0. >
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.