This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos 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]

eCos using Codesourcery Toolchain


Hi Chris

Thanks again for your help. EABI seems to work fine so far. But I've run in another problem with the codesourcery toolchain, might be cortex specific though. I have a working RedBoot, but it crashes in a few places, because code is compiled wrong. Here are the warning from the linker:

/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-32599)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-32603)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-32603)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-32599)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16335)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16335)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16303)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16303)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16295)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16295)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16263)
/home/simon/ecos/tools/bin/../lib/gcc/arm-none-eabi/4.2.3/../../../../arm-none-eabi/bin/ld: /home/simon/ecos/build/stm32_redboot_install/lib/extras.o: access beyond end of merged section (-16263)


One problem is the fis_usage() function:

fis_usage(char *why)
{
   diag_printf("*** invalid 'fis' command: %s\n", why);
   cmd_usage(__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__, "fis ");
}

The pointer resolution of the string literal ("*** invalid ...") is going wrong (r0 holds a wrong address), so diag_printf() corrupts memory and the whole system crashes. If I replace the function with a marco, the code works properly and I get a few less "access beyond" warnings. There must be other places where things go wrong.

Any ideas here?

I attach my current linker script, as I suppose the mistake could be there.

Best regards,
Simon
//=============================================================================
//
// MLT linker script for ARM Cortex-M1/3
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================

#include <pkgconf/system.h>

STARTUP(vectors.o)
ENTRY(reset_vector)
INPUT(extras.o)
#if (__GNUC__ >= 3)
GROUP(libtarget.a libgcc.a libsupc++.a)
#else
GROUP(libtarget.a libgcc.a)
#endif

#if defined(__ARMEB__)
OUTPUT_FORMAT(elf32-bigarm)
#endif

#define MERGE_IN_RODATA *(.rodata*)

#define ALIGN_LMA 4
#define FOLLOWING(_section_) AT ((LOADADDR (_section_) + SIZEOF (_section_) + ALIGN_LMA - 1) & ~ (ALIGN_LMA - 1))
#define LMA_EQ_VMA
#define FORCE_OUTPUT . = .

// Some versions of gcc define "arm" which causes problems with .note.arm.ident
#undef arm

#define SECTIONS_BEGIN                                                      \
  /* Debug information */                                                   \
  .debug_aranges  0 : { *(.debug_aranges) }                                 \
  .debug_pubnames 0 : { *(.debug_pubnames) }                                \
  .debug_info     0 : { *(.debug_info) }                                    \
  .debug_abbrev   0 : { *(.debug_abbrev) }                                  \
  .debug_line     0 : { *(.debug_line) }                                    \
  .debug_frame    0 : { *(.debug_frame) }                                   \
  .debug_str      0 : { *(.debug_str) }                                     \
  .debug_loc      0 : { *(.debug_loc) }                                     \
  .debug_macinfo  0 : { *(.debug_macinfo) }                                 \
  .note.arm.ident 0 : { KEEP (*(.note.arm.ident)) }

#define SECTION_fixed_vectors(_region_, _vma_, _lma_)                       \
    .fixed_vectors _vma_ : _lma_                                            \
    { FORCE_OUTPUT; KEEP (*(.fixed_vectors)) }                              \
    > _region_

#define SECTION_rom_vectors(_region_, _vma_, _lma_)                         \
    .rom_vectors _vma_ : _lma_                                              \
    { __rom_vectors_vma = ABSOLUTE(.);                                      \
      FORCE_OUTPUT; KEEP (*(.vectors)) }                                    \
    > _region_                                                              \
    __rom_vectors_lma = LOADADDR(.rom_vectors);

#define SECTION_text(_region_, _vma_, _lma_)                                \
    .ARM.extab _vma_ : _lma_                                                \
    { PROVIDE (__stext = ABSOLUTE(.));_stext = ABSOLUTE(.) ;                \
    FORCE_OUTPUT;                                                           \
    *(.ARM.extab* .gnu.linkonce.armextab.*) } > _region_                    \
    __exidx_start = ABSOLUTE(.);                                            \
    .ARM.exidx : FOLLOWING(.ARM.extab) {                                    \
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)                                 \
    FORCE_OUTPUT;                                                           \
    } > _region_                                                            \
    __exidx_end = ABSOLUTE(.);                                              \
    .text : FOLLOWING(.ARM.exidx)                                           \
    {                                                                       \
    *(.text*) *(.gnu.warning) *(.gnu.linkonce.t.*) *(.init)                 \
    *(.glue_7) *(.glue_7t)                                                  \
    __CTOR_LIST__ = ABSOLUTE (.);                                           \
    KEEP (*(SORT (.ctors*))) __CTOR_END__ = ABSOLUTE (.);                   \
    __DTOR_LIST__ = ABSOLUTE (.);                                           \
    KEEP (*(SORT (.dtors*))) __DTOR_END__ = ABSOLUTE (.);                   \
    } > _region_                                                            \
    _etext = .; PROVIDE (__etext = .);

#define SECTION_fini(_region_, _vma_, _lma_)                                \
    .fini _vma_ : _lma_                                                     \
    { FORCE_OUTPUT; *(.fini) }                                              \
    > _region_

#define SECTION_rodata(_region_, _vma_, _lma_)                              \
    .rodata _vma_ : _lma_                                                   \
    { FORCE_OUTPUT; *(.rodata*) *(.gnu.linkonce.r.*) }                      \
    > _region_

#define SECTION_rodata1(_region_, _vma_, _lma_)                             \
    .rodata1 _vma_ : _lma_                                                  \
    { FORCE_OUTPUT; *(.rodata1) }                                           \
    > _region_

#define SECTION_fixup(_region_, _vma_, _lma_)                               \
    .fixup _vma_ : _lma_                                                    \
    { FORCE_OUTPUT; *(.fixup) }                                             \
    > _region_

#define SECTION_gcc_except_table(_region_, _vma_, _lma_)                    \
    .gcc_except_table _vma_ : _lma_                                         \
    { FORCE_OUTPUT;                                                         \
      KEEP(*(.gcc_except_table))                                            \
      *(.gcc_except_table.*)                                                \
    } > _region_

#define SECTION_eh_frame(_region_, _vma_, _lma_)                            \
  .eh_frame _vma_ : _lma_                                                   \
    {                                                                       \
       FORCE_OUTPUT;  __EH_FRAME_BEGIN__ = .;                               \
       KEEP(*(.eh_frame))                                                   \
       __FRAME_END__ = .;                                                   \
       . = . + 8;                                                           \
    } > _region_ = 0

#define SECTION_RELOCS(_region_, _vma_, _lma_)                              \
  .rel.text      :                                                          \
    {                                                                       \
      *(.rel.text)                                                          \
      *(.rel.text.*)                                                        \
      *(.rel.gnu.linkonce.t*)                                               \
    } > _region_                                                            \
  .rela.text     :                                                          \
    {                                                                       \
      *(.rela.text)                                                         \
      *(.rela.text.*)                                                       \
      *(.rela.gnu.linkonce.t*)                                              \
    } > _region_                                                            \
  .rel.data      :                                                          \
    {                                                                       \
      *(.rel.data)                                                          \
      *(.rel.data.*)                                                        \
      *(.rel.gnu.linkonce.d*)                                               \
    } > _region_                                                            \
  .rela.data     :                                                          \
    {                                                                       \
      *(.rela.data)                                                         \
      *(.rela.data.*)                                                       \
      *(.rela.gnu.linkonce.d*)                                              \
    } > _region_                                                            \
  .rel.rodata    :                                                          \
    {                                                                       \
      *(.rel.rodata)                                                        \
      *(.rel.rodata.*)                                                      \
      *(.rel.gnu.linkonce.r*)                                               \
    } > _region_                                                            \
  .rela.rodata   :                                                          \
    {                                                                       \
      *(.rela.rodata)                                                       \
      *(.rela.rodata.*)                                                     \
      *(.rela.gnu.linkonce.r*)                                              \
    } > _region_                                                            \
  .rel.got       :   { *(.rel.got)    } > _region_                          \
  .rela.got      :   { *(.rela.got)   } > _region_                          \
  .rel.ctors     :   { *(.rel.ctors)  } > _region_                          \
  .rela.ctors    :   { *(.rela.ctors) } > _region_                          \
  .rel.dtors     :   { *(.rel.dtors)  } > _region_                          \
  .rela.dtors    :   { *(.rela.dtors) } > _region_                          \
  .rel.init      :   { *(.rel.init)   } > _region_                          \
  .rela.init     :   { *(.rela.init)  } > _region_                          \
  .rel.fini      :   { *(.rel.fini)   } > _region_                          \
  .rela.fini     :   { *(.rela.fini)  } > _region_                          \
  .rel.bss       :   { *(.rel.bss)    } > _region_                          \
  .rela.bss      :   { *(.rela.bss)   } > _region_                          \
  .rel.plt       :   { *(.rel.plt)    } > _region_                          \
  .rela.plt      :   { *(.rela.plt)   } > _region_                          \
  .rel.dyn       :   { *(.rel.dyn)    } > _region_

#define SECTION_got(_region_, _vma_, _lma_)                                 \
  .got _vma_ : _lma_                                                        \
    {                                                                       \
      FORCE_OUTPUT; *(.got.plt) *(.got)                                     \
      _GOT1_START_ = ABSOLUTE (.); *(.got1) _GOT1_END_ = ABSOLUTE (.);      \
      _GOT2_START_ = ABSOLUTE (.); *(.got2) _GOT2_END_ = ABSOLUTE (.);      \
    } > _region_

#define SECTION_mmu_tables(_region_, _vma_, _lma_)                          \
    .mmu_tables _vma_ : _lma_                                               \
    { FORCE_OUTPUT; *(.mmu_tables) }                                        \
    > _region_

#define SECTION_sram(_region_, _vma_, _lma_)                                \
    .sram _vma_ : _lma_                                                     \
    { FORCE_OUTPUT; *(.sram*) }                                             \
    > _region_

#define SECTION_data(_region_,  _vma_, _lma_)                               \
    .data _vma_ : _lma_                                                     \
    { __ram_data_start = ABSOLUTE (.);                                      \
    *(.data*) *(.data1) *(.gnu.linkonce.d.*) MERGE_IN_RODATA                \
    . = ALIGN (4);                                                          \
    KEEP(*( SORT (.ecos.table.*))) ;                                        \
    . = ALIGN (4);                                                          \
    __init_array_start__ = ABSOLUTE (.); KEEP (*(SORT (.init_array.*)))     \
    KEEP (*(SORT (.init_array))) __init_array_end__ = ABSOLUTE (.);         \
    *(.dynamic) *(.sdata*) *(.gnu.linkonce.s.*)                             \
    . = ALIGN (4); *(.2ram.*) }                                             \
    > _region_                                                              \
    __rom_data_start = LOADADDR (.data);                                    \
    __ram_data_end = .; PROVIDE (__ram_data_end = .);                       \
    _edata = .; PROVIDE (edata = .);                                        \
    PROVIDE (__rom_data_end = LOADADDR (.data) + SIZEOF(.data));

#define SECTION_bss(_region_,  _vma_, _lma_)                                \
    .bss _vma_ : _lma_                                                      \
    { __bss_start = ABSOLUTE (.);                                           \
    *(.scommon) *(.dynsbss) *(.sbss*) *(.gnu.linkonce.sb.*)                 \
    *(.dynbss) *(.bss*) *(.gnu.linkonce.b.*) *(COMMON)                      \
    __bss_end = ABSOLUTE (.); }                                             \
    > _region_

#define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .);

#include <pkgconf/hal_cortexm.h>
#include CYGHWR_MEMORY_LAYOUT_LDI

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

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