📄 adsp-ts201_c.ldf
字号:
ARCHITECTURE(ADSP-TS201)
#ifndef __NO_STD_LIB
SEARCH_DIR( $ADI_DSP/TS/lib )
#endif
// Libsim provides fast, mostly host emulated IO only supported by
// the simulator. The libio library provides IO processing (including
// file support) mostly done by the TigerSHARC target that is supported
// by the emulator and simulator. Libio together with libsim is the
// default used, but if __USING_LIBSIM is defined only libsim will be used.
// From the driver command line, use options,
// "-flags-link -MD__USING_LIBSIM=1"
// in the IDDE, add -MD__USING_LIBSIM=1 to the linker additional
// options
// The define __WORKAROUNDS_ENABLED if set will indicate that the
// libraries built with ADSP-TS20x errata workarounds are to be
// Used for the link.
#ifndef __USING_LIBSIM
#ifdef __WORKAROUNDS_ENABLED
#ifdef __TS_BYTE_ADDRESS
$IOLIB = libio_TS201_ba_w.dlb;
$IOLIB_MT = libio_TS201_mt_ba_w.dlb;
#else
// default option, using libio and libsim
$IOLIB = libio_TS201_w.dlb;
$IOLIB_MT = libio_TS201_mt_w.dlb;
#endif // __TS_BYTE_ADDRESS
#else
#ifdef __TS_BYTE_ADDRESS
$IOLIB = libio_TS201_ba.dlb;
$IOLIB_MT = libio_TS201_mt_ba.dlb;
#else
// default option, using libio and libsim
$IOLIB = libio_TS201.dlb;
$IOLIB_MT = libio_TS201_mt.dlb;
#endif // __TS_BYTE_ADDRESS
#endif
#else
// using only libsim
$IOLIB = ;
$IOLIB_MT = ;
#endif // __USING_LIBSIM
$MEMINIT = meminit_ts20x.doj;
#ifndef __WORKAROUNDS_ENABLED
#ifdef __TS_BYTE_ADDRESS
$LIBC = libc_TS201_ba.dlb;
$LIBC_MT = libc_TS201_mt_ba.dlb;
$LIBDSP = libdsp_TS201_ba.dlb;
$LIBCPP = libcpprt_TS201_ba.dlb;
$LIBCPP_MT = libcpprt_TS201_mt_ba.dlb;
$EXIT = ts_exit_TS201_ba.doj;
$EXIT_MT = ts_exit_TS201_mt_ba.doj;
$HDR = ts_hdr_TS201_ba.doj;
$HDR_MT = ts_hdr_TS201_mt_ba.doj;
#else
$LIBC = libc_TS201.dlb;
$LIBC_MT = libc_TS201_mt.dlb;
$LIBDSP = libdsp_TS201.dlb;
$LIBCPP = libcpprt_TS201.dlb;
$LIBCPP_MT = libcpprt_TS201_mt.dlb;
$EXIT = ts_exit_TS201.doj;
$EXIT_MT = ts_exit_TS201_mt.doj;
$HDR = ts_hdr_TS201.doj;
$HDR_MT = ts_hdr_TS201_mt.doj;
#endif // __TS_BYTE_ADDRESS
#else // __WORKAROUNDS_ENABLED
#ifdef __TS_BYTE_ADDRESS
$LIBC = libc_TS201_ba_w.dlb;
$LIBC_MT = libc_TS201_mt_ba_w.dlb;
$LIBDSP = libdsp_TS201_ba_w.dlb;
$LIBCPP = libcpprt_TS201_ba_w.dlb;
$LIBCPP_MT = libcpprt_TS201_mt_ba_w.dlb;
$EXIT = ts_exit_TS201_ba_w.doj;
$EXIT_MT = ts_exit_TS201_mt_ba_w.doj;
$HDR = ts_hdr_TS201_ba_w.doj;
$HDR_MT = ts_hdr_TS201_mt_ba_w.doj;
#else
$LIBC = libc_TS201_w.dlb;
$LIBC_MT = libc_TS201_mt_w.dlb;
$LIBDSP = libdsp_TS201_w.dlb;
$LIBCPP = libcpprt_TS201_w.dlb;
$LIBCPP_MT = libcpprt_TS201_mt_w.dlb;
$EXIT = ts_exit_TS201_w.doj;
$EXIT_MT = ts_exit_TS201_mt_w.doj;
$HDR = ts_hdr_TS201_w.doj;
$HDR_MT = ts_hdr_TS201_mt_w.doj;
#endif // __TS_BYTE_ADDRESS
#endif // __WORKAROUNDS_ENABLED
// Libraries from the command line are included in COMMAND_LINE_OBJECTS.
// The order of the default libraries within $LIBRARIES is
// libc, I/O libraries, libdsp, libcpp.
// This order has to be maintained.
#ifdef _ADI_THREADS
// This list describes the libraries/ object files used to build programs
// with thread support. Any custom file that falls into this category
// should be added here.
$OBJECTS = $HDR_MT, $COMMAND_LINE_OBJECTS, $MEMINIT, $EXIT_MT;
$LIBRARIES = $LIBC_MT, $IOLIB_MT, $LIBDSP,
$LIBCPP_MT, libsim_TS201.dlb;
#else
// This list describes the libraries/ object files used to build programs
// without thread support. Any custom file that falls into this category
// should be added here.
$OBJECTS = $HDR, $COMMAND_LINE_OBJECTS, $MEMINIT, $EXIT;
$LIBRARIES = $LIBC, $IOLIB, $LIBDSP,
$LIBCPP, libsim_TS201.dlb;
#endif // _ADI_THREADS
// Internal memory blocks are 0x20000 (128k)
MEMORY
{
M0Code { TYPE(RAM) START(0x00000000) END(0x0001FF9F) WIDTH(32) }
M2DataA { TYPE(RAM) START(0x00040000) END(0x0004FFFF) WIDTH(32) }
M2DataB { TYPE(RAM) START(0x00050000) END(0x0005FFFF) WIDTH(32) }
M4DataA { TYPE(RAM) START(0x00080000) END(0x0008FFFF) WIDTH(32) }
M4DataB { TYPE(RAM) START(0x00090000) END(0x0009BFFF) WIDTH(32) }
M4Heap { TYPE(RAM) START(0x0009C000) END(0x0009C7FF) WIDTH(32) }
M4Stack { TYPE(RAM) START(0x0009C800) END(0x0009FFFF) WIDTH(32) }
M6DataA { TYPE(RAM) START(0x000C0000) END(0x000CFFFF) WIDTH(32) }
M6DataB { TYPE(RAM) START(0x000D0000) END(0x000DC7FF) WIDTH(32) }
M6Stack { TYPE(RAM) START(0x000DC800) END(0x000DFFFF) WIDTH(32) }
M8DataA { TYPE(RAM) START(0x00100000) END(0x0010FFFF) WIDTH(32) }
M8DataB { TYPE(RAM) START(0x00110000) END(0x0011FFFF) WIDTH(32) }
M10DataA { TYPE(RAM) START(0x00140000) END(0x0014FFFF) WIDTH(32) }
M10DataB { TYPE(RAM) START(0x00150000) END(0x0015FFFF) WIDTH(32) }
MS0 { TYPE(RAM) START(0x30000000) END(0x37FFFFFF) WIDTH(32) }
MS1 { TYPE(RAM) START(0x38000000) END(0x3FFFFFFF) WIDTH(32) }
MSSD0 { TYPE(RAM) START(0x40000000) END(0x43FFFFFF) WIDTH(32) }
MSSD1 { TYPE(RAM) START(0x50000000) END(0x53FFFFFF) WIDTH(32) }
MSSD2 { TYPE(RAM) START(0x60000000) END(0x63FFFFFF) WIDTH(32) }
MSSD3 { TYPE(RAM) START(0x70000000) END(0x73FFFFFF) WIDTH(32) }
// Memory blocks need to be less than 2 Gig.
HOST { TYPE(RAM) START(0x80000000) END(0x8FFFFFFF) WIDTH(32) }
HOST1 { TYPE(RAM) START(0x90000000) END(0xAFFFFFFF) WIDTH(32) }
HOST2 { TYPE(RAM) START(0xB0000000) END(0xCFFFFFFF) WIDTH(32) }
HOST3 { TYPE(RAM) START(0xD0000000) END(0xEFFFFFFF) WIDTH(32) }
HOST4 { TYPE(RAM) START(0xF0000000) END(0xFFFFFFFF) WIDTH(32) }
}
PROCESSOR p0
{
RESOLVE( _____system_start, 0x00000000 )
KEEP( _____system_start, _main, ___ctor_end, __sw_handler_ctor )
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
SECTIONS
{
code
{
FILL(0xb3c00000)
INPUT_SECTION_ALIGN(4)
INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program) )
// The next line adds 10 nops to the end of the code section.
// This is required on TS201 to prevent uninitialised memory
// getting into the pipeline.
. = . + 10;
} >M0Code
// Provide support for initialization, including C++ static
// initialization. This section builds a table of
// initialization function pointers. These functions are
// called in order before the main routine is entered. The
// order is determined by the linker section in which the
// function pointer has been defined: the C library uses
// ctor0 through ctor4, and the compiler uses ctor for C++
// static initializers. The C library uses several sections
// to satisfy ordering requirements among initializers.
// The ctorl marker terminates this section.
ctor
{
INPUT_SECTIONS( $OBJECTS(ctor0) $LIBRARIES(ctor0) )
INPUT_SECTIONS( $OBJECTS(ctor1) $LIBRARIES(ctor1) )
INPUT_SECTIONS( $OBJECTS(ctor2) $LIBRARIES(ctor2) )
INPUT_SECTIONS( $OBJECTS(ctor3) $LIBRARIES(ctor3) )
INPUT_SECTIONS( $OBJECTS(ctor4) $LIBRARIES(ctor4) )
INPUT_SECTIONS( $OBJECTS(ctor) $LIBRARIES(ctor) )
INPUT_SECTIONS( $OBJECTS(ctorl) $LIBRARIES(ctorl) )
} >M4DataA
// Table containing heap segment descriptors
heaptab
{
INPUT_SECTIONS( $OBJECTS(heaptab) $LIBRARIES(heaptab) )
} >M4DataA
// Allocate stacks for the application. Note that stacks
// grow downward, and must be quad-word aligned. This means
// that the location just after the highest word of the stack
// is quad-word aligned (evenly divisible by 4). There are two
// labels for each stack: "*_base" is the location just ABOVE
// the top of the stack, and "*_limit" is the lowest word that
// is part of the stack. Each stack occupies all of its own
// memory block.
data1
{
INPUT_SECTIONS( $OBJECTS(data1) $LIBRARIES(data1) )
} >M4DataA
bsz_init
{
INPUT_SECTIONS( $OBJECTS(bsz_init) $LIBRARIES(bsz_init))
} >M4DataA
.meminit {} >M4DataA
bsz ZERO_INIT
{
INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz) )
} >M4DataA
MEM_ARGV
{
INPUT_SECTIONS( $OBJECTS(MEM_ARGV) $LIBRARIES(MEM_ARGV) )
} >M4DataA
data2
{
INPUT_SECTIONS( $OBJECTS(data2) $LIBRARIES(data2) )
} >M8DataA
data2a
{
INPUT_SECTIONS( $OBJECTS(data1ab) $OBJECTS(data2a) $LIBRARIES(data2a) )
} >M2DataA
data2b
{
INPUT_SECTIONS( $OBJECTS(data2b) $LIBRARIES(data2b) )
} >M2DataB
data4a
{
INPUT_SECTIONS( $OBJECTS(data4a) $LIBRARIES(data4a) )
} >M4DataA
data4b
{
INPUT_SECTIONS( $OBJECTS(data4b) $LIBRARIES(data4b) )
} >M4DataB
data6a
{
INPUT_SECTIONS( $OBJECTS(data6a) $LIBRARIES(data6a) )
} >M6DataA
data6b
{
INPUT_SECTIONS( $OBJECTS(data6b) $LIBRARIES(data6b) )
} >M6DataB
data8a
{
INPUT_SECTIONS( $OBJECTS(data2ab) $OBJECTS(data8a) $LIBRARIES(data8a) )
} >M8DataA
data8b
{
INPUT_SECTIONS( $OBJECTS(data8b) $LIBRARIES(data8b) )
} >M8DataB
data10a
{
INPUT_SECTIONS( $OBJECTS(data3ab) $OBJECTS(data10a) $LIBRARIES(data10a) )
} >M10DataA
data10b
{
INPUT_SECTIONS( $OBJECTS(data10b) $LIBRARIES(data10b) )
} >M10DataB
// Allocate stacks for the application. Note that stacks
// grow downward, and must be quad-word aligned. This means
// that the location just after the highest word of the stack
// is quad-word aligned (evenly divisible by 4). There are two
// labels for each stack: "*_base" is the location just ABOVE
// the top of the stack, and "*_limit" is the lowest word that
// is part of the stack. Each stack occupies all of its own
// memory block.
jstackseg
{
ldf_jstack_limit = .;
ldf_jstack_base = . + MEMORY_SIZEOF(M4Stack);
} >M4Stack
kstackseg
{
ldf_kstack_limit = .;
ldf_kstack_base = . + MEMORY_SIZEOF(M6Stack);
} >M6Stack
// The default heap occupies its own memory block
defheapseg
{
ldf_defheap_base = .;
ldf_defheap_size = MEMORY_SIZEOF(M4Heap);
} >M4Heap
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -