public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Henrique Coser <henrique.coser@tex.com.br>
To: David Brown <david.brown@hesbynett.no>,
	Martin Sebor <msebor@gmail.com>,
	"gcc-help@gcc.gnu.org" <gcc-help@gcc.gnu.org>
Subject: RE: Constant at fixed address
Date: Fri, 25 Feb 2022 21:37:14 +0000	[thread overview]
Message-ID: <FR1PR80MB474479F7C5AA397C0631FBD3BD3E9@FR1PR80MB4744.lamprd80.prod.outlook.com> (raw)
In-Reply-To: <c16b4790-7da1-e721-00dc-00cc7fc81a65@hesbynett.no>

[-- Attachment #1: Type: text/plain, Size: 3978 bytes --]

Martin and David,  thank you for your answers.

Attached is the linker script that I use.

In Keil, where I did the first version of the boot loader I can assure you that a constant value is placed and correctly filled when use __attribute__((at(0x0401000)))
I don't know how they do this but they do!

I would be grateful If you could help me editting this script.

Thank you very much.



Henrique Coser

Engenharia



TEX Equip.Eletronicos Ind.e Com.Ltda.

Fone: (+5511) 4591-2825

henrique.coser@tex.com.br<mailto:compras@tex.com.br>

MEDIR PARA MELHORAR!
________________________________
De: David Brown <david.brown@hesbynett.no>
Enviado: 25 de fevereiro de 2022 14:56
Para: Martin Sebor <msebor@gmail.com>; Henrique Coser <henrique.coser@tex.com.br>; gcc-help@gcc.gnu.org <gcc-help@gcc.gnu.org>
Assunto: 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.




[-- Attachment #2: sam3s4b_flash.ld --]
[-- Type: application/octet-stream, Size: 3166 bytes --]

/* ---------------------------------------------------------------------------- */
/*                  Atmel Microcontroller Software Support                      */
/*                       SAM Software Package License                           */
/* ---------------------------------------------------------------------------- */
/* Copyright (c) %copyright_year%, Atmel Corporation                                        */
/*                                                                              */
/* All rights reserved.                                                         */
/*                                                                              */
/* Redistribution and use in source and binary forms, with or without           */
/* modification, are permitted provided that the following condition is met:    */
/*                                                                              */
/* - Redistributions of source code must retain the above copyright notice,     */
/* this list of conditions and the disclaimer below.                            */
/*                                                                              */
/* Atmel's name may not be used to endorse or promote products derived from     */
/* this software without specific prior written permission.                     */
/*                                                                              */
/* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */
/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */
/* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */
/* ---------------------------------------------------------------------------- */

/*------------------------------------------------------------------------------
 *      Linker script for running in internal FLASH on the ATSAM3S4B
 *----------------------------------------------------------------------------*/

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
SEARCH_DIR(.)

/* Memory Spaces Definitions */
MEMORY
{
  rom (rx)  : ORIGIN = 0x00400000, LENGTH = 0x000013F6      
  ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x0000C000
}

/* The stack size used by the application. NOTE: you need to adjust according to your application. */
STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x400;

/* The heapsize used by the application. NOTE: you need to adjust according to your application. */
HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : 0x200;

INCLUDE sam3s_flash.ld

[-- Attachment #3: sam3s_flash.ld --]
[-- Type: application/octet-stream, Size: 4898 bytes --]

/* ---------------------------------------------------------------------------- */
/*                  Atmel Microcontroller Software Support                      */
/*                       SAM Software Package License                           */
/* ---------------------------------------------------------------------------- */
/* Copyright (c) %copyright_year%, Atmel Corporation                                        */
/*                                                                              */
/* All rights reserved.                                                         */
/*                                                                              */
/* Redistribution and use in source and binary forms, with or without           */
/* modification, are permitted provided that the following condition is met:    */
/*                                                                              */
/* - Redistributions of source code must retain the above copyright notice,     */
/* this list of conditions and the disclaimer below.                            */
/*                                                                              */
/* Atmel's name may not be used to endorse or promote products derived from     */
/* this software without specific prior written permission.                     */
/*                                                                              */
/* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */
/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */
/* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */
/* ---------------------------------------------------------------------------- */

/* Section Definitions */
SECTIONS
{
    .text :
    {
        . = ALIGN(4);
        _sfixed = .;
        KEEP(*(.vectors .vectors.*))
        *(.text .text.* .gnu.linkonce.t.*)
        *(.glue_7t) *(.glue_7)
        *(.rodata .rodata* .gnu.linkonce.r.*)
        *(.ARM.extab* .gnu.linkonce.armextab.*)

        /* Support C constructors, and C destructors in both user code
           and the C library. This also provides support for C++ code. */
        . = ALIGN(4);
        KEEP(*(.init))
        . = ALIGN(4);
        __preinit_array_start = .;
        KEEP (*(.preinit_array))
        __preinit_array_end = .;

        . = ALIGN(4);
        __init_array_start = .;
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array))
        __init_array_end = .;

        . = ALIGN(0x4);
        KEEP (*crtbegin.o(.ctors))
        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
        KEEP (*(SORT(.ctors.*)))        
		KEEP (*crtend.o(.ctors))

        . = ALIGN(4);
        KEEP(*(.fini))
				
        . = ALIGN(4);
        __fini_array_start = .;
        KEEP (*(.fini_array))
        KEEP (*(SORT(.fini_array.*)))
        __fini_array_end = .;

		

        KEEP (*crtbegin.o(.dtors))
        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
        KEEP (*(SORT(.dtors.*)))
        KEEP (*crtend.o(.dtors))

        . = ALIGN(4);
        _efixed = .;            /* End of text section */
    } > rom

    /* .ARM.exidx is sorted, so has to go in its own output section.  */
    PROVIDE_HIDDEN (__exidx_start = .);
    .ARM.exidx :
    {
      *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } > rom
    PROVIDE_HIDDEN (__exidx_end = .);

	. = ALIGN(4);
    _etext = .;
   
	.relocate : AT (_etext)
    {
        . = ALIGN(4);
        _srelocate = .;
        *(.ramfunc .ramfunc.*);
        *(.data .data.*);
        . = ALIGN(4);
        _erelocate = .;
    } > ram

    /* .bss section which is used for uninitialized data */
    .bss (NOLOAD) :
    {
        . = ALIGN(4);
        _sbss = . ;
        _szero = .;
        *(.bss .bss.*)
        *(COMMON)
        . = ALIGN(4);
        _ebss = . ;
        _ezero = .;
    } > ram

    /* stack section */
    .stack (NOLOAD):
    {
        . = ALIGN(8);
        _sstack = .;
        . = . + STACK_SIZE;
        . = ALIGN(8);
        _estack = .;
    } > ram

    /* heap section */
    .heap (NOLOAD):
    {
        . = ALIGN(8);
         _sheap = .;
        . = . + HEAP_SIZE;
        . = ALIGN(8);
        _eheap = .;
    } > ram

    . = ALIGN(4);
    _end = . ;
    _ram_end_ = ORIGIN(ram) + LENGTH(ram) -1 ;
}

  parent reply	other threads:[~2022-02-25 21:37 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-25 16:01 Henrique Coser
2022-02-25 16:45 ` Martin Sebor
2022-02-25 17:56   ` David Brown
2022-02-25 18:18     ` AW: " stefan
2022-02-26 18:56       ` David Brown
2022-02-25 21:37     ` Henrique Coser [this message]
2022-02-26 18:57       ` David Brown
2022-02-28 15:16         ` Henrique Coser
2022-02-28 15:50           ` David Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=FR1PR80MB474479F7C5AA397C0631FBD3BD3E9@FR1PR80MB4744.lamprd80.prod.outlook.com \
    --to=henrique.coser@tex.com.br \
    --cc=david.brown@hesbynett.no \
    --cc=gcc-help@gcc.gnu.org \
    --cc=msebor@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).