> -----Ursprüngliche Nachricht----- > Von: Gcc-help <gcc-help-bounces+bebbo=bejy.net@xxxxxxxxxxx> Im > Auftrag von David Brown > Gesendet: Freitag, 25. Februar 2022 18:57 > An: Martin Sebor <msebor@xxxxxxxxx>; Henrique Coser > <henrique.coser@xxxxxxxxxx>; gcc-help@xxxxxxxxxxx > Betreff: Re: Constant at fixed address > > On 25/02/2022 17:45, Martin Sebor via Gcc-help wrote: > > On 2/25/22 09:01, Henrique Coser wrote: > >> Hello, > >> > >> I need a help. I'm trying to solve a problem for weeks. > >> I have a embeded software that is a boot loader. It puts the boot > >> load version at a specific address. > >> My memmory starts at 0x400000 with 0x1400 size. My constant version > >> string value must be placed @0x401000 with 8bytes length. > >> If I place this const value into a section like this: > >> > >> const unsigned char Version[8] __attribute__ ((section > >> (".bootversion"))) = "V1.0.1a"; > >> > >> I got this error: > >> > >> section .bootversion LMA [00401000,00401007] overlaps section .text > >> LMA [00400000,00401013]collect2.exe(0,0): error: ld returned 1 exit > >> status > >> > >> I have already tried to split flash memmory using linker script but > >> it does not worked. > >> I wish to find something like "automatic" split. > >> > >> For example, this code was compiled using ARM Keil. With ARM Keil I > >> have the attribute that makes all the magic : > >> const unsigned char Version[8] __attribute__((at(0x0401000))) = > >> "V1.0.1a"; > >> > >> I dont know if is possible to have something as pratical as ARM Keil > >> attribute in GCC. > > > > GCC for the AVR target supports a couple of attributes that can be > > used to pin a variable declaration to a fixed address: address and io. > > It doesn't look to me like they're put in their own sections like in > > the ARM Keil compiler (but the section attribute can be used for > > that). > > > > Beside your use case, exposing at least the address attribute in all > > targets would make would also solve a long-standing problem with GCC > > issuing warnings for accesses to hardwired addresses). > > > > I suggest opening an enhancement request in Bugzilla. > > > > Martin > > > > > > I second that request - it would definitely be convenient to be able to put a > variable or section at a specific address without having to modify a linker > script. This is a feature that most embedded toolchains (Keil, IAR, etc.) > support. > > Note that the attributes for the AVR here don't do what is needed, as far as I > can see - it looks like they declare the variable at the given address, but that > does not mean that there will be an absolute section allocated in the link. In > other words, using the AVR "address" > attribute to put "Version" at address 0x0401000 will not actually put the > initialised data there, nor will it prevent the address being used by anything > else that is linked to that memory area. > > The example for the "address" attribute is : > > volatile int porta __attribute__((address (0x600))); > > The effect of this is very similar to the more common and portable version > used for other targets: > > #define porta *((volatile int *) 0x600) > > Henrique needs more than that here. > > AFAIK, Henrique, the only way to achieve your needs are a modified linker > script. It's not hard to do that, but of course it looks hard the first time you > do it! Post a copy of your current linker script and I can try to give you ideas > for modification. > > Isn't this already possible by using a section: volatile int porta __attribute__((__section("section_600"))); and using an appropriate linker script? SECTIONS { .section_600 0x600: { *(.section_600) ... Stefan