ld maps sections without consider memory region?

Nick Clifton nickc@redhat.com
Thu Feb 15 15:34:00 GMT 2007


Hi Masaki,

> I've not learn Dejagnu, so I attach small example.

Thanks - this was what I needed.

> I expect section mappings like this:
> | Section to Segment mapping:
> |  Segment Sections...
> |   00     .begin
> |   01     .tail
> But sections are combined actually.

This is because you have not defined the program headers for your 
executable, so the linker has created one.  Since on the MIPS pages are 
0x10000 in size the linker creates just one segment to contain both the 
.begin and the .tail sections.

The answer is to specify your own program headers in the linker script, 
so that you can be sure that you get the separation you want.  So with 
the test case you supplied if you replace the script.ld file with this 
version:
---------------------------------------------------------
MEMORY {
         REGION_ROM1     : ORIGIN = 0x0000, LENGTH = 0x080
         REGION_ROM2     : ORIGIN = 0x0100, LENGTH = 0x800
         REGION_OTHER    : ORIGIN = 0x2000, LENGTH = 0x080
}

PHDRS {
       SEG_ROM1	PT_LOAD ;
       SEG_ROM2	PT_LOAD ;
       SEG_OTHER	PT_LOAD ;
}

SECTIONS {
         .begin : {
                 begin.o(.text);
         } > REGION_ROM1 : SEG_ROM1
         .tail : {
                 tail.o(.text);
         } > REGION_ROM2 : SEG_ROM2

	/* dummy */
         .data : { } > REGION_OTHER : SEG_OTHER
         .bss : { } > REGION_OTHER : SEG_OTHER
}
--------------------------------------------------------
Then when you run readelf on the linked executable you will see:

Program Headers:
   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
   LOAD           0x000074 0x00000000 0x00000000 0x00004 0x00004 R E 0x4
   LOAD           0x000078 0x00000100 0x00000100 0x00004 0x00004 R E 0x4

  Section to Segment mapping:
   Segment Sections...
    00     .begin
    01     .tail


Cheers
   Nick



More information about the Binutils mailing list