<html>
Hi Aaron:<br><br>
The .ctors and .dtors section are being placed in the .text section in
the SECTIONS portion of my linker script.  The .text section is
being placed into the bootrom region defined in the linkers MEMORY
section.<br><br>
For clarification I have attached a copy of one of my linker scripts that
produces the output.<br><br>
Nothing is failing in the program so far, probably due to not using C++
code yet.  However, I picked this up in an inspection of the
listing, and thought that it was strange.<br><br>
Thanks in advance.<br><br>
Regards,<br>
Derick Hammond<br><br>
At 03:16 PM 15/07/2003 -0700, Aaron J. Grier wrote:<br>
<blockquote type=cite class=cite cite>On Tue, Jul 15, 2003 at 06:14:02PM
+1000, Derick Hammond wrote:<br>
> It seems to me that the jsr fff00b0c <__do_global_ctors_aux>
is<br>
> unreachable code.  Is this correct?  If so how do I
correct the<br>
> problem?<br><br>
first is to figure out if it's really a problem or not.  only you
know<br>
the memory map of your device.<br><br>
what regions does the MEMORY section of your script define, and in
the<br>
SECTIONS section, where are .ctors and .dtors sections being
placed?<br><br>
-- <br>
  Aaron J. Grier  |   Frye Electronics, Tigard,
OR   |  aaron@frye.com </blockquote><br>
<tt>--- Start of spsize.ld<br><br>
/*<br>
** Specify that the output is to be elf32-m68k regardless of what<br>
** the native object format is.<br>
*/<br>
OUTPUT_FORMAT(elf32-m68k)<br><br>
/*<br>
** Declare size of Heap<br>
** A Heap size of 0 means: use all available memory for the heap.<br>
*/<br>
_HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;<br><br>
/*<br>
** Set the size of the starting stack used during initialisation<br>
** until the first task switch.  After that point, task stacks<br>
** allocated by RTEMS are used.<br>
*/<br>
StackSize = DEFINED(StackSize) ? StackSize : 8K;<br><br>
/*<br>
** System Clock Frequency.<br>
*/<br>
_SYS_CLOCK_FREQUENCY = 36864000;<br><br>
/*<br>
** Assign space to common symbols even if a relocatable output<br>
** file is specified.<br>
*/<br>
FORCE_COMMON_ALLOCATION<br><br>
/*<br>
** Starting addresses and length of RAM, ROM, and FLASH<br>
**<br>
** The addresses must be valid addresses on the board.  The
Chip<br>
** Selects should be initialised such that the codes addresses<br>
** are valid.<br>
*/<br>
MEMORY<br>
{<br>
  ram         
(w)  : ORIGIN = 0x00000000, LENGTH = 128K<br>
  rambar       (w)  : ORIGIN =
0x00020000, LENGTH = 8K<br>
  mbar         (w)  :
ORIGIN = 0x10000000, LENGTH = 1K<br>
  rtc         
(w)  : ORIGIN = 0x20000000, LENGTH = 64K<br>
  canbus       (w)  : ORIGIN =
0x30000000, LENGTH = 64K<br>
  ethernet     (w)  : ORIGIN = 0x40000000,
LENGTH = 64K<br>
  nvram        (w)  : ORIGIN
= 0x50000000, LENGTH = 2M<br>
  compactflash (w)  : ORIGIN = 0x60000000, LENGTH = 64K<br>
  prog_flash   (rx) : ORIGIN = 0xF0000000, LENGTH =
8M<br>
  bootrom      (rx) : ORIGIN = 0xFFF00000,
LENGTH = 512K<br>
}<br><br>
/*<br>
** This is for the network driver.  See the RTEMS Networking<br>
** documentation for more details.<br>
*/<br>
ETHERNET_ADDRESS = 0x40000000;<br><br>
/*<br>
** Interrupt Vector table is oocated at start of external static<br>
** RAM.<br>
*/<br>
_VBR = 0x00000000;<br><br>
/*<br>
** The following defines the order in which the sections should<br>
** go.  It also defines a number of variables which can be 
used<br>
** by the application program.<br>
**<br>
** NOTE: Each variable appears with 1 or 2 leading underscorses<br>
**       to ensure that the variable is
accessible from C code<br>
**       with a single underscore. 
Some object formats<br>
**       automatically add a leading
underscore to all C global<br>
**       symbols.<br>
*/<br>
SECTIONS<br>
{<br>
  /*<br>
  ** Boot ROM - Set the RomBase variable to the start of the
ROM.<br>
  */<br>
  bootrom :<br>
  {<br>
    _RomBase = .;<br>
    __RomBase = .;<br>
  } >bootrom<br><br>
  /*<br>
  ** RAM - Set the RamBase variable to the start of the RAM.<br>
  */<br>
  ram :<br>
  {<br>
    _RamBase = .;<br>
    __RamBase = .;<br>
  } >ram<br><br>
  /*<br>
  ** Text (code) goes into ROM.<br>
  */<br>
  .text :<br>
  {<br>
    ROM_PADDR = .;<br>
    ROMVECS_PADDR = .;<br>
    *(DV_ROMVECS)<br>
    ROMVECS_PEND = .;<br>
    BOOTINIT_PADDR = .;<br>
    *(DV_BOOTINIT)<br>
    BOOTINIT_PEND = .;<br>
    BOOTCRC32_PADDR = .;<br>
    *(DV_BOOTCRC32)<br>
    BOOTCRC32_PEND = .;<br>
    LEAD_PADDR = .;<br>
    *(DV_LEAD)<br>
    *(.text)<br><br>
    /*<br>
    ** C++ constructors/destructors<br>
    */<br>
    *(.gnu.linkonce.t.*)<br><br>
    /*<br>
    ** Initialization and finalization code.<br>
    */<br>
    . = ALIGN (16);<br>
    PROVIDE (_init = .);<br>
    *crti.o(.init)<br>
    *(.init)<br>
    *crtn.o(.init)<br>
    . = ALIGN (16);<br>
    PROVIDE (_fini = .);<br>
    *crti.o(.fini)<br>
    *(.fini)<br>
    *crtn.o(.fini)<br><br>
    /*<br>
    * Special FreeBSD sysctl sections.<br>
    */<br>
    . = ALIGN (16);<br>
    __start_set_sysctl_set = .;<br>
    *(set_sysctl_*);<br>
    __stop_set_sysctl_set = ABSOLUTE(.);<br>
    *(set_domain_*);<br>
    *(set_pseudo_*);<br><br>
    /*<br>
    ** C++ constructors/destructors<br>
    */<br>
    . = ALIGN (16);<br>
    *crtbegin.o(.ctors)<br>
    *(.ctors)<br>
    *crtend.o(.ctors)<br>
    *crtbegin.o(.dtors)<br>
    *(.dtors)<br>
    *crtend.o(.dtors)<br><br>
    /*<br>
    ** Exception frame info<br>
    */<br>
    . = ALIGN (16);<br>
    *(.eh_frame)<br><br>
    /*<br>
    ** Read-only data<br>
    */<br>
    . = ALIGN (16);<br>
    _rodata_start = .;<br>
    *(.rodata*)<br>
    *(.gnu.linkonce.r*)<br><br>
    /*<br>
    ** Declares where the .text section ends.<br>
    */<br>
    . = ALIGN (16);<br>
    PROVIDE (_etext = .);<br>
  } >bootrom<br><br>
  /*<br>
  ** Vector section reserve some room for the Vector Table, 
256<br>
  ** vectors of 4 bytes.<br>
  */<br>
  .vector :<br>
  {<br>
    M68Kvec = .;<br>
    _M68Kvec = .;<br>
    . += (256 * 4);<br>
  } >ram<br><br>
  /*<br>
  ** Data section is linked for base address of 0x00000400, 
but<br>
  ** loaded in the Boot ROM after the .text section.<br>
  */<br><br>
  SRAM_PADDR = 0x00000000;<br><br>
  .data : AT (LOADADDR(.text) + SIZEOF(.text))<br>
  {<br>
    copy_start = .;<br>
    . = ALIGN (0x10);<br>
    *(.shdata);<br>
    . = ALIGN (0x10);<br>
    *(.data);<br>
    . = ALIGN (0x10);<br>
    *(.gcc_exc);<br>
    *(.gcc_except_table);<br>
    *(.jcr);<br>
    . = ALIGN (0x10);<br>
    *(.gnu.linkonce.d*)<br>
    . = ALIGN (0x10);<br>
    _edata = .;<br>
    copy_end = .;<br>
  } >ram<br><br>
  /*<br>
  ** BSS section is linked after the .data section, and makes<br>
  ** _bstart and _bend symbols available for Boot Code to zero<br>
  ** section.<br>
  */<br>
  .bss BLOCK (0x4) :<br>
  {<br>
    clear_start = .;<br>
    *(.shbss);<br>
    *(.bss);<br>
    *(COMMON);<br>
    . = ALIGN (16);<br>
    _end = .;<br><br>
    clear_end = .;<br><br>
    /*<br>
    ** The RTEMS Executive Workspace goes here. 
RTEMS allocates<br>
    ** tasks, stacks, semaphores, etc. from this
memory.<br>
    */<br>
    _WorkspaceBase = .;<br>
    __WorkspaceBase = .;<br><br>
  } >ram<br><br>
  SRAM_PEND = 0x00020000;<br><br>
  rambarsec    0x00020000 :<br>
  {<br>
    RAMBAR_PADDR = .;<br><br>
    /*<br>
    ** The Starting Stack goes after the Application
Heap.<br>
    ** M68K stack grows down so start at high
address.<br>
    */<br>
    . += StackSize;<br>
    . = ALIGN (16);<br>
    stack_init = .;<br><br>
    RAMBAR_PEND = .;<br>
  } >rambar<br><br>
  mbarsec      0x10000000 :<br>
  {<br>
    MBAR_PADDR = .;<br>
  } >mbar<br><br>
  rtcsec       0x20000000 :<br>
  {<br>
    RTC_PADDR = .;<br>
  } >rtc<br><br>
  canbussec    0x30000000 :<br>
  {<br>
    CANBUS_PADDR = .;<br>
  } >canbus<br><br>
  ethernetsec  0x40000000 :<br>
  {<br>
    ETHERNET_PADDR = .;<br>
  } >ethernet<br><br>
  nvramsec     0x50000000 :<br>
  {<br>
    NVRAM_PADDR = .;<br>
  } >nvram<br><br>
  compactflash 0x60000000 :<br>
  {<br>
    CF_CARD_PADDR = .;<br>
  } >compactflash<br><br>
  prog_flash_sec 0xF0000000 :<br>
  {<br>
    PROG_FLASH_PADDR = .;<br>
  } >prog_flash<br><br>
  /*<br>
  ** Tail section is linked after the ROMed .data section. 
This<br>
  ** section contains the 'END OF FIRMWARE' marker, and
Firmware<br>
  ** CRC-32.<br>
  */<br>
  .tail (ADDR(.text) + SIZEOF(.text) + SIZEOF(.data)) : <br>
  {<br>
    *(DV_TAIL);<br>
    FW_CRC32_PADDR = .;<br>
    *(DV_CRC32);<br>
  } >bootrom<br>
}<br><br>
ENTRY(start);<br><br>
SEARCH_DIR(
/home/derickh/cvs_wa/DataVault_Firmware/firmware/../library/core ) <br>
SEARCH_DIR(
/home/derickh/cvs_wa/DataVault_Firmware/firmware/../library/rom_objs )
<br>
SEARCH_DIR(
/home/derickh/cvs_wa/DataVault_Firmware/firmware/../library/static )
<br>
SEARCH_DIR(
/home/derickh/cvs_wa/DataVault_Firmware/firmware/../library/support
)<br>
SEARCH_DIR( /opt/rtems/m68k-rtems/lib/m5200 )<br>
SEARCH_DIR( /opt/rtems/lib/gcc-lib/m68k-rtems/3.2.2/m5200 )<br>
SEARCH_DIR(
/home/derickh/cvs_wa/DataVault_Firmware/devtools/rtems/m68k-rtems/lib/m5200
)<br><br>
GROUP<br>
(<br>
  crti.o<br>
  crtbegin.o<br>
  crtn.o<br>
  crtend.o<br>
  <br>
  lead.o <br>
  reset.o <br>
  tail.o  <br>
  librom_start.a <br>
  libconsole.a <br>
  libtod.a <br>
  libclock.a <br>
  libspsize.a<br><br>
  no-dpmem.rel<br>
  no-msg.rel<br>
  no-mp.rel<br>
  no-part.rel<br>
  no-signal.rel<br>
  no-timer.rel<br>
  no-rtmon.rel<br><br>
  librtemscpu.a<br>
  libc.a<br>
  libgcc.a<br>
)<br><br>
--- End of spsize.ld</html>