This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Strange linker problem after updating binutils and gcc


Hello,
I'm using gcc with binutils in Rowley Crossworks for ARM 1.7 IDE for
arm development. Unfortunately there is very old version of gcc
(4.1.1) and binutils (2.17) in this IDE, so I decided to upgrade to
gcc 4.4.4 and binutils 20.20.51 (I tried more versions but all are
affected)

Unfortunately there is a problem with linking in new version.
In first try, linker generated warning "dot moved backwards before..."
so I solved it with proper ordering of sections in ld script,
unfortunately there is still an error because the generated elf file
is wrong - some data are written in high addresses, resulting bin file
has size of 500MB instead of 500kB.

ld is invoked with following params:

ld -X -nostdlib -ereset_handler --omagic --fatal-warnings -EL
-Te:/_dev/_kamera/JR1_git/_tmp_JR615 Flash Debug/JR615 Flash
Debug.1.8.23.2.h263.ld -Map _JR615 Flash Debug//JR615 Flash
Debug.1.8.23.2.h263.map -u_vectors -o _JR615 Flash Debug//JR615 Flash
Debug.1.8.23.2.h263.elf --start-group ...

and ld script:
MEMORY
{
  UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0
  SDRAM (wx) : ORIGIN = 0x20000000, LENGTH = 0x02000000
  Reserved (wx) : ORIGIN = 0x90000000, LENGTH = 0x60000000
  SRAM1 (wx) : ORIGIN = 0x00300000, LENGTH = 0x00001000
  SRAM0 (wx) : ORIGIN = 0x00200000, LENGTH = 0x00001000
}

INTERNAL_SRAM_START_ADDRESS = 0x00200000;
SDRAM_START_ADDRESS = 0x20000000;
SDRAM_LENGTH = 0x02000000;

SECTIONS
{
  __SDRAM_segment_start__ = 0x20000000;
  __SDRAM_segment_end__ = 0x22000000;
  __Reserved_segment_start__ = 0x90000000;
  __Reserved_segment_end__ = 0xf0000000;
  __SRAM1_segment_start__ = 0x00300000;
  __SRAM1_segment_end__ = 0x00301000;
  __SRAM0_segment_start__ = 0x00200000;
  __SRAM0_segment_end__ = 0x00201000;

  __STACKSIZE__ = 512000;
  __STACKSIZE_IRQ__ = 128000;
  __STACKSIZE_FIQ__ = 4096;
  __STACKSIZE_SVC__ = 4096;
  __STACKSIZE_ABT__ = 4096;
  __STACKSIZE_UND__ = 4096;
  __HEAPSIZE__ = 4000000;

  __vectors_ram_load_start__ = 0x00200000;
  .vectors_ram 0x00200000 (NOLOAD) :
  {
    __vectors_ram_start__ = .;
    *(.vectors_ram)
    . = MAX(__vectors_ram_start__ + 0x3C , .);
  }
  __vectors_ram_end__ = __vectors_ram_start__ + SIZEOF(.vectors_ram);

  . = ASSERT(__vectors_ram_end__ >= __SRAM0_segment_start__ &&
__vectors_ram_end__ <= (__SRAM0_segment_start__ + 0x00001000) ,
"error: .vectors_ram is too large to fit in SRAM0 memory segment");

  __sram_noninit_data_load_start__ = 0x00200040;
  .sram_noninit_data 0x00200040 (NOLOAD) :
  {
    __sram_noninit_data_start__ = .;
    *(.sram_noninit_data)
    . = MAX(__sram_noninit_data_start__ + 0xbb8 , .);
  }
  __sram_noninit_data_end__ = __sram_noninit_data_start__ +
SIZEOF(.sram_noninit_data);

  . = ASSERT(__sram_noninit_data_end__ >= __SRAM0_segment_start__ &&
__sram_noninit_data_end__ <= (__SRAM0_segment_start__ + 0x00001000) ,
"error: .sram_noninit_data is too large to fit in SRAM0 memory
segment");

  . = ASSERT(__vectors_ram_end__ <= __sram_noninit_data_start__ ,
"error: section .vectors_ram overlaps absolute placed section
.sram_noninit_data");

  __reserved_debug_handler_load_start__ = 0x00200c00;
  .reserved_debug_handler 0x00200c00 (NOLOAD) :
  {
    __reserved_debug_handler_start__ = .;
    *(.reserved_debug_handler)
    . = MAX(__reserved_debug_handler_start__ + 0x400 , .);
  }
  __reserved_debug_handler_end__ = __reserved_debug_handler_start__ +
SIZEOF(.reserved_debug_handler);

  __SRAM0_segment_used_end__ = 0x00200c00 + SIZEOF(.reserved_debug_handler);

  . = ASSERT(__reserved_debug_handler_end__ >= __SRAM0_segment_start__
&& __reserved_debug_handler_end__ <= (__SRAM0_segment_start__ +
0x00001000) , "error: .reserved_debug_handler is too large to fit in
SRAM0 memory segment");

  . = ASSERT(__sram_noninit_data_end__ <=
__reserved_debug_handler_start__ , "error: section .sram_noninit_data
overlaps absolute placed section .reserved_debug_handler");

  __reserved_mmu_load_start__ = ALIGN(__SDRAM_segment_start__ , 4);
  .reserved_mmu ALIGN(__SDRAM_segment_start__ , 4) (NOLOAD) :
  {
    __reserved_mmu_start__ = .;
    *(.reserved_mmu)
    . = ALIGN(MAX(__reserved_mmu_start__ + 0x4000 , .), 4);
  }
  __reserved_mmu_end__ = __reserved_mmu_start__ + SIZEOF(.reserved_mmu);

  . = ASSERT(__reserved_mmu_end__ >= __SDRAM_segment_start__ &&
__reserved_mmu_end__ <= (__SDRAM_segment_start__ + 0x02000000) ,
"error: .reserved_mmu is too large to fit in SDRAM memory segment");

  __boot_load_start__ = __reserved_mmu_end__;
  .boot __reserved_mmu_end__ :
  {
    __boot_start__ = .;
    *(.boot)
    . = MAX(__boot_start__ + 0x80e8 , .);
  }
  __boot_end__ = __boot_start__ + SIZEOF(.boot);

  . = ASSERT(__boot_end__ >= __SDRAM_segment_start__ && __boot_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .boot is too large
to fit in SDRAM memory segment");

  __vectors_load_start__ = ALIGN(__boot_end__ , 4);
  .vectors ALIGN(__boot_end__ , 4) :
  {
    __vectors_start__ = .;
    *(.vectors .vectors.*)
    . = ALIGN(MAX(__vectors_start__ + 0x108 , .), 4);
  }
  __vectors_end__ = __vectors_start__ + SIZEOF(.vectors);

  . = ASSERT(__vectors_end__ >= __SDRAM_segment_start__ &&
__vectors_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.vectors is too large to fit in SDRAM memory segment");

  __localization_load_start__ = __vectors_end__;
  .localization __vectors_end__ :
  {
    __localization_start__ = .;
    *(.localization)
    . = MAX(__localization_start__ + 0x40f8 , .);
  }
  __localization_end__ = __localization_start__ + SIZEOF(.localization);

  . = ASSERT(__localization_end__ >= __SDRAM_segment_start__ &&
__localization_end__ <= (__SDRAM_segment_start__ + 0x02000000) ,
"error: .localization is too large to fit in SDRAM memory segment");

  __init_load_start__ = ALIGN(__localization_end__ , 4);
  .init ALIGN(__localization_end__ , 4) :
  {
    __init_start__ = .;
    *(.init .init.*)
  }
  __init_end__ = __init_start__ + SIZEOF(.init);

  . = ASSERT(__init_end__ >= __SDRAM_segment_start__ && __init_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .init is too large
to fit in SDRAM memory segment");

  __text_load_start__ = ALIGN(__init_end__ , 4);
  .text ALIGN(__init_end__ , 4) :
  {
    __text_start__ = .;
    *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.*)
  }
  __text_end__ = __text_start__ + SIZEOF(.text);

  . = ASSERT(__text_end__ >= __SDRAM_segment_start__ && __text_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .text is too large
to fit in SDRAM memory segment");

  __dtors_load_start__ = ALIGN(__text_end__ , 4);
  .dtors ALIGN(__text_end__ , 4) :
  {
    __dtors_start__ = .;
    KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors))
  }
  __dtors_end__ = __dtors_start__ + SIZEOF(.dtors);

  . = ASSERT(__dtors_end__ >= __SDRAM_segment_start__ && __dtors_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .dtors is too
large to fit in SDRAM memory segment");

  __ctors_load_start__ = ALIGN(__dtors_end__ , 4);
  .ctors ALIGN(__dtors_end__ , 4) :
  {
    __ctors_start__ = .;
    KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors))
  }
  __ctors_end__ = __ctors_start__ + SIZEOF(.ctors);

  . = ASSERT(__ctors_end__ >= __SDRAM_segment_start__ && __ctors_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .ctors is too
large to fit in SDRAM memory segment");

  __fast_load_start__ = ALIGN(__ctors_end__ , 4);
  .fast ALIGN(__SRAM1_segment_start__ , 4) : AT(ALIGN(__ctors_end__ , 4))
  {
    __fast_start__ = .;
    *(.fast .fast.*)
  }
  __fast_end__ = __fast_start__ + SIZEOF(.fast);

  __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast);

  . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >=
__SDRAM_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <=
(__SDRAM_segment_start__ + 0x02000000) , "error: .fast is too large to
fit in SDRAM memory segment");

  .fast_run ALIGN(__SRAM1_segment_start__ , 4) (NOLOAD) :
  {
    __fast_run_start__ = .;
    . = MAX(__fast_run_start__ + SIZEOF(.fast), .);
  }
  __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run);

  __SRAM1_segment_used_end__ = ALIGN(__SRAM1_segment_start__ , 4) +
SIZEOF(.fast_run);

  . = ASSERT(__fast_run_end__ >= __SRAM1_segment_start__ &&
__fast_run_end__ <= (__SRAM1_segment_start__ + 0x00001000) , "error:
.fast_run is too large to fit in SRAM1 memory segment");

  __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4);
  .data ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) :
  {
    __data_start__ = .;
    *(.data .data.* .gnu.linkonce.d.*)
  }
  __data_end__ = __data_start__ + SIZEOF(.data);

  . = ASSERT(__data_end__ >= __SDRAM_segment_start__ && __data_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .data is too large
to fit in SDRAM memory segment");

  __rodata_load_start__ = ALIGN(__data_end__ , 4);
  .rodata ALIGN(__data_end__ , 4) :
  {
    __rodata_start__ = .;
    *(.rodata .rodata.* .gnu.linkonce.r.*)
  }
  __rodata_end__ = __rodata_start__ + SIZEOF(.rodata);

  . = ASSERT(__rodata_end__ >= __SDRAM_segment_start__ &&
__rodata_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.rodata is too large to fit in SDRAM memory segment");

  __bss_load_start__ = ALIGN(__rodata_end__ , 4);
  .bss ALIGN(__rodata_end__ , 4) (NOLOAD) :
  {
    __bss_start__ = .;
    *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON)
  }
  __bss_end__ = __bss_start__ + SIZEOF(.bss);

  . = ASSERT(__bss_end__ >= __SDRAM_segment_start__ && __bss_end__ <=
(__SDRAM_segment_start__ + 0x02000000) , "error: .bss is too large to
fit in SDRAM memory segment");

  __text_user_load_start__ = ALIGN(__bss_end__ , 4);
  .text_user ALIGN(__bss_end__ , 4) (NOLOAD) :
  {
    __text_user_start__ = .;
    *(.text_user)
  }
  __text_user_end__ = __text_user_start__ + SIZEOF(.text_user);

  . = ASSERT(__text_user_end__ >= __SDRAM_segment_start__ &&
__text_user_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.text_user is too large to fit in SDRAM memory segment");

  __non_init_load_start__ = ALIGN(__text_user_end__ , 4);
  .non_init ALIGN(__text_user_end__ , 4) (NOLOAD) :
  {
    __non_init_start__ = .;
    *(.non_init .non_init.*)
  }
  __non_init_end__ = __non_init_start__ + SIZEOF(.non_init);

  . = ASSERT(__non_init_end__ >= __SDRAM_segment_start__ &&
__non_init_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.non_init is too large to fit in SDRAM memory segment");

  __heap_load_start__ = ALIGN(__non_init_end__ , 4);
  .heap ALIGN(__non_init_end__ , 4) (NOLOAD) :
  {
    __heap_start__ = .;
    *(.heap)
    . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4);
  }
  __heap_end__ = __heap_start__ + SIZEOF(.heap);

  . = ASSERT(__heap_end__ >= __SDRAM_segment_start__ && __heap_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .heap is too large
to fit in SDRAM memory segment");

  __stack_load_start__ = ALIGN(__heap_end__ , 4);
  .stack ALIGN(__heap_end__ , 4) (NOLOAD) :
  {
    __stack_start__ = .;
    *(.stack)
    . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4);
  }
  __stack_end__ = __stack_start__ + SIZEOF(.stack);

  . = ASSERT(__stack_end__ >= __SDRAM_segment_start__ && __stack_end__
<= (__SDRAM_segment_start__ + 0x02000000) , "error: .stack is too
large to fit in SDRAM memory segment");

  __stack_irq_load_start__ = ALIGN(__stack_end__ , 4);
  .stack_irq ALIGN(__stack_end__ , 4) (NOLOAD) :
  {
    __stack_irq_start__ = .;
    *(.stack_irq)
    . = ALIGN(MAX(__stack_irq_start__ + __STACKSIZE_IRQ__ , .), 4);
  }
  __stack_irq_end__ = __stack_irq_start__ + SIZEOF(.stack_irq);

  . = ASSERT(__stack_irq_end__ >= __SDRAM_segment_start__ &&
__stack_irq_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.stack_irq is too large to fit in SDRAM memory segment");

  __stack_fiq_load_start__ = ALIGN(__stack_irq_end__ , 4);
  .stack_fiq ALIGN(__stack_irq_end__ , 4) (NOLOAD) :
  {
    __stack_fiq_start__ = .;
    *(.stack_fiq)
    . = ALIGN(MAX(__stack_fiq_start__ + __STACKSIZE_FIQ__ , .), 4);
  }
  __stack_fiq_end__ = __stack_fiq_start__ + SIZEOF(.stack_fiq);

  . = ASSERT(__stack_fiq_end__ >= __SDRAM_segment_start__ &&
__stack_fiq_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.stack_fiq is too large to fit in SDRAM memory segment");

  __stack_svc_load_start__ = ALIGN(__stack_fiq_end__ , 4);
  .stack_svc ALIGN(__stack_fiq_end__ , 4) (NOLOAD) :
  {
    __stack_svc_start__ = .;
    *(.stack_svc)
    . = ALIGN(MAX(__stack_svc_start__ + __STACKSIZE_SVC__ , .), 4);
  }
  __stack_svc_end__ = __stack_svc_start__ + SIZEOF(.stack_svc);

  . = ASSERT(__stack_svc_end__ >= __SDRAM_segment_start__ &&
__stack_svc_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.stack_svc is too large to fit in SDRAM memory segment");

  __stack_abt_load_start__ = ALIGN(__stack_svc_end__ , 4);
  .stack_abt ALIGN(__stack_svc_end__ , 4) (NOLOAD) :
  {
    __stack_abt_start__ = .;
    *(.stack_abt)
    . = ALIGN(MAX(__stack_abt_start__ + __STACKSIZE_ABT__ , .), 4);
  }
  __stack_abt_end__ = __stack_abt_start__ + SIZEOF(.stack_abt);

  . = ASSERT(__stack_abt_end__ >= __SDRAM_segment_start__ &&
__stack_abt_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.stack_abt is too large to fit in SDRAM memory segment");

  __stack_und_load_start__ = ALIGN(__stack_abt_end__ , 4);
  .stack_und ALIGN(__stack_abt_end__ , 4) (NOLOAD) :
  {
    __stack_und_start__ = .;
    *(.stack_und)
    . = ALIGN(MAX(__stack_und_start__ + __STACKSIZE_UND__ , .), 4);
  }
  __stack_und_end__ = __stack_und_start__ + SIZEOF(.stack_und);

  . = ASSERT(__stack_und_end__ >= __SDRAM_segment_start__ &&
__stack_und_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.stack_und is too large to fit in SDRAM memory segment");

  __exceptions_log_load_start__ = 0x21eff000;
  .exceptions_log 0x21eff000 (NOLOAD) :
  {
    __exceptions_log_start__ = .;
    *(.exceptions_log)
    . = MAX(__exceptions_log_start__ + 0x1000 , .);
  }
  __exceptions_log_end__ = __exceptions_log_start__ + SIZEOF(.exceptions_log);

  . = ASSERT(__exceptions_log_end__ >= __SDRAM_segment_start__ &&
__exceptions_log_end__ <= (__SDRAM_segment_start__ + 0x02000000) ,
"error: .exceptions_log is too large to fit in SDRAM memory segment");

  . = ASSERT(__stack_und_end__ <= __exceptions_log_start__ , "error:
section .stack_und overlaps absolute placed section .exceptions_log");

  __nocache_load_start__ = 0x21f00000;
  .nocache 0x21f00000 (NOLOAD) :
  {
    __nocache_start__ = .;
    *(.nocache)
  }
  __nocache_end__ = __nocache_start__ + SIZEOF(.nocache);

  __SDRAM_segment_used_end__ = 0x21f00000 + SIZEOF(.nocache);

  . = ASSERT(__nocache_end__ >= __SDRAM_segment_start__ &&
__nocache_end__ <= (__SDRAM_segment_start__ + 0x02000000) , "error:
.nocache is too large to fit in SDRAM memory segment");

  . = ASSERT(__exceptions_log_end__ <= __nocache_start__ , "error:
section .exceptions_log overlaps absolute placed section .nocache");

}

Could anyone please give me any hint how to solve this problem?

best regards
Jan


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]