#--------------------------------------------------------------------------- # Project: NitroSDK - tools - makelcf # File: ARM9-TS.lcf.template # # Copyright 2003-2007 Nintendo. All rights reserved. # # These coded instructions, statements, and computer programs contain # proprietary information of Nintendo of America Inc. and/or Nintendo # Company Ltd., and are protected by Federal copyright law. They may # not be disclosed to third parties or copied or duplicated in any form, # in whole or in part, without the prior written consent of Nintendo. # # $Log: ARM9-TS.lcf.template,v $ # Revision 1.44 2007/07/09 12:49:10 yasu # TARGET_NAME のサポート # # Revision 1.43 2007/07/09 07:12:55 yasu # MAINEX セクションのサポート # # Revision 1.42 2007/06/21 00:16:01 yasu # MAINEX セグメント定義をロールバック # # Revision 1.41 2007/06/20 10:32:39 yasu # static initializer や C++ コンストラクタの Autoload 対応 # # Revision 1.40 2007/06/19 11:55:13 yasu # lcf.template 内に MAINEX の定義追加 # # Revision 1.39 2007/04/12 00:11:41 yasu # 著作年度修正 # # Revision 1.38 2007/04/10 14:05:45 yasu # 複数の SEARCH_SYMBOL 対応 # # Revision 1.37 2006/07/20 07:29:12 kitase_hirotake # .version セクションに関する説明コメントの追加 # # Revision 1.36 2006/07/18 11:11:01 yasu # check.xTCM による TCM 領域のオーバーフローチェックにおいて # OVERLAY 領域のサイズの取得方法に誤りがあり、現状正確な計算方法が # 不明であるため OVERLAY 領域の加算を取りやめた # # Revision 1.35 2006/05/10 03:19:47 yasu # CodeWarrior 2.x のオーバーレイ拡張への対応 # # Revision 1.34 2006/04/06 09:02:36 kitase_hirotake # .itcm.bss .dtcm.bss に対応 # # Revision 1.33 2006/03/30 23:59:22 yasu # 著作年度の変更 # # Revision 1.32 2006/03/29 13:14:22 yasu # CWVER 2.x でのオーバーレイのサポート # # Revision 1.31 2005/11/24 01:16:47 yada # change start address of mainEX arena from 0x2400000 to 0x23e0000 # # Revision 1.30 2005/09/02 04:14:22 yasu # SDK2.2 でも使用可能のように古いシンボルを再定義した # # Revision 1.29 2005/08/31 09:34:57 yasu # section_BSS というようなセクション名を使ったときに正常に動作しない場合があるのを修正 # # Revision 1.28 2005/08/26 11:22:16 yasu # ITCM/DTCM への overlay の対応 # # Revision 1.27 2005/06/20 12:29:20 yasu # Surffix -> Suffix 修正 # # Revision 1.26 2005/06/14 09:03:42 yada # fix around minus value of SDK_STACKSIZE # # Revision 1.25 2005/04/13 12:51:00 terui # Change SDK_AUTOLOAD.DTCM.START 0x027c0000 -> 0x027e0000 # # Revision 1.24 2005/03/30 00:02:14 yosizaki # fix copyright header. # # Revision 1.23 2005/03/25 12:54:59 yasu # Include .version section # # Revision 1.22 2004/10/03 02:00:56 yasu # Output component file list for compstatic tool # # Revision 1.21 2004/09/27 05:28:21 yasu # Support .sinit # # Revision 1.20 2004/09/09 11:49:20 yasu # Support compstatic in default # # Revision 1.19 2004/09/06 06:40:00 yasu # Add labels for digest # # Revision 1.18 2004/08/20 06:19:59 yasu # DTCM moves to 0x027c0000 at default # # Revision 1.17 2004/08/02 10:38:53 yasu # Add autoload-done callback address in overlaydefs # # Revision 1.16 2004/07/26 02:22:32 yasu # Change DTCM address to 0x023c0000 # # Revision 1.15 2004/07/26 00:08:27 yasu # Fix label of exception table # # Revision 1.14 2004/07/24 05:42:25 yasu # Set default values for SDK_AUTOGEN_xTCM_START # # Revision 1.13 2004/07/23 11:32:14 yasu # Define labels for __exception_table_start__ and _end__ # # Revision 1.12 2004/07/12 12:21:08 yasu # Check size of ITCM/DTCM # # Revision 1.11 2004/07/10 04:10:26 yasu # Support command 'Library' # # Revision 1.10 2004/07/02 08:13:02 yasu # Support OBJECT( ) # # Revision 1.9 2004/07/01 12:54:38 yasu # support ITCM/DTCM/WRAM autoload # # Revision 1.8 2004/07/01 10:41:46 yasu # support autoload # # Revision 1.7 2004/06/02 07:35:37 yasu # Set libsyscall.a in FORCE_ACTIVE # Put NitroMain at the top of ROM image # # Revision 1.6 2004/06/02 04:56:28 yasu # Change to fit to new ROM map of TS # # Revision 1.5 2004/06/01 06:12:00 miya # add padding at top of ROM image. # # Revision 1.4 2004/04/26 12:16:48 yasu # add KEEP_SECTIONS # # Revision 1.3 2004/04/20 07:41:32 yasu # Set STATICINIT instead of .ctor temporarily # # Revision 1.2 2004/04/14 07:16:42 yasu # add ALIGN(32) for convenience to handle cache line # # Revision 1.1 2004/04/06 01:59:54 yasu # newly added # # $NoKeywords: $ #--------------------------------------------------------------------------- MEMORY { main (RWX) : ORIGIN = 0x02000000, LENGTH = 0x0 > main.sbin ITCM (RWX) : ORIGIN = 0x01ff8000, LENGTH = 0x0 >> main.sbin DTCM (RWX) : ORIGIN = 0x027e0000, LENGTH = 0x0 >> main.sbin binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin main_defs (RW) : ORIGIN = AFTER(main), LENGTH = 0x0 > main_defs.sbin main_table (RW) : ORIGIN = AFTER(main), LENGTH = 0x0 > main_table.sbin dummy.MAIN_EX (RW) : ORIGIN = 0x023e0000, LENGTH = 0x0 arena.MAIN (RW) : ORIGIN = AFTER(main), LENGTH = 0x0 arena.MAIN_EX (RW) : ORIGIN = AFTER(dummy.MAIN_EX), LENGTH = 0x0 arena.ITCM (RW) : ORIGIN = AFTER(ITCM), LENGTH = 0x0 arena.DTCM (RW) : ORIGIN = AFTER(DTCM), LENGTH = 0x0 binary.MODULE_FILES (RW) : ORIGIN = 0x0, LENGTH = 0x0 > component.files check.ITCM (RWX) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check check.DTCM (RW) : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check } FORCE_ACTIVE { SVC_SoftReset } KEEP_SECTION { .sinit } SECTIONS { ############################ STATIC ################################# .main: { ALIGNALL(4); . = ALIGN(32); # Fit to cache line # # TEXT BLOCK: READ ONLY # SDK_STATIC_START =.; SDK_STATIC_TEXT_START =.; #:::::::::: text/rodata libsyscall.a (.text) crt0.o (.text) crt0.o (.rodata) # # .version セクションを追加しています。 # このセクションに含まれる情報はロットチェックの際に # 必要となりますので、必ずこの位置に残すようにして下さい。 # * (.version) OBJECT(NitroMain,*) GROUP(ROOT) (.text) . = ALIGN(4); * (.exception) . = ALIGN(4); SDK_STATIC_ETABLE_START =.; EXCEPTION SDK_STATIC_ETABLE_END =.; . = ALIGN(4); GROUP(ROOT) (.init) . = ALIGN(4); GROUP(ROOT) (.rodata) . = ALIGN(4); SDK_STATIC_SINIT_START =.; #:::::::::: ctor GROUP(ROOT) (.ctor) GROUP(ROOT) (.sinit) WRITEW 0; #:::::::::: ctor SDK_STATIC_SINIT_END =.; #:::::::::: text/rodata . = ALIGN(32); SDK_STATIC_TEXT_END =.; # # DATA BLOCK: READ WRITE # SDK_STATIC_DATA_START =.; #:::::::::: data GROUP(ROOT) (.sdata) . = ALIGN(4); GROUP(ROOT) (.data) . = ALIGN(4); SDK_OVERLAY_DIGEST =.; # NO DIGEST SDK_OVERLAY_DIGEST_END =.; #:::::::::: data . = ALIGN(32); SDK_STATIC_DATA_END =.; SDK_STATIC_END =.; SDK_STATIC_TEXT_SIZE = SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START; SDK_STATIC_DATA_SIZE = SDK_STATIC_DATA_END - SDK_STATIC_DATA_START; SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START; __sinit__ = SDK_STATIC_SINIT_START; # for static initializer __exception_table_start__ = SDK_STATIC_ETABLE_START; # for exception table __exception_table_end__ = SDK_STATIC_ETABLE_END; # for exception table } > main .main.bss: { ALIGNALL(4); . = ALIGN(32); # # BSS BLOCK # SDK_STATIC_BSS_START =.; #:::::::::: bss GROUP(ROOT) (.sbss) . = ALIGN(4); GROUP(ROOT) (.bss) . = ALIGN(4); #:::::::::: bss . = ALIGN(32); SDK_STATIC_BSS_END = .; SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START; } >> main ############################ AUTOLOADS ############################## SDK_AUTOLOAD.ITCM.START = 0x01ff8000; SDK_AUTOLOAD.ITCM.END = SDK_AUTOLOAD.ITCM.START; SDK_AUTOLOAD.ITCM.BSS_END = SDK_AUTOLOAD.ITCM.START; SDK_AUTOLOAD.ITCM.SIZE = 0; SDK_AUTOLOAD.ITCM.BSS_SIZE = 0; SDK_AUTOLOAD.DTCM.START = 0x027e0000; SDK_AUTOLOAD.DTCM.END = SDK_AUTOLOAD.DTCM.START; SDK_AUTOLOAD.DTCM.BSS_END = SDK_AUTOLOAD.DTCM.START; SDK_AUTOLOAD.DTCM.SIZE = 0; SDK_AUTOLOAD.DTCM.BSS_SIZE = 0; SDK_AUTOLOAD_START = SDK_STATIC_END; SDK_AUTOLOAD_SIZE = 0; SDK_AUTOLOAD_NUMBER = 2; .ITCM: { ALIGNALL(4); . = ALIGN(32); # # TEXT BLOCK: READ ONLY # SDK_AUTOLOAD_ITCM_ID =0; SDK_AUTOLOAD.ITCM.ID =0; SDK_AUTOLOAD.ITCM.START =.; SDK_AUTOLOAD.ITCM.TEXT_START =.; #:::::::::: text/rodata . = ALIGN(4); * (.itcm) . = ALIGN(4); . = ALIGN(4); . = ALIGN(4); #:::::::::: text/rodata SDK_AUTOLOAD.ITCM.TEXT_END =.; # # DATA BLOCK: READ WRITE BLOCK # SDK_AUTOLOAD.ITCM.DATA_START =.; #:::::::::: data . = ALIGN(4); . = ALIGN(4); . = ALIGN(4); #:::::::::: data . = ALIGN(32); SDK_AUTOLOAD.ITCM.DATA_END =.; SDK_AUTOLOAD.ITCM.END =.; SDK_AUTOLOAD.ITCM.TEXT_SIZE = SDK_AUTOLOAD.ITCM.TEXT_END - SDK_AUTOLOAD.ITCM.TEXT_START; SDK_AUTOLOAD.ITCM.DATA_SIZE = SDK_AUTOLOAD.ITCM.DATA_END - SDK_AUTOLOAD.ITCM.DATA_START; SDK_AUTOLOAD.ITCM.SIZE = SDK_AUTOLOAD.ITCM.END - SDK_AUTOLOAD.ITCM.START; SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD.ITCM.SIZE; } > ITCM .ITCM.bss: { ALIGNALL(4); . = ALIGN(32); # # BSS BLOCK # SDK_AUTOLOAD.ITCM.BSS_START = .; #:::::::::: bss . = ALIGN(4); . = ALIGN(4); . = ALIGN(4); * (.itcm.bss) . = ALIGN(4); #:::::::::: bss . = ALIGN(32); SDK_AUTOLOAD.ITCM.BSS_END = .; SDK_AUTOLOAD.ITCM.BSS_SIZE = SDK_AUTOLOAD.ITCM.BSS_END - SDK_AUTOLOAD.ITCM.BSS_START; } >> ITCM .DTCM: { ALIGNALL(4); . = ALIGN(32); # # TEXT BLOCK: READ ONLY # SDK_AUTOLOAD_DTCM_ID =1; SDK_AUTOLOAD.DTCM.ID =1; SDK_AUTOLOAD.DTCM.START =.; SDK_AUTOLOAD.DTCM.TEXT_START =.; #:::::::::: text/rodata . = ALIGN(4); . = ALIGN(4); . = ALIGN(4); . = ALIGN(4); #:::::::::: text/rodata SDK_AUTOLOAD.DTCM.TEXT_END =.; # # DATA BLOCK: READ WRITE BLOCK # SDK_AUTOLOAD.DTCM.DATA_START =.; #:::::::::: data . = ALIGN(4); . = ALIGN(4); * (.dtcm) . = ALIGN(4); #:::::::::: data . = ALIGN(32); SDK_AUTOLOAD.DTCM.DATA_END =.; SDK_AUTOLOAD.DTCM.END =.; SDK_AUTOLOAD.DTCM.TEXT_SIZE = SDK_AUTOLOAD.DTCM.TEXT_END - SDK_AUTOLOAD.DTCM.TEXT_START; SDK_AUTOLOAD.DTCM.DATA_SIZE = SDK_AUTOLOAD.DTCM.DATA_END - SDK_AUTOLOAD.DTCM.DATA_START; SDK_AUTOLOAD.DTCM.SIZE = SDK_AUTOLOAD.DTCM.END - SDK_AUTOLOAD.DTCM.START; SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD.DTCM.SIZE; } > DTCM .DTCM.bss: { ALIGNALL(4); . = ALIGN(32); # # BSS BLOCK # SDK_AUTOLOAD.DTCM.BSS_START = .; #:::::::::: bss . = ALIGN(4); . = ALIGN(4); * (.dtcm.bss) . = ALIGN(4); . = ALIGN(4); #:::::::::: bss . = ALIGN(32); SDK_AUTOLOAD.DTCM.BSS_END = .; SDK_AUTOLOAD.DTCM.BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_END - SDK_AUTOLOAD.DTCM.BSS_START; } >> DTCM SDK_AUTOLOAD_ITCM_START = SDK_AUTOLOAD.ITCM.START; SDK_AUTOLOAD_ITCM_END = SDK_AUTOLOAD.ITCM.END; SDK_AUTOLOAD_ITCM_BSS_END = SDK_AUTOLOAD.ITCM.BSS_END; SDK_AUTOLOAD_ITCM_SIZE = SDK_AUTOLOAD.ITCM.SIZE; SDK_AUTOLOAD_ITCM_BSS_SIZE = SDK_AUTOLOAD.ITCM.BSS_SIZE; SDK_AUTOLOAD_DTCM_START = SDK_AUTOLOAD.DTCM.START; SDK_AUTOLOAD_DTCM_END = SDK_AUTOLOAD.DTCM.END; SDK_AUTOLOAD_DTCM_BSS_END = SDK_AUTOLOAD.DTCM.BSS_END; SDK_AUTOLOAD_DTCM_SIZE = SDK_AUTOLOAD.DTCM.SIZE; SDK_AUTOLOAD_DTCM_BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_SIZE; ############################ AUTOLOAD_INFO ########################## .binary.AUTOLOAD_INFO: { WRITEW ADDR(.ITCM); WRITEW SDK_AUTOLOAD.ITCM.SIZE; WRITEW SDK_AUTOLOAD.ITCM.BSS_SIZE; WRITEW ADDR(.DTCM); WRITEW SDK_AUTOLOAD.DTCM.SIZE; WRITEW SDK_AUTOLOAD.DTCM.BSS_SIZE; } > binary.AUTOLOAD_INFO SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; SDK_AUTOLOAD_LIST_END = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); ############################ STATIC_FOOTER ########################## .binary.STATIC_FOOTER: { WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE WRITEW _start_ModuleParams - ADDR(.main); WRITEW 0; # NO DIGEST } > binary.STATIC_FOOTER ############################ OVERLAYS ############################### SDK_OVERLAY_NUMBER = 0; ############################ MAIN EX ################################## # MAIN EX Area .dummy.MAIN_EX: { . = ALIGN(32); } > dummy.MAIN_EX ############################ ARENA ################################## .arena.MAIN: { . = ALIGN(32); SDK_SECTION_ARENA_START =.; } > arena.MAIN .arena.MAIN_EX: { . = ALIGN(32); SDK_SECTION_ARENA_EX_START =.; } > arena.MAIN_EX .arena.ITCM: { . = ALIGN(32); SDK_SECTION_ARENA_ITCM_START =.; } > arena.ITCM .arena.DTCM: { . = ALIGN(32); SDK_SECTION_ARENA_DTCM_START =.; } > arena.DTCM ############################ OVERLAYDEFS ############################ .main_defs: { ### main module information WRITEW ADDR(.main); # load address WRITEW _start; # entry address WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # size of module WRITEW _start_AutoloadDoneCallback; # callback autoload done ### overlay filename } > main_defs ############################ OVERLAYTABLE ########################### .main_table: { } > main_table ############################ OTHERS ################################# SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START; SDK_IRQ_STACKSIZE = 1024; # allocated in DTCM SDK_SYS_STACKSIZE = 0; # when 0 means all remains of DTCM # Module filelist .binary.MODULE_FILES: { WRITES ("main.sbin"); WRITES ("main_defs.sbin"); WRITES ("main_table.sbin"); } > binary.MODULE_FILES # ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM .check.ITCM: { . = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE; } > check.ITCM SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1; .check.DTCM: { . = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE; . = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN; } > check.DTCM }