relations between Linker and Map File

Nick Clifton nickc@redhat.com
Tue Dec 23 09:46:00 GMT 2008


Hi Dong,

> I'm using as to assemble for source code. This
> requires a file called "filenam.link", : 

Actually it is the linker, not the assembler, that is using this file.

> I think this file is used to decides where the data an
> code will be allocated in memory. 

It is *part* of the process yes.

> But now I want to change it, I want the code area will
> including many areas which are not contiguous in
> memory. I don't know if this is possible. 

First of all read the linker documentation.  Especially the section on 
linker scripts.  The linker script determines how your application is 
laid out in memory.

You may find that it is still difficult to implement exactly what you 
want however, since the linker is not smart enough on its own to 
distribute executable code amongst multiple, non-contiguous, regions of 
memory.

The usual answer to this problem is for the programmer to tell the 
linker which pieces of code should be allocated to which sections of 
memory by assigning each function in the source code to a specific 
section and then having the linker script map these sections to the 
specific memory regions.

So for example the source program might look like this:

   int func (void) __attribute__((section (".code_1")));
   int func (void) { return 7; }
   int main (void) __attribute__((section (".code_2")));
   int main (void) { return func (); }

and the linker script might look something like this:

   MEMORY
   {
      execcode_area_1: o = 0x10002, l = 0x1000
      execcode_area_2: o = 0x30002, l = 0x1000
      dram:   o = 0x20000, l = 0x1000
   }
   SECTIONS
   {
      .code_1 { *(.code_1) } > execcode_area_1
      .code_2 { *(.code_2) } > execcode_area_2
      .data   { *(.data)   } > dram
   }

(This is just an example, not a full linker script...)

Cheers
   Nick




More information about the Binutils mailing list