On 25/02/2022 19:18, stefan@xxxxxxxxx wrote: > > >> -----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 > Exactly, yes. The point is that with gcc (and standard binutils) you need to modify (or suppliment) the linker script to do this. The OP is used to a toolchain where you can specify this using an attribute in the compiler alone, which is neater.