public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* New @ linker scripts
       [not found] <53997BB8.2030304@wtw-electronic.at>
@ 2014-06-12 10:08 ` Reinhard Kager
  2014-06-13 15:29   ` Nicholas Clifton
  0 siblings, 1 reply; 3+ messages in thread
From: Reinhard Kager @ 2014-06-12 10:08 UTC (permalink / raw)
  To: binutils

Hello mailing list,

i am pretty new in linker scripts so i went through the documentation. 
Til now my IDE (HEW for Renesas Micros) was handling this but for a new 
project I might need a linker script, but unfortunately it seems not 
that easy at it looks like in the doc:

SECTIONS {
   outputa 0x10000 :
     {
     all.o
     foo.o (.input1)
     }
   outputb :
     {
     foo.o (.input2)
     foo1.o (.input1)
     }
   outputc :
     {
*(.input1)
*(.input2)
     }
}

This is the description of putting files and parts of files into a 
specific section. If I do so, i get a "multiple
definition of" error from the linker for my function which is in the uart.o

   mySection 0x07800000 : AT (0x07800000)
   {
     uart.o
*(mySectionFunctions)

   }
   .text 0xFFFF0100 : AT (0xFFFF0100)
   {
     *(.text)
*(.text.*)
     *(P)
     etext = .;
   }


Another question is about archive files. Can i map this at once in a 
section or do I have to get the .o files and map all of them?

I thought gcc is using .text for function code and .rodata for read only 
const data. But there is also data which is marked as C in the map file. 
Bizarrely if i map a function via an attribute into a section, the C 
data for this function (I guess this are jumpTables for example of 
switch statements) stay in the C section. So I have to map this again 
manually, like this?

   mySection 0x07800000 : AT (0x07800000)
   {
     uart.o
     uart.o (C)
*(mySectionFunctions)

   }
.rodata :
   {
*(.rodata)
*(.rodata.*)
     *(C_1)
     *(C_2)
     *(C)
     _erodata = .;
   }

Thanks a lot for your help, as I cannot find a solutions in the internet 
for this.

Reinhard

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: New @ linker scripts
  2014-06-12 10:08 ` New @ linker scripts Reinhard Kager
@ 2014-06-13 15:29   ` Nicholas Clifton
  2014-06-17 11:42     ` Reinhard Kager
  0 siblings, 1 reply; 3+ messages in thread
From: Nicholas Clifton @ 2014-06-13 15:29 UTC (permalink / raw)
  To: Reinhard Kager, binutils

Hi Reinhard,

> i am pretty new in linker scripts

Welcome to the world of linkers...

> specific section. If I do so, i get a "multiple
> definition of" error from the linker for my function which is in the uart.o
>
>    mySection 0x07800000 : AT (0x07800000)
>    {
>      uart.o
> *(mySectionFunctions)
>
>    }
>    .text 0xFFFF0100 : AT (0xFFFF0100)
>    {
>      *(.text)
> *(.text.*)
>      *(P)
>      etext = .;
>    }

This is because the "*(.text)" is matching the .text section in the 
uart.o file which has already been allocated to the mySection section. 
Fortunately there is a simple solution - exclude it - like this:

   .text 0xFFFF0100 : AT (0xFFFF0100)
    {
      *(EXCLUDE_FILE (usrt.o) .text)
      *(EXCLUDE_FILE (uart.o) .text.*)
      *(P)
      etext = .;
   }


> Another question is about archive files. Can i map this at once in a
> section or do I have to get the .o files and map all of them?

You can map them all at once in a section.  Note - normally you do not 
need to reference archives in a linker script.  Selected contents of an 
archive are automatically pulled in by the linker as they are needed in 
order to resolve unresolved references.  If you do need to refer to an 
archive however you can do so using a colon character as in:

   lib:file

refers to a file called "file" inside an archive called "lib".  Or:

   lib:

refers to the entire contents of an archive called "lib".

So, for example:

   .mysection { lib:(.text) }

will place all of the code (but not the data) from an archive called 
"lib" into a section called .mysection.



> I thought gcc is using .text for function code and .rodata for read only
> const data. But there is also data which is marked as C in the map file.

Blame Renesas - it is their fault.  Their tools use sections called  P 
for program code, C for read-only data, D for writeable data and B for 
uninitialised data.  So in order to be compatible with Renesas tools 
gcc, by default, uses these section names.  There are command line 
options to change this however.


> Bizarrely if i map a function via an attribute into a section, the C
> data for this function (I guess this are jumpTables for example of
> switch statements) stay in the C section. So I have to map this again
> manually, like this?
>
>    mySection 0x07800000 : AT (0x07800000)
>    {
>      uart.o
>      uart.o (C)
> *(mySectionFunctions)
>
>    }

This would be a bug... :-)

Feel free to create a gcc bug report for the problem and maybe the RX 
port maintainer will fix it.  If not you can always ping me...

Cheers
   Nick


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: New @ linker scripts
  2014-06-13 15:29   ` Nicholas Clifton
@ 2014-06-17 11:42     ` Reinhard Kager
  0 siblings, 0 replies; 3+ messages in thread
From: Reinhard Kager @ 2014-06-17 11:42 UTC (permalink / raw)
  To: Nicholas Clifton, binutils

Hi nick

thanks a lot for your support. Works pretty good now :)

So I can use an USB mass storage stack now via 2 applications 
(bootloader and user application), this saves a lot of flash.

Thanks again
Reinhard

PS.: section file if somebody is interested

OUTPUT_ARCH(rx)
SECTIONS
{
     .fvectors 0xFFFFFFA0 : AT (0xFFFFFFA0)
     {
         KEEP(*(.fvectors))
     }
     .text 0xFFFF0100 : AT (0xFFFF0100)
     {
         *(P)
         *(EXCLUDE_FILE (*r_usb_*.o *ff.o *lowsrc.o  *diskio_usb.o 
*rsk.o) C)
         *(EXCLUDE_FILE (*libc.a:lib_a-strcmp.o) .text)
         *(EXCLUDE_FILE (*libc.a:lib_a-strcmp.o) .text.*)
         etext = .;
     }
     .rvectors :
     {
         _rvectors_start = .;
         KEEP(*(.rvectors))
         _rvectors_end = .;
     }
     .init :
     {
         *(.init)
         __preinit_array_start = .;
         *(.preinit_array)
         __preinit_array_end = .;
         __init_array_start = (. + 3) & ~ 3;
         *(.init_array)
         *(SORT(.init_array.*))
         __init_array_end = .;
         __fini_array_start = .;
         *(.fini_array)
         *(SORT(.fini_array.*))
         __fini_array_end = .;
     }
     .fini :
     {
         *(.fini)
     }
     .got :
     {
         *(.got)
         *(.got.plt)
     }
     .rodata :
     {
         *(.rodata)
         *(.rodata.*)
         *(C_1)
         *(C_2)
         _erodata = .;
     }

     .eh_frame_hdr :
     {
         *(.eh_frame_hdr)
     }
     .eh_frame :
     {
         *(.eh_frame)
     }
     .jcr :
     {
         *(.jcr)
     }
     .tors :
     {
         __CTOR_LIST__ = .;
         ___ctors = .;
         *(.ctors)
         ___ctors_end = .;
         __CTOR_END__ = .;
         __DTOR_LIST__ = .;
         ___dtors = .;
         *(.dtors)
         ___dtors_end = .;
         __DTOR_END__ = .;
         _mdata = .;
     }
     USB_STICK_SECTION 0x07800000 : AT (0x07800000)
     {
         *(.text)
         *(.text.*)
         *(C)
         *(USB_STICK_SECTION)
         *(const_USB_STICK_SECTION)
         _mdataUSB  = .;
     }
     .istack 0x00016000 : AT (0x00016000)
     {
         _istack = .;
     }
     .ustack 0x00014000 : AT (0x00014000)
     {
         _ustack = .;
     }
     .data 0x00005000 : AT (_mdata)
     {
         _data = .;
         *(.data)
         *(.data.*)
         *(EXCLUDE_FILE (*r_usb_*.o *ff.o *lowsrc.o *diskio_usb.o *rsk.o) D)
         *(D_1)
         *(D_2)
         _edata = .;
     }
     .gcc_exc :
     {
         *(.gcc_exc)
     }
     .bss :
     {
         _bss = .;
         *(.bss)
         *(.bss.*)
         *(EXCLUDE_FILE (*r_usb_*.o *ff.o *lowsrc.o *diskio_usb.o 
*rsk.o) COMMON)
         *(EXCLUDE_FILE (*r_usb_*.o *ff.o *lowsrc.o *diskio_usb.o *rsk.o) B)
         *(EXCLUDE_FILE (*r_usb_*.o *ff.o *lowsrc.o *diskio_usb.o 
*rsk.o) B_1)
         *(EXCLUDE_FILE (*r_usb_*.o *ff.o *lowsrc.o *diskio_usb.o 
*rsk.o) B_2)
         _ebss = .;
         _end = .;
     }
     usbData 0x00000001 : AT (_mdataUSB)
     {
         _dataUSB = .;
         *(D)
         _edataUSB = .;
     }
     usbRAM :
     {
         _bssUSB = .;
         *(COMMON)
         *(B)
         *(B_1)
         *(B_2)
         _ebssUSB = .;
     }
     usbSelector :
     {
         usbSelector = .;
         *(ram_USB_STICK_SECTION)
     }
     Reserved 0xFFFFF000 : AT (0xFFFFF000)
     {
         LastBlockEB00 = .;
     }
     USB_STICK_BOOT_SECTION 0xFFFF0000 : AT (0xFFFF0000)
     {
         USB_STICK_BOOT_SECTION = .;
     }
}

Am 13.06.2014 17:29, schrieb Nicholas Clifton:
> Hi Reinhard,
>
>> i am pretty new in linker scripts
>
> Welcome to the world of linkers...
>
>> specific section. If I do so, i get a "multiple
>> definition of" error from the linker for my function which is in the 
>> uart.o
>>
>>    mySection 0x07800000 : AT (0x07800000)
>>    {
>>      uart.o
>> *(mySectionFunctions)
>>
>>    }
>>    .text 0xFFFF0100 : AT (0xFFFF0100)
>>    {
>>      *(.text)
>> *(.text.*)
>>      *(P)
>>      etext = .;
>>    }
>
> This is because the "*(.text)" is matching the .text section in the 
> uart.o file which has already been allocated to the mySection section. 
> Fortunately there is a simple solution - exclude it - like this:
>
>   .text 0xFFFF0100 : AT (0xFFFF0100)
>    {
>      *(EXCLUDE_FILE (usrt.o) .text)
>      *(EXCLUDE_FILE (uart.o) .text.*)
>      *(P)
>      etext = .;
>   }
>
>
>> Another question is about archive files. Can i map this at once in a
>> section or do I have to get the .o files and map all of them?
>
> You can map them all at once in a section.  Note - normally you do not 
> need to reference archives in a linker script.  Selected contents of 
> an archive are automatically pulled in by the linker as they are 
> needed in order to resolve unresolved references.  If you do need to 
> refer to an archive however you can do so using a colon character as in:
>
>   lib:file
>
> refers to a file called "file" inside an archive called "lib". Or:
>
>   lib:
>
> refers to the entire contents of an archive called "lib".
>
> So, for example:
>
>   .mysection { lib:(.text) }
>
> will place all of the code (but not the data) from an archive called 
> "lib" into a section called .mysection.
>
>
>
>> I thought gcc is using .text for function code and .rodata for read only
>> const data. But there is also data which is marked as C in the map file.
>
> Blame Renesas - it is their fault.  Their tools use sections called  P 
> for program code, C for read-only data, D for writeable data and B for 
> uninitialised data.  So in order to be compatible with Renesas tools 
> gcc, by default, uses these section names. There are command line 
> options to change this however.
>
>
>> Bizarrely if i map a function via an attribute into a section, the C
>> data for this function (I guess this are jumpTables for example of
>> switch statements) stay in the C section. So I have to map this again
>> manually, like this?
>>
>>    mySection 0x07800000 : AT (0x07800000)
>>    {
>>      uart.o
>>      uart.o (C)
>> *(mySectionFunctions)
>>
>>    }
>
> This would be a bug... :-)
>
> Feel free to create a gcc bug report for the problem and maybe the RX 
> port maintainer will fix it.  If not you can always ping me...
>
> Cheers
>   Nick
>
>


-- 
Ing. Reinhard Kager, BSc
Forschung und Entwicklung
   
WTW electronic GmbH
Entwicklungszentrum Graz
Reininghausstraße 5/17
8020 Graz
Email:     reinhard.kager@wtw-electronic.at
Website:   www.wtw-electronic.at

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-06-17 11:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <53997BB8.2030304@wtw-electronic.at>
2014-06-12 10:08 ` New @ linker scripts Reinhard Kager
2014-06-13 15:29   ` Nicholas Clifton
2014-06-17 11:42     ` Reinhard Kager

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).