From 301d8579888af0cfd79b34f4945c266e3b5b2dab Mon Sep 17 00:00:00 2001
From: dongheng <Dong Heng>
Date: Fri, 26 Jul 2019 19:12:25 +0800
Subject: [PATCH] feat(esp8266): supports "make size" and its family function

1. support "make size", "make size-files", "make size-components" and "make size-symbols"
2. add esp-idf style link file including "esp8266.ld" and "esp8266.project.ld.in"
3. add link advaced generation file to components of esp8266 and spi_flash
---
 components/esp8266/CMakeLists.txt             |   14 +-
 components/esp8266/Makefile.projbuild         |    7 +
 components/esp8266/component.mk               |   14 +-
 .../esp8266/include/esp8266/eagle_soc.h       |    2 +-
 components/esp8266/ld/esp8266.common.ld       |  258 ---
 components/esp8266/ld/esp8266.ld              |   54 +-
 components/esp8266/ld/esp8266.project.ld.in   |  247 +++
 components/esp8266/ld/esp8266_fragments.lf    |   89 +
 components/esp8266/linker.lf                  |    9 +
 components/esp8266/source/startup.c           |    5 +-
 components/esptool_py/esptool/esptool.py      |    8 +-
 components/heap/port/esp8266/esp_heap_init.c  |   12 +-
 components/log/CMakeLists.txt                 |    7 +-
 components/log/component.mk                   |    5 +-
 components/log/linker.lf                      |    4 +
 components/spi_flash/CMakeLists.txt           |   20 +-
 components/spi_flash/component.mk             |    2 +
 components/spi_flash/linker.lf                |    4 +
 tools/ldgen/__init__.py                       |    0
 tools/ldgen/fragments.py                      |  425 +++++
 tools/ldgen/generation.py                     |  636 +++++++
 tools/ldgen/ldgen.py                          |  150 ++
 tools/ldgen/ldgen_common.py                   |   23 +
 tools/ldgen/samples/esp32.lf                  |   80 +
 tools/ldgen/samples/mappings.lf               |   62 +
 tools/ldgen/samples/sdkconfig                 |  542 ++++++
 tools/ldgen/samples/sections.info             | 1626 +++++++++++++++++
 tools/ldgen/samples/template.ld               |  214 +++
 tools/ldgen/sdkconfig.py                      |   81 +
 tools/ldgen/test/data/Kconfig                 |   19 +
 tools/ldgen/test/data/sample.lf               |   84 +
 tools/ldgen/test/data/sdkconfig               |    8 +
 tools/ldgen/test/data/sections.info           | 1626 +++++++++++++++++
 tools/ldgen/test/data/template.ld             |  215 +++
 tools/ldgen/test/test_fragments.py            |  982 ++++++++++
 tools/ldgen/test/test_generation.py           | 1354 ++++++++++++++
 36 files changed, 8565 insertions(+), 323 deletions(-)
 delete mode 100644 components/esp8266/ld/esp8266.common.ld
 create mode 100644 components/esp8266/ld/esp8266.project.ld.in
 create mode 100644 components/esp8266/ld/esp8266_fragments.lf
 create mode 100644 components/esp8266/linker.lf
 create mode 100644 components/log/linker.lf
 create mode 100644 components/spi_flash/linker.lf
 create mode 100644 tools/ldgen/__init__.py
 create mode 100644 tools/ldgen/fragments.py
 create mode 100644 tools/ldgen/generation.py
 create mode 100755 tools/ldgen/ldgen.py
 create mode 100644 tools/ldgen/ldgen_common.py
 create mode 100644 tools/ldgen/samples/esp32.lf
 create mode 100644 tools/ldgen/samples/mappings.lf
 create mode 100644 tools/ldgen/samples/sdkconfig
 create mode 100644 tools/ldgen/samples/sections.info
 create mode 100644 tools/ldgen/samples/template.ld
 create mode 100644 tools/ldgen/sdkconfig.py
 create mode 100644 tools/ldgen/test/data/Kconfig
 create mode 100644 tools/ldgen/test/data/sample.lf
 create mode 100644 tools/ldgen/test/data/sdkconfig
 create mode 100644 tools/ldgen/test/data/sections.info
 create mode 100644 tools/ldgen/test/data/template.ld
 create mode 100755 tools/ldgen/test/test_fragments.py
 create mode 100755 tools/ldgen/test/test_generation.py

diff --git a/components/esp8266/CMakeLists.txt b/components/esp8266/CMakeLists.txt
index dd93c975..ee344914 100644
--- a/components/esp8266/CMakeLists.txt
+++ b/components/esp8266/CMakeLists.txt
@@ -47,11 +47,13 @@ else()
     set(include_dirs "include" "include/driver")
 
     set(priv_requires "wpa_supplicant" "log" "spi_flash" "tcpip_adapter" "esp_ringbuf" "bootloader_support" "nvs_flash" "util")
+    set(fragments linker.lf ld/esp8266_fragments.lf)
 
     idf_component_register(SRCS "${srcs}"
                     INCLUDE_DIRS "${include_dirs}"
                     REQUIRES "${requires}"
                     PRIV_REQUIRES "${priv_requires}"
+                    LDFRAGMENTS "${fragments}"
                     REQUIRED_IDF_TARGETS esp8266)
 
     target_link_libraries(${COMPONENT_LIB} PUBLIC "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib" "-lstdc++")
@@ -73,7 +75,9 @@ else()
         endforeach()
     endif()
     target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/esp8266_out.ld")
-    target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/esp8266_common_out.ld")
+
+    target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/ld/esp8266.project.ld.in" 
+                        PROCESS "${CMAKE_CURRENT_BINARY_DIR}/ld/esp8266.project.ld")
 
     target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp8266.rom.ld")
     target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp8266.peripherals.ld")
@@ -93,13 +97,7 @@ else()
         MAIN_DEPENDENCY ${LD_DIR}/esp8266.ld ${SDKCONFIG_H}
         COMMENT "Generating memory map linker script..."
         VERBATIM)
-    add_custom_command(
-        OUTPUT esp8266_common_out.ld
-        COMMAND "${CMAKE_C_COMPILER}" -C -P -x c -E -o esp8266_common_out.ld -I ${CONFIG_DIR} ${LD_DIR}/esp8266.common.ld
-        MAIN_DEPENDENCY ${LD_DIR}/esp8266.common.ld ${SDKCONFIG_H}
-        COMMENT "Generating section linker script..."
-        VERBATIM)
-    add_custom_target(esp8266_linker_script DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/esp8266_out.ld" "${CMAKE_CURRENT_BINARY_DIR}/esp8266_common_out.ld")
+    add_custom_target(esp8266_linker_script DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/esp8266_out.ld")
     add_dependencies(${COMPONENT_LIB} esp8266_linker_script)
 
     if(CONFIG_ESP8266_PHY_INIT_DATA_IN_PARTITION)
diff --git a/components/esp8266/Makefile.projbuild b/components/esp8266/Makefile.projbuild
index 469e24df..95b46485 100644
--- a/components/esp8266/Makefile.projbuild
+++ b/components/esp8266/Makefile.projbuild
@@ -64,6 +64,13 @@ endif # CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION
 
 endif
 
+LINKER_SCRIPT_TEMPLATE := $(COMPONENT_PATH)/ld/esp8266.project.ld.in
+LINKER_SCRIPT_OUTPUT_DIR := $(abspath $(BUILD_DIR_BASE)/esp8266)
+
+# Target to generate linker script generator from fragments presented by each of
+# the components
+$(eval $(call ldgen_process_template,$(LINKER_SCRIPT_TEMPLATE),$(LINKER_SCRIPT_OUTPUT_DIR)/esp8266.project.ld))
+
 # global CFLAGS for ESP8266
 CFLAGS += -DICACHE_FLASH
 
diff --git a/components/esp8266/component.mk b/components/esp8266/component.mk
index 88ebe41f..181b36d5 100644
--- a/components/esp8266/component.mk
+++ b/components/esp8266/component.mk
@@ -25,11 +25,13 @@ endif
 #specifies its own scripts.
 LINKER_SCRIPTS += esp8266.rom.ld esp8266.peripherals.ld
 
+COMPONENT_ADD_LDFRAGMENTS += ld/esp8266_fragments.lf linker.lf
+
 COMPONENT_ADD_LDFLAGS += -L$(COMPONENT_PATH)/lib \
                          $(addprefix -l,$(LIBS)) \
                          -L $(COMPONENT_PATH)/ld \
                          -T esp8266_out.ld       \
-                         -T esp8266_common_out.ld \
+                         -T $(COMPONENT_BUILD_DIR)/esp8266.project.ld \
                          -Wl,--no-check-sections \
                          -u call_user_start      \
                          $(addprefix -T ,$(LINKER_SCRIPTS))
@@ -38,20 +40,18 @@ ALL_LIB_FILES := $(patsubst %,$(COMPONENT_PATH)/lib/lib%.a,$(LIBS))
 
 # final linking of project ELF depends on all binary libraries, and
 # all linker scripts
-COMPONENT_ADD_LINKER_DEPS := $(ALL_LIB_FILES) $(addprefix ld/,$(LINKER_SCRIPTS))
+COMPONENT_ADD_LINKER_DEPS := $(ALL_LIB_FILES) $(addprefix ld/, $(filter-out $(COMPONENT_BUILD_DIR)/esp8266.project.ld, $(LINKER_SCRIPTS))) \
+                             $(COMPONENT_BUILD_DIR)/esp8266.project.ld
 
 # Preprocess esp8266.ld linker script into esp8266_out.ld
 #
 # The library doesn't really depend on esp8266_out.ld, but it
 # saves us from having to add the target to a Makefile.projbuild
-$(COMPONENT_LIBRARY): esp8266_out.ld esp8266_common_out.ld
+$(COMPONENT_LIBRARY): esp8266_out.ld
 
 esp8266_out.ld: $(COMPONENT_PATH)/ld/esp8266.ld ../include/sdkconfig.h
 	$(CC) $(CFLAGS) -I ../include -C -P -x c -E $< -o $@
 
-esp8266_common_out.ld: $(COMPONENT_PATH)/ld/esp8266.common.ld ../include/sdkconfig.h
-	$(CC) -I ../include -C -P -x c -E $< -o $@
-
-COMPONENT_EXTRA_CLEAN := esp8266_out.ld
+COMPONENT_EXTRA_CLEAN := esp8266_out.ld $(COMPONENT_BUILD_DIR)/esp8266.project.ld
 
 endif
\ No newline at end of file
diff --git a/components/esp8266/include/esp8266/eagle_soc.h b/components/esp8266/include/esp8266/eagle_soc.h
index 0a83c636..34751404 100644
--- a/components/esp8266/include/esp8266/eagle_soc.h
+++ b/components/esp8266/include/esp8266/eagle_soc.h
@@ -181,7 +181,7 @@
 #define IRAM_SIZE                       (48 * 1024)
 
 #define FLASH_BASE                      (0x40200000)
-#define FLASH_SIZE                      (1 * 1024 * 1024)
+#define FLASH_SIZE                      (2 * 1024 * 1024)
 
 #define RTC_SYS_BASE                    (0x60001000)
 #define RTC_SYS_SIZE                    (0x200)
diff --git a/components/esp8266/ld/esp8266.common.ld b/components/esp8266/ld/esp8266.common.ld
deleted file mode 100644
index 3ab4cbac..00000000
--- a/components/esp8266/ld/esp8266.common.ld
+++ /dev/null
@@ -1,258 +0,0 @@
-/* This linker script generated from xt-genldscripts.tpp for LSP . */
-/* Linker Script for ld -N */
-
-#include "sdkconfig.h"
-
-PHDRS
-{
-  dport0_0_phdr PT_LOAD;
-  dram0_0_phdr PT_LOAD;
-  dram0_0_bss_phdr PT_LOAD;
-  iram1_0_phdr PT_LOAD;
-  irom0_0_phdr PT_LOAD;
-}
-
-/*  Default entry point:  */
-ENTRY(call_user_start)
-EXTERN(_DebugExceptionVector)
-EXTERN(_DoubleExceptionVector)
-EXTERN(_KernelExceptionVector)
-EXTERN(_NMIExceptionVector)
-EXTERN(_UserExceptionVector)
-PROVIDE(_memmap_vecbase_reset = 0x40000000);
-/* Various memory-map dependent cache attribute settings: */
-_memmap_cacheattr_wb_base = 0x00000110;
-_memmap_cacheattr_wt_base = 0x00000110;
-_memmap_cacheattr_bp_base = 0x00000220;
-_memmap_cacheattr_unused_mask = 0xFFFFF00F;
-_memmap_cacheattr_wb_trapnull = 0x2222211F;
-_memmap_cacheattr_wba_trapnull = 0x2222211F;
-_memmap_cacheattr_wbna_trapnull = 0x2222211F;
-_memmap_cacheattr_wt_trapnull = 0x2222211F;
-_memmap_cacheattr_bp_trapnull = 0x2222222F;
-_memmap_cacheattr_wb_strict = 0xFFFFF11F;
-_memmap_cacheattr_wt_strict = 0xFFFFF11F;
-_memmap_cacheattr_bp_strict = 0xFFFFF22F;
-_memmap_cacheattr_wb_allvalid = 0x22222112;
-_memmap_cacheattr_wt_allvalid = 0x22222112;
-_memmap_cacheattr_bp_allvalid = 0x22222222;
-PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
-
-SECTIONS
-{
-  .dport0.rodata : ALIGN(4)
-  {
-    _dport0_rodata_start = ABSOLUTE(.);
-    *(.dport0.rodata)
-    *(.dport.rodata)
-    _dport0_rodata_end = ABSOLUTE(.);
-  } >dport0_0_seg :dport0_0_phdr
-
-  .dport0.literal : ALIGN(4)
-  {
-    _dport0_literal_start = ABSOLUTE(.);
-    *(.dport0.literal)
-    *(.dport.literal)
-    _dport0_literal_end = ABSOLUTE(.);
-  } >dport0_0_seg :dport0_0_phdr
-
-  .dport0.data : ALIGN(4)
-  {
-    _dport0_data_start = ABSOLUTE(.);
-    *(.dport0.data)
-    *(.dport.data)
-    _dport0_data_end = ABSOLUTE(.);
-  } >dport0_0_seg :dport0_0_phdr
-
-  /* RTC memory holds user's data/rodata */
-  .rtc.data :
-  {
-    _rtc_data_start = ABSOLUTE(.);
-    *(.rtc.data .rtc.data.*)
-    *(.rtc.rodata .rtc.rodata.*)
-    _rtc_data_end = ABSOLUTE(.);
-  } > rtc_seg
-
-  .text : ALIGN(4)
-  {
-    _stext = .;
-    _text_start = ABSOLUTE(.);
-    LONG(_text_start)
-    . = ALIGN(16);
-    *(.DebugExceptionVector.text)
-    . = ALIGN(16);
-    *(.NMIExceptionVector.text)
-    . = ALIGN(16);
-    *(.KernelExceptionVector.text)
-    LONG(0)
-    LONG(0)
-    LONG(0)
-    LONG(0)
-    . = ALIGN(16);
-    *(.UserExceptionVector.text)
-    LONG(0)
-    LONG(0)
-    LONG(0)
-    LONG(0)
-    . = ALIGN(16);
-    *(.DoubleExceptionVector.text)
-    LONG(0)
-    LONG(0)
-    LONG(0)
-    LONG(0)
-    . = ALIGN (16);
-    *(.entry.text)
-    *(.init.literal)
-    *(.init)
-    *(.iram1 .iram1.*)
-    *libspi_flash.a:spi_flash_raw.*(.literal .text .literal.* .text.*)
-#ifdef CONFIG_ESP8266_WIFI_DEBUG_LOG_ENABLE
-    *libpp_dbg.a:(.literal .text .literal.* .text.*)
-#else
-    *libpp.a:(.literal .text .literal.* .text.*)
-#endif
-    *libphy.a:(.literal .text .literal.* .text.*)
-    *(.literal .text .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
-    *(.fini.literal)
-    *(.fini)
-    *(.gnu.version)
-
-#ifdef CONFIG_LWIP_GLOBAL_DATA_LINK_IRAM
-    *liblwip.a:(.bss .data .bss.* .data.* COMMON)
-#endif
-
-#ifdef CONFIG_TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM
-    *libtcpip_adapter.a:(.bss .data .bss.* .data.* COMMON)
-#endif
-
-#ifdef CONFIG_ESP8266_CORE_GLOBAL_DATA_LINK_IRAM
-#ifdef CONFIG_ESP8266_WIFI_DEBUG_LOG_ENABLE
-    *libcore_dbg.a:(.bss .data .bss.* .data.* COMMON)
-#else
-    *libcore.a:(.bss .data .bss.* .data.* COMMON)
-#endif
-#endif
-
-#ifdef CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM
-    *libfreertos.a:tasks.*(.bss .data .bss.* .data.* COMMON)
-    *libfreertos.a:timers.*(.bss .data .bss.* .data.* COMMON)
-    *libfreertos.a:freertos_hooks.*(.bss .data .bss.* .data.* COMMON)
-#endif
-
-#ifdef CONFIG_LINK_ETS_PRINTF_TO_IRAM
-    *libesp8266.a:ets_printf.*(.literal .text .literal.* .text.* .rodata.* .rodata)
-#endif
-
-    _text_end = ABSOLUTE(.);
-    _etext = .;
-  } >iram1_0_seg :iram1_0_phdr
-
-  .data : ALIGN(4)
-  {
-    _data_start = ABSOLUTE(.);
-    *(.data .data.*)
-    *(.dram0 .dram0.*)
-    *(.gnu.linkonce.d.*)
-    *(.data1)
-    *(.sdata .sdata.*)
-    *(.gnu.linkonce.s.*)
-    *(.sdata2 .sdata2.*)
-    *(.gnu.linkonce.s2.*)
-    *(.jcr)
-    _data_end = ABSOLUTE(.);
-  } >dram0_0_seg :dram0_0_phdr
-
-  .rodata : ALIGN(4)
-  {
-    _rodata_start = ABSOLUTE(.);
-#ifdef CONFIG_ESP8266_WIFI_DEBUG_LOG_ENABLE
-    *libpp_dbg.a:(.rodata.* .rodata)
-#else
-    *libpp.a:(.rodata.* .rodata)
-#endif
-    *liblog.a:(.rodata.* .rodata)
-    *(.gnu.linkonce.r.*)
-    *(.rodata1)
-    __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
-    *(.xt_except_table)
-    *(.gcc_except_table)
-    *(.gnu.linkonce.e.*)
-    *(.gnu.version_r)
-    *(.eh_frame)
-    . = (. + 3) & ~ 3;
-    /*  C++ constructor and destructor tables, properly ordered:  */
-    __init_array_start = ABSOLUTE(.);
-    KEEP (*crtbegin.*(.ctors))
-    KEEP (*(EXCLUDE_FILE (*crtend.*) .ctors))
-    KEEP (*(SORT(.ctors.*)))
-    KEEP (*(.ctors))
-    __init_array_end = ABSOLUTE(.);
-    KEEP (*crtbegin.*(.dtors))
-    KEEP (*(EXCLUDE_FILE (*crtend.*) .dtors))
-    KEEP (*(SORT(.dtors.*)))
-    KEEP (*(.dtors))
-    /*  C++ exception handlers table:  */
-    __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
-    *(.xt_except_desc)
-    *(.gnu.linkonce.h.*)
-    __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
-    *(.xt_except_desc_end)
-    *(.dynamic)
-    *(.gnu.version_d)
-    . = ALIGN(4);       /* this table MUST be 4-byte aligned */
-    _bss_table_start = ABSOLUTE(.);
-    LONG(_bss_start)
-    LONG(_bss_end)
-    _bss_table_end = ABSOLUTE(.);
-    _rodata_end = ABSOLUTE(.);
-  } >dram0_0_seg :dram0_0_phdr
-
-  .UserExceptionVector.literal : AT(LOADADDR(.rodata) + (ADDR(.UserExceptionVector.literal) - ADDR(.rodata))) ALIGN(4)
-  {
-    _UserExceptionVector_literal_start = ABSOLUTE(.);
-    *(.UserExceptionVector.literal)
-    _UserExceptionVector_literal_end = ABSOLUTE(.);
-  } >dram0_0_seg :dram0_0_phdr
-
-  .bss ALIGN(8) (NOLOAD) : ALIGN(4)
-  {
-    . = ALIGN (8);
-    _bss_start = ABSOLUTE(.);
-    *(.dynsbss)
-    *(.sbss .sbss.*)
-    *(.gnu.linkonce.sb.*)
-    *(.scommon)
-    *(.sbss2 .sbss2.*)
-    *(.gnu.linkonce.sb2.*)
-    *(.dynbss)
-    *(.bss .bss.*)
-    *(.gnu.linkonce.b.*)
-    *(COMMON)
-    . = ALIGN (8);
-    _bss_end = ABSOLUTE(.);
-    _heap_start = ABSOLUTE(.);
-/*    _stack_sentry = ALIGN(0x8); */
-  } >dram0_0_seg :dram0_0_bss_phdr
-/* __stack = 0x3ffc8000; */
-
-  .irom0.text : ALIGN(4)
-  {
-    _irom0_text_start = ABSOLUTE(.);
-    *(.user.data .user.data.*)
-    *(.rodata.* .rodata .irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text)
-    *(.literal.* .text.*)
-    *(.rodata2.* .rodata2 .literal2.* .literal2 .text2.* .text2)
-
-    _irom0_text_end = ABSOLUTE(.);
-  } >irom0_0_seg :irom0_0_phdr
-
-  .lit4 : ALIGN(4)
-  {
-    _lit4_start = ABSOLUTE(.);
-    *(*.lit4)
-    *(.lit4.*)
-    *(.gnu.linkonce.lit4.*)
-    _lit4_end = ABSOLUTE(.);
-  } >iram1_0_seg :iram1_0_phdr
-
-}
diff --git a/components/esp8266/ld/esp8266.ld b/components/esp8266/ld/esp8266.ld
index cff625b1..f04a5198 100644
--- a/components/esp8266/ld/esp8266.ld
+++ b/components/esp8266/ld/esp8266.ld
@@ -1,34 +1,44 @@
-/* user1.bin @ 0x1000, user2.bin @ 0x10000 */
+/* ESP8266 Linker Script Memory Layout
 
-/* Flash Map (1024KB + 1024KB), support 2MB/4MB SPI Flash */
-/* |..|........................|.....|.....|..|........................|.....|....|                        */
-/* ^  ^                        ^     ^     ^  ^                        ^     ^                             */
-/* |_boot start(0x0000)        |     |     |_pad start(0x100000)       |     |                             */
-/*    |_user1 start(0x1000)    |_user1 end    |_user2 start(0x101000)  |_user2 end                         */
-/*                                   |_system param symmetric area(0xfb000)  |_system param area(0x1fb000) */
+   This file describes the memory layout (memory blocks).
 
-/* NOTICE: */ 
-/* 1. You can change irom0 len, but MUST make sure user1 end not overlap system param symmetric area. */
-/* 2. Space between user1 end and pad start can be used as user param area.                           */
-/* 3. Space between user2 end and system param area can be used as user param area.                   */
-/* 4. Don't change any other seg.                                                                     */
-/* 5. user1.bin and user2.bin are same in this mode, so upgrade only need one of them.                */
+   esp8266.project.ld contains output sections to link compiler output
+   into these memory blocks.
 
+   ***
+
+   This linker script is passed through the C preprocessor to include
+   configuration options.
+
+   Please use preprocessor features sparingly! Restrict
+   to simple macros with numeric values, and/or #if/#endif blocks.
+*/
 #include "sdkconfig.h"
 
+
 MEMORY
 {
-  dport0_0_seg :    org = 0x3FF00000, len = 0x10
+  /* All these values assume the flash cache is on, and have the blocks this uses subtracted from the length
+  of the various regions. */
 
-  /* All .data/.bss/heap are in this segment. */
-  dram0_0_seg  :    org = 0x3FFE8000, len = 0x18000
+  /* IRAM for cpu. The length is due to the cache mode which is able to be set half or full mode. */
+  iram0_0_seg (RX) :                 org = 0x40100000, len = CONFIG_SOC_IRAM_SIZE
 
-  /* Functions which are critical should be put in this segment. */
-  iram1_0_seg  :    org = 0x40100000, len = CONFIG_SOC_IRAM_SIZE
+  /* Even though the segment name is iram, it is actually mapped to flash and mapped constant data */
+  iram0_2_seg (RX) :                 org = 0x40200010 + APP_OFFSET,
+                                     len = APP_SIZE - 0x10
 
-  /* It is actually mapped to flash. */
-  irom0_0_seg  :    org = 0x40200010 + APP_OFFSET, len = APP_SIZE - 0x10
+  /*
+    (0x18 offset above is a convenience for the app binary image generation. The .bin file which is flashed
+    to the chip has a 0x10 byte file header. Setting this offset makes it simple to meet the flash cache.)
+  */
 
-  /* RTC memory, persists over deep sleep. */
-  rtc_seg      :    org = 0x60001200, len = 0x200
+
+  /* Length of this section is 96KB */
+  dram0_0_seg (RW) :                 org = 0x3FFE8000, len = 0x18000
+
+  /* (See iram0_2_seg for meaning of 0x10 offset in the above.) */
+
+  /* RTC memory. Persists over deep sleep */
+  rtc_data_seg(RW) :                 org = 0x60001200, len = 0x200
 }
diff --git a/components/esp8266/ld/esp8266.project.ld.in b/components/esp8266/ld/esp8266.project.ld.in
new file mode 100644
index 00000000..66859e4c
--- /dev/null
+++ b/components/esp8266/ld/esp8266.project.ld.in
@@ -0,0 +1,247 @@
+/*  Default entry point:  */
+ENTRY(call_start_cpu);
+
+SECTIONS
+{
+  /* RTC data section holds RTC wake data/rodata
+     marked with RTC_DATA_ATTR, RTC_RODATA_ATTR attributes.
+  */
+  .rtc.data :
+  {
+    _rtc_data_start = ABSOLUTE(.);
+
+    mapping[rtc_data]
+
+    _rtc_data_end = ABSOLUTE(.);
+  } > rtc_data_seg
+
+  /* RTC bss */
+  .rtc.bss (NOLOAD) :
+  {
+    _rtc_bss_start = ABSOLUTE(.);
+
+    mapping[rtc_bss]
+
+    _rtc_bss_end = ABSOLUTE(.);
+  } > rtc_data_seg
+
+  /* This section holds data that should not be initialized at power up
+     and will be retained during deep sleep.
+     User data marked with RTC_NOINIT_ATTR will be placed
+     into this section. See the file "esp_attr.h" for more information.
+  */
+  .rtc_noinit (NOLOAD):
+  {
+    . = ALIGN(4);
+    _rtc_noinit_start = ABSOLUTE(.);
+    *(.rtc_noinit .rtc_noinit.*)
+    . = ALIGN(4) ;
+    _rtc_noinit_end = ABSOLUTE(.);
+  } > rtc_data_seg
+
+  ASSERT(((_rtc_noinit_end - ORIGIN(rtc_data_seg)) <= LENGTH(rtc_data_seg)),
+        "RTC segment data does not fit.")
+
+  /* Send .iram0 code to iram */
+  .iram0.vectors :
+  {
+    _iram_start = ABSOLUTE(.);
+    /* Vectors go to IRAM */
+    _init_start = ABSOLUTE(.);
+    LONG(_iram_start)
+    . = 0x10;
+    KEEP(*(.DebugExceptionVector.text));
+    . = 0x20;
+    KEEP(*(.NMIExceptionVector.text));
+    . = 0x30;
+    KEEP(*(.KernelExceptionVector.text));
+    . = 0x50;
+    KEEP(*(.UserExceptionVector.text));
+    . = 0x70;
+    KEEP(*(.DoubleExceptionVector.text));
+
+    *(.text .literal) 
+
+    *(.*Vector.literal)
+
+    *(.UserEnter.literal);
+    *(.UserEnter.text);
+    . = ALIGN (16);
+    *(.entry.text)
+    *(.init.literal)
+    *(.init)
+    _init_end = ABSOLUTE(.);
+  } > iram0_0_seg
+
+  .iram0.text :
+  {
+    /* Code marked as runnning out of IRAM */
+    _iram_text_start = ABSOLUTE(.);
+
+    mapping[iram0_text]
+
+    _iram_text_end = ABSOLUTE(.);
+    _iram_end = ABSOLUTE(.);
+  } > iram0_0_seg
+
+  ASSERT(((_iram_text_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)),
+          "IRAM0 segment data does not fit.")
+
+  .dram0.data :
+  {
+    _data_start = ABSOLUTE(.);
+    *(.gnu.linkonce.d.*)
+    *(.data1)
+    *(.sdata)
+    *(.sdata.*)
+    *(.gnu.linkonce.s.*)
+    *(.sdata2)
+    *(.sdata2.*)
+    *(.gnu.linkonce.s2.*)
+    *(.jcr)
+    *(.dram0 .dram0.*)
+
+    mapping[dram0_data]
+
+    _data_end = ABSOLUTE(.);
+    . = ALIGN(4);
+  } > dram0_0_seg
+
+  /*This section holds data that should not be initialized at power up.
+    The section located in Internal SRAM memory region. The macro _NOINIT
+    can be used as attribute to place data into this section.
+    See the esp_attr.h file for more information.
+  */
+  .noinit (NOLOAD):
+  {
+    . = ALIGN(4);
+    _noinit_start = ABSOLUTE(.);
+    *(.noinit .noinit.*)
+    . = ALIGN(4) ;
+    _noinit_end = ABSOLUTE(.);
+  } > dram0_0_seg
+
+  /* Shared RAM */
+  .dram0.bss (NOLOAD) :
+  {
+    . = ALIGN (8);
+    _bss_start = ABSOLUTE(.);
+
+    mapping[dram0_bss]
+
+    *(.dynsbss)
+    *(.sbss)
+    *(.sbss.*)
+    *(.gnu.linkonce.sb.*)
+    *(.scommon)
+    *(.sbss2)
+    *(.sbss2.*)
+    *(.gnu.linkonce.sb2.*)
+    *(.dynbss)
+    *(.share.mem)
+    *(.gnu.linkonce.b.*)
+
+    . = ALIGN (8);
+    _bss_end = ABSOLUTE(.);
+  } > dram0_0_seg
+
+  ASSERT(((_bss_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)),
+          "DRAM segment data does not fit.")
+
+  .flash.text :
+  {
+    _stext = .;
+    _text_start = ABSOLUTE(.);
+
+    mapping[flash_text]
+
+    /* For ESP8266 library function */
+    *(.irom0.literal .irom0.text)
+    *(.irom.literal .irom.text .irom.text.literal)
+    *(.text2 .text2.* .literal2 .literal2.*)
+
+    *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+    *(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */
+    *(.fini.literal)
+    *(.fini)
+    *(.gnu.version)
+    _text_end = ABSOLUTE(.);
+    _etext = .;
+
+    /* Similar to _iram_start, this symbol goes here so it is
+       resolved by addr2line in preference to the first symbol in
+       the flash.text segment.
+    */
+    _flash_cache_start = ABSOLUTE(0);
+  } >iram0_2_seg
+
+  .flash.rodata ALIGN(1) :
+  {
+    _rodata_start = ABSOLUTE(.);
+
+   /**
+      Insert 8 bytes data to make realy rodata section's link address offset to be 0x8,
+      esptool will remove these data and add real segment header
+    */
+    . = 0x8;
+
+    *(.rodata_desc .rodata_desc.*)               /* Should be the first.  App version info.        DO NOT PUT ANYTHING BEFORE IT! */
+    *(.rodata_custom_desc .rodata_custom_desc.*) /* Should be the second. Custom app version info. DO NOT PUT ANYTHING BEFORE IT! */
+
+    *(.rodata2 .rodata2.*)                       /* For ESP8266 library function */
+
+    mapping[flash_rodata]
+
+    *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
+    *(.gnu.linkonce.r.*)
+    *(.rodata1)
+    __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
+    *(.xt_except_table)
+    *(.gcc_except_table .gcc_except_table.*)
+    *(.gnu.linkonce.e.*)
+    *(.gnu.version_r)
+    . = (. + 3) & ~ 3;
+    __eh_frame = ABSOLUTE(.);
+    KEEP(*(.eh_frame))
+    . = (. + 7) & ~ 3;
+    /*  C++ constructor and destructor tables
+
+        Make a point of not including anything from crtbegin.o or crtend.o, as IDF doesn't use toolchain crt
+      */
+    __init_array_start = ABSOLUTE(.);
+    KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors .ctors.*))
+    __init_array_end = ABSOLUTE(.);
+    KEEP (*crtbegin.*(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.*) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    /*  C++ exception handlers table:  */
+    __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
+    *(.xt_except_desc)
+    *(.gnu.linkonce.h.*)
+    __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+    *(.xt_except_desc_end)
+    *(.dynamic)
+    *(.gnu.version_d)
+    /* Addresses of memory regions reserved via
+       SOC_RESERVE_MEMORY_REGION() */
+    soc_reserved_memory_region_start = ABSOLUTE(.);
+    KEEP (*(.reserved_memory_address))
+    soc_reserved_memory_region_end = ABSOLUTE(.);
+    _rodata_end = ABSOLUTE(.);
+    /* Literals are also RO data. */
+    _lit4_start = ABSOLUTE(.);
+    *(*.lit4)
+    *(.lit4.*)
+    *(.gnu.linkonce.lit4.*)
+    _lit4_end = ABSOLUTE(.);
+    . = ALIGN(4);
+    _thread_local_start = ABSOLUTE(.);
+    *(.tdata)
+    *(.tdata.*)
+    *(.tbss)
+    *(.tbss.*)
+    _thread_local_end = ABSOLUTE(.);
+    . = ALIGN(4);
+  } >iram0_2_seg
+}
diff --git a/components/esp8266/ld/esp8266_fragments.lf b/components/esp8266/ld/esp8266_fragments.lf
new file mode 100644
index 00000000..932197ca
--- /dev/null
+++ b/components/esp8266/ld/esp8266_fragments.lf
@@ -0,0 +1,89 @@
+[sections:text]
+entries:
+    .text+
+    .literal+
+
+[sections:data]
+entries:
+    .data+
+
+[sections:bss]
+entries:
+    .bss+
+
+[sections:common]
+entries:
+    COMMON
+
+[sections:rodata]
+entries:
+    .rodata+
+
+[sections:rtc_text]
+entries:
+    .rtc.text+
+    .rtc.literal
+
+[sections:rtc_data]
+entries:
+    .rtc.data+
+
+[sections:rtc_rodata]
+entries:
+    .rtc.rodata+
+
+[sections:rtc_bss]
+entries:
+    .rtc.bss
+
+[sections:iram]
+entries:
+    .iram1+
+
+[sections:dram]
+entries:
+    .dram1+
+
+[sections:wifi_iram]
+entries:
+    .wifi0iram+
+
+[scheme:default]
+entries:
+    text -> flash_text
+    rodata -> flash_rodata
+    data -> dram0_data
+    bss -> dram0_bss
+    common -> dram0_bss
+    iram -> iram0_text
+    dram -> dram0_data
+    rtc_text -> rtc_text
+    rtc_data -> rtc_data
+    rtc_rodata -> rtc_data
+    rtc_bss -> rtc_bss
+    wifi_iram -> flash_text
+
+[scheme:rtc]
+entries:
+    text -> rtc_text
+    data -> rtc_data
+    rodata -> rtc_data
+    bss -> rtc_bss
+    common -> rtc_bss
+
+[scheme:noflash]
+entries:
+    text -> iram0_text
+    rodata -> dram0_data
+
+[scheme:noflash_data]
+entries:
+    rodata -> dram0_data
+
+[scheme:noflash_text]
+entries:
+    text -> iram0_text
+
+[scheme:wifi_iram]
+entries:
+    wifi_iram -> iram0_text
diff --git a/components/esp8266/linker.lf b/components/esp8266/linker.lf
new file mode 100644
index 00000000..340844f1
--- /dev/null
+++ b/components/esp8266/linker.lf
@@ -0,0 +1,9 @@
+[mapping:pp]
+archive: libpp.a
+entries:
+    * (noflash_text)
+
+[mapping:phy]
+archive: libphy.a
+entries:
+    * (noflash_text)
diff --git a/components/esp8266/source/startup.c b/components/esp8266/source/startup.c
index 3770eb4d..0f7c6358 100644
--- a/components/esp8266/source/startup.c
+++ b/components/esp8266/source/startup.c
@@ -55,6 +55,9 @@ static inline int should_load(uint32_t load_addr)
             return 0;
     }
 
+    if (IS_FLASH(load_addr))
+        return 0;
+
     return 1;
 }
 
@@ -104,7 +107,7 @@ static void user_init_entry(void *param)
     vTaskDelete(NULL);
 }
 
-void call_user_start(size_t start_addr)
+void call_start_cpu(size_t start_addr)
 {
     int i;
     int *p;
diff --git a/components/esptool_py/esptool/esptool.py b/components/esptool_py/esptool/esptool.py
index de8258af..d1497ce4 100755
--- a/components/esptool_py/esptool/esptool.py
+++ b/components/esptool_py/esptool/esptool.py
@@ -1543,8 +1543,8 @@ class ESP8266V3FirmwareImage(BaseFirmwareImage):
             checksum = ESPLoader.ESP_CHECKSUM_MAGIC
 
             # split segments into flash-mapped vs ram-loaded, and take copies so we can mutate them
-            flash_segments = [copy.deepcopy(s) for s in sorted(self.segments, key=lambda s:s.addr) if self.is_flash_addr(s.addr)]
-            ram_segments = [copy.deepcopy(s) for s in sorted(self.segments, key=lambda s:s.addr) if not self.is_flash_addr(s.addr)]
+            flash_segments = [copy.deepcopy(s) for s in sorted(self.segments, key=lambda s:s.addr) if self.is_flash_addr(s.addr) and len(s.data)]
+            ram_segments = [copy.deepcopy(s) for s in sorted(self.segments, key=lambda s:s.addr) if not self.is_flash_addr(s.addr) and len(s.data)]
 
             IROM_ALIGN = 65536
 
@@ -1559,6 +1559,7 @@ class ESP8266V3FirmwareImage(BaseFirmwareImage):
                 #print('%x' % last_addr)
                 for segment in flash_segments[1:]:
                     if segment.addr // IROM_ALIGN == last_addr // IROM_ALIGN:
+                        print(segment)
                         raise FatalError(("Segment loaded at 0x%08x lands in same 64KB flash mapping as segment loaded at 0x%08x. " +
                                           "Can't generate binary. Suggest changing linker script or ELF to merge sections.") %
                                          (segment.addr, last_addr))
@@ -1599,6 +1600,9 @@ class ESP8266V3FirmwareImage(BaseFirmwareImage):
                     checksum = self.save_segment(f, pad_segment, checksum)
                     total_segments += 1
                 else:
+                    # remove 8 bytes empty data for insert segment header
+                    if segment.name == '.flash.rodata':
+                        segment.data = segment.data[8:]
                     # write the flash segment
                     #assert (f.tell() + 8) % IROM_ALIGN == segment.addr % IROM_ALIGN
                     checksum = self.save_segment(f, segment, checksum)
diff --git a/components/heap/port/esp8266/esp_heap_init.c b/components/heap/port/esp8266/esp_heap_init.c
index 1afa0a91..fe01be7b 100644
--- a/components/heap/port/esp8266/esp_heap_init.c
+++ b/components/heap/port/esp8266/esp_heap_init.c
@@ -21,18 +21,18 @@ heap_region_t g_heap_region[HEAP_REGIONS_MAX];
  */
 void heap_caps_init(void)
 {
-    extern char _heap_start;
+    extern char _bss_end;
 
 #ifndef CONFIG_SOC_FULL_ICACHE
-    extern char _lit4_end;
+    extern char _iram_end;
 
-    g_heap_region[0].start_addr = (uint8_t *)&_lit4_end;
-    g_heap_region[0].total_size = ((size_t)(0x4010C000 - (uint32_t)&_lit4_end));
+    g_heap_region[0].start_addr = (uint8_t *)&_iram_end;
+    g_heap_region[0].total_size = ((size_t)(0x4010C000 - (uint32_t)&_iram_end));
     g_heap_region[0].caps = MALLOC_CAP_32BIT;
 #endif
 
-    g_heap_region[HEAP_REGIONS_MAX - 1].start_addr = (uint8_t *)&_heap_start;
-    g_heap_region[HEAP_REGIONS_MAX - 1].total_size = ((size_t)(0x40000000 - (uint32_t)&_heap_start));
+    g_heap_region[HEAP_REGIONS_MAX - 1].start_addr = (uint8_t *)&_bss_end;
+    g_heap_region[HEAP_REGIONS_MAX - 1].total_size = ((size_t)(0x40000000 - (uint32_t)&_bss_end));
     g_heap_region[HEAP_REGIONS_MAX - 1].caps = MALLOC_CAP_8BIT | MALLOC_CAP_32BIT | MALLOC_CAP_DMA;
 
     esp_heap_caps_init_region(g_heap_region, HEAP_REGIONS_MAX);
diff --git a/components/log/CMakeLists.txt b/components/log/CMakeLists.txt
index ad162fe1..203191e0 100644
--- a/components/log/CMakeLists.txt
+++ b/components/log/CMakeLists.txt
@@ -1,4 +1,3 @@
-set(COMPONENT_SRCDIRS ".")
-set(COMPONENT_ADD_INCLUDEDIRS "include")
-set(COMPONENT_REQUIRES)
-register_component()
+idf_component_register(SRCS "log.c"
+                       INCLUDE_DIRS "include"
+                       LDFRAGMENTS "linker.lf")
diff --git a/components/log/component.mk b/components/log/component.mk
index c2c4c03a..f5e7fc77 100755
--- a/components/log/component.mk
+++ b/components/log/component.mk
@@ -1,5 +1,2 @@
-#
-# Component Makefile
-#
-# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
 
+COMPONENT_ADD_LDFRAGMENTS += linker.lf
diff --git a/components/log/linker.lf b/components/log/linker.lf
new file mode 100644
index 00000000..78644ee8
--- /dev/null
+++ b/components/log/linker.lf
@@ -0,0 +1,4 @@
+[mapping:log]
+archive: liblog.a
+entries:
+    * (noflash_data)
diff --git a/components/spi_flash/CMakeLists.txt b/components/spi_flash/CMakeLists.txt
index 21f7c987..b2a0f715 100644
--- a/components/spi_flash/CMakeLists.txt
+++ b/components/spi_flash/CMakeLists.txt
@@ -1,14 +1,14 @@
+set(srcs "src/partition"
+         "src/spi_flash_raw.c"
+         "src/spi_flash.c")
 if(BOOTLOADER_BUILD)
-    # Bootloader needs SPIUnlock from this file, but doesn't
-    # need other parts of this component
-    set(COMPONENT_SRCDIRS "src" "port")
-    set(COMPONENT_PRIV_REQUIRES "bootloader_support")
+    set(srcs "${srcs}" "port/port.c")
+    set(priv_requires "bootloader_support")
 else()
-    set(COMPONENT_SRCDIRS "src" "port")
-    set(COMPONENT_PRIV_REQUIRES "esp8266" "freertos" "bootloader_support")
+    set(priv_requires "esp8266" "freertos" "bootloader_support")
 endif()
 
-set(COMPONENT_ADD_INCLUDEDIRS include)
-set(COMPONENT_REQUIRES)
-
-register_component()
+idf_component_register(SRCS "${srcs}"
+                       PRIV_REQUIRES "${priv_requires}"
+                       INCLUDE_DIRS "include"
+                       LDFRAGMENTS "linker.lf")
diff --git a/components/spi_flash/component.mk b/components/spi_flash/component.mk
index 6e3dda5c..f5eb97ca 100644
--- a/components/spi_flash/component.mk
+++ b/components/spi_flash/component.mk
@@ -8,6 +8,8 @@ ifdef IS_BOOTLOADER_BUILD
 COMPONENT_OBJS := src/spi_flash.o src/spi_flash_raw.o
 endif
 
+COMPONENT_ADD_LDFRAGMENTS += linker.lf
+
 CFLAGS += -DPARTITION_QUEUE_HEADER=\"sys/queue.h\"
 
 ifdef IS_BOOTLOADER_BUILD
diff --git a/components/spi_flash/linker.lf b/components/spi_flash/linker.lf
new file mode 100644
index 00000000..9ac365ea
--- /dev/null
+++ b/components/spi_flash/linker.lf
@@ -0,0 +1,4 @@
+[mapping:spi_flash]
+archive: libspi_flash.a
+entries:
+    spi_flash_raw (noflash)
diff --git a/tools/ldgen/__init__.py b/tools/ldgen/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tools/ldgen/fragments.py b/tools/ldgen/fragments.py
new file mode 100644
index 00000000..0339f584
--- /dev/null
+++ b/tools/ldgen/fragments.py
@@ -0,0 +1,425 @@
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+import os
+import re
+
+from sdkconfig import SDKConfig
+from pyparsing import OneOrMore
+from pyparsing import restOfLine
+from pyparsing import alphanums
+from pyparsing import Word
+from pyparsing import alphas
+from pyparsing import ParseFatalException
+from pyparsing import Suppress
+from pyparsing import Group
+from pyparsing import Literal
+from pyparsing import ZeroOrMore
+from pyparsing import Optional
+from pyparsing import originalTextFor
+from pyparsing import Forward
+from pyparsing import indentedBlock
+from collections import namedtuple
+import abc
+
+
+KeyGrammar = namedtuple("KeyGrammar", "grammar min max required")
+
+
+class FragmentFile():
+    """
+    Fragment file internal representation. Parses and stores instances of the fragment definitions
+    contained within the file.
+    """
+
+    def __init__(self, fragment_file, sdkconfig):
+        try:
+            fragment_file = open(fragment_file, "r")
+        except TypeError:
+            pass
+
+        path = os.path.realpath(fragment_file.name)
+
+        indent_stack = [1]
+
+        class parse_ctx:
+            fragment = None  # current fragment
+            key = ""  # current key
+            keys = list()  # list of keys parsed
+            key_grammar = None  # current key grammar
+
+            @staticmethod
+            def reset():
+                parse_ctx.fragment_instance = None
+                parse_ctx.key = ""
+                parse_ctx.keys = list()
+                parse_ctx.key_grammar = None
+
+        def fragment_type_parse_action(toks):
+            parse_ctx.reset()
+            parse_ctx.fragment = FRAGMENT_TYPES[toks[0]]()  # create instance of the fragment
+            return None
+
+        def expand_conditionals(toks, stmts):
+            try:
+                stmt = toks["value"]
+                stmts.append(stmt)
+            except KeyError:
+                try:
+                    conditions = toks["conditional"]
+                    for condition in conditions:
+                        try:
+                            _toks = condition[1]
+                            _cond = condition[0]
+                            if sdkconfig.evaluate_expression(_cond):
+                                expand_conditionals(_toks, stmts)
+                                break
+                        except IndexError:
+                            expand_conditionals(condition[0], stmts)
+                except KeyError:
+                    for tok in toks:
+                        expand_conditionals(tok, stmts)
+
+        def key_body_parsed(pstr, loc, toks):
+            stmts = list()
+            expand_conditionals(toks, stmts)
+
+            if parse_ctx.key_grammar.min and len(stmts) < parse_ctx.key_grammar.min:
+                raise ParseFatalException(pstr, loc, "fragment requires at least %d values for key '%s'" %
+                                          (parse_ctx.key_grammar.min, parse_ctx.key))
+
+            if parse_ctx.key_grammar.max and len(stmts) > parse_ctx.key_grammar.max:
+                raise ParseFatalException(pstr, loc, "fragment requires at most %d values for key '%s'" %
+                                          (parse_ctx.key_grammar.max, parse_ctx.key))
+
+            try:
+                parse_ctx.fragment.set_key_value(parse_ctx.key, stmts)
+            except Exception as e:
+                raise ParseFatalException(pstr, loc, "unable to add key '%s'; %s" % (parse_ctx.key, e.message))
+            return None
+
+        key = Word(alphanums + "_") + Suppress(":")
+        key_stmt = Forward()
+
+        condition_block = indentedBlock(key_stmt, indent_stack)
+        key_stmts = OneOrMore(condition_block)
+        key_body = Suppress(key) + key_stmts
+        key_body.setParseAction(key_body_parsed)
+
+        condition = originalTextFor(SDKConfig.get_expression_grammar()).setResultsName("condition")
+        if_condition = Group(Suppress("if") + condition + Suppress(":") + condition_block)
+        elif_condition = Group(Suppress("elif") + condition + Suppress(":") + condition_block)
+        else_condition = Group(Suppress("else") + Suppress(":") + condition_block)
+        conditional = (if_condition + Optional(OneOrMore(elif_condition)) + Optional(else_condition)).setResultsName("conditional")
+
+        def key_parse_action(pstr, loc, toks):
+            key = toks[0]
+
+            if key in parse_ctx.keys:
+                raise ParseFatalException(pstr, loc, "duplicate key '%s' value definition" % parse_ctx.key)
+
+            parse_ctx.key = key
+            parse_ctx.keys.append(key)
+
+            try:
+                parse_ctx.key_grammar = parse_ctx.fragment.get_key_grammars()[key]
+                key_grammar = parse_ctx.key_grammar.grammar
+            except KeyError:
+                raise ParseFatalException(pstr, loc, "key '%s' is not supported by fragment" % key)
+            except Exception as e:
+                raise ParseFatalException(pstr, loc, "unable to parse key '%s'; %s" % (key, e.message))
+
+            key_stmt << (conditional | Group(key_grammar).setResultsName("value"))
+
+            return None
+
+        def name_parse_action(pstr, loc, toks):
+            parse_ctx.fragment.name = toks[0]
+
+        key.setParseAction(key_parse_action)
+
+        ftype = Word(alphas).setParseAction(fragment_type_parse_action)
+        fid = Suppress(":") + Word(alphanums + "_.").setResultsName("name")
+        fid.setParseAction(name_parse_action)
+        header = Suppress("[") + ftype + fid + Suppress("]")
+
+        def fragment_parse_action(pstr, loc, toks):
+            key_grammars = parse_ctx.fragment.get_key_grammars()
+            required_keys = set([k for (k,v) in key_grammars.items() if v.required])
+            present_keys = required_keys.intersection(set(parse_ctx.keys))
+            if present_keys != required_keys:
+                raise ParseFatalException(pstr, loc, "required keys %s for fragment not found" %
+                                          list(required_keys - present_keys))
+            return parse_ctx.fragment
+
+        fragment_stmt = Forward()
+        fragment_block = indentedBlock(fragment_stmt, indent_stack)
+
+        fragment_if_condition = Group(Suppress("if") + condition + Suppress(":") + fragment_block)
+        fragment_elif_condition = Group(Suppress("elif") + condition + Suppress(":") + fragment_block)
+        fragment_else_condition = Group(Suppress("else") + Suppress(":") + fragment_block)
+        fragment_conditional = (fragment_if_condition + Optional(OneOrMore(fragment_elif_condition)) +
+                                Optional(fragment_else_condition)).setResultsName("conditional")
+
+        fragment = (header + OneOrMore(indentedBlock(key_body, indent_stack, False))).setResultsName("value")
+        fragment.setParseAction(fragment_parse_action)
+        fragment.ignore("#" + restOfLine)
+
+        deprecated_mapping = DeprecatedMapping.get_fragment_grammar(sdkconfig, fragment_file.name).setResultsName("value")
+
+        fragment_stmt << (Group(deprecated_mapping) | Group(fragment) | Group(fragment_conditional))
+
+        def fragment_stmt_parsed(pstr, loc, toks):
+            stmts = list()
+            expand_conditionals(toks, stmts)
+            return stmts
+
+        parser = ZeroOrMore(fragment_stmt)
+        parser.setParseAction(fragment_stmt_parsed)
+
+        self.fragments = parser.parseFile(fragment_file, parseAll=True)
+
+        for fragment in self.fragments:
+            fragment.path = path
+
+
+class Fragment():
+    __metaclass__ = abc.ABCMeta
+    """
+    Encapsulates a fragment as defined in the generator syntax. Sets values common to all fragment and performs processing
+    such as checking the validity of the fragment name and getting the entry values.
+    """
+
+    IDENTIFIER = Word(alphas + "_", alphanums + "_")
+    ENTITY = Word(alphanums + ".-_$")
+
+    @abc.abstractmethod
+    def set_key_value(self, key, parse_results):
+        pass
+
+    @abc.abstractmethod
+    def get_key_grammars(self):
+        pass
+
+
+class Sections(Fragment):
+
+    grammars = {
+        "entries": KeyGrammar(Word(alphanums + "+.").setResultsName("section"), 1, None, True)
+    }
+
+    """
+    Utility function that returns a list of sections given a sections fragment entry,
+    with the '+' notation and symbol concatenation handled automatically.
+    """
+    @staticmethod
+    def get_section_data_from_entry(sections_entry, symbol=None):
+        if not symbol:
+            sections = list()
+            sections.append(sections_entry.replace("+", ""))
+            sections.append(sections_entry.replace("+", ".*"))
+            return sections
+        else:
+            if sections_entry.endswith("+"):
+                section = sections_entry.replace("+", ".*")
+                expansion = section.replace(".*", "." + symbol)
+                return (section, expansion)
+            else:
+                return (sections_entry, None)
+
+    def set_key_value(self, key, parse_results):
+        if key == "entries":
+            self.entries = set()
+            for result in parse_results:
+                self.entries.add(result["section"])
+
+    def get_key_grammars(self):
+        return self.__class__.grammars
+
+
+class Scheme(Fragment):
+    """
+    Encapsulates a scheme fragment, which defines what target input sections are placed under.
+    """
+
+    grammars = {
+        "entries": KeyGrammar(Fragment.IDENTIFIER.setResultsName("sections") + Suppress("->") +
+                              Fragment.IDENTIFIER.setResultsName("target"), 1, None, True)
+    }
+
+    def set_key_value(self, key, parse_results):
+        if key == "entries":
+            self.entries = set()
+            for result in parse_results:
+                self.entries.add((result["sections"], result["target"]))
+
+    def get_key_grammars(self):
+        return self.__class__.grammars
+
+
+class Mapping(Fragment):
+    """
+    Encapsulates a mapping fragment, which defines what targets the input sections of mappable entties are placed under.
+    """
+
+    MAPPING_ALL_OBJECTS = "*"
+
+    def __init__(self):
+        Fragment.__init__(self)
+        self.entries = set()
+        self.deprecated = False
+
+    def set_key_value(self, key, parse_results):
+        if key == "archive":
+            self.archive = parse_results[0]["archive"]
+        elif key == "entries":
+            for result in parse_results:
+                obj = None
+                symbol = None
+                scheme = None
+
+                try:
+                    obj = result["object"]
+                except KeyError:
+                    pass
+
+                try:
+                    symbol = result["symbol"]
+                except KeyError:
+                    pass
+
+                try:
+                    scheme = result["scheme"]
+                except KeyError:
+                    pass
+
+                self.entries.add((obj, symbol, scheme))
+
+    def get_key_grammars(self):
+        # There are three possible patterns for mapping entries:
+        #       obj:symbol (scheme)
+        #       obj (scheme)
+        #       * (scheme)
+        obj = Fragment.ENTITY.setResultsName("object")
+        symbol = Suppress(":") + Fragment.IDENTIFIER.setResultsName("symbol")
+        scheme = Suppress("(") + Fragment.IDENTIFIER.setResultsName("scheme") + Suppress(")")
+
+        pattern1 = obj + symbol + scheme
+        pattern2 = obj + scheme
+        pattern3 = Literal(Mapping.MAPPING_ALL_OBJECTS).setResultsName("object") + scheme
+
+        entry = pattern1 | pattern2 | pattern3
+
+        grammars = {
+            "archive": KeyGrammar(Fragment.ENTITY.setResultsName("archive"), 1, 1, True),
+            "entries": KeyGrammar(entry, 0, None, True)
+        }
+
+        return grammars
+
+
+class DeprecatedMapping():
+    """
+    Encapsulates a mapping fragment, which defines what targets the input sections of mappable entties are placed under.
+    """
+
+    # Name of the default condition entry
+    DEFAULT_CONDITION = "default"
+    MAPPING_ALL_OBJECTS = "*"
+
+    @staticmethod
+    def get_fragment_grammar(sdkconfig, fragment_file):
+
+        # Match header [mapping]
+        header = Suppress("[") + Suppress("mapping") + Suppress("]")
+
+        # There are three possible patterns for mapping entries:
+        #       obj:symbol (scheme)
+        #       obj (scheme)
+        #       * (scheme)
+        obj = Fragment.ENTITY.setResultsName("object")
+        symbol = Suppress(":") + Fragment.IDENTIFIER.setResultsName("symbol")
+        scheme = Suppress("(") + Fragment.IDENTIFIER.setResultsName("scheme") + Suppress(")")
+
+        pattern1 = Group(obj + symbol + scheme)
+        pattern2 = Group(obj + scheme)
+        pattern3 = Group(Literal(Mapping.MAPPING_ALL_OBJECTS).setResultsName("object") + scheme)
+
+        mapping_entry = pattern1 | pattern2 | pattern3
+
+        # To simplify parsing, classify groups of condition-mapping entry into two types: normal and default
+        # A normal grouping is one with a non-default condition. The default grouping is one which contains the
+        # default condition
+        mapping_entries = Group(ZeroOrMore(mapping_entry)).setResultsName("mappings")
+
+        normal_condition = Suppress(":") + originalTextFor(SDKConfig.get_expression_grammar())
+        default_condition = Optional(Suppress(":") + Literal(DeprecatedMapping.DEFAULT_CONDITION))
+
+        normal_group = Group(normal_condition.setResultsName("condition") + mapping_entries)
+        default_group = Group(default_condition + mapping_entries).setResultsName("default_group")
+
+        normal_groups = Group(ZeroOrMore(normal_group)).setResultsName("normal_groups")
+
+        # Any mapping fragment definition can have zero or more normal group and only one default group as a last entry.
+        archive = Suppress("archive") + Suppress(":") + Fragment.ENTITY.setResultsName("archive")
+        entries = Suppress("entries") + Suppress(":") + (normal_groups + default_group).setResultsName("entries")
+
+        mapping = Group(header + archive + entries)
+        mapping.ignore("#" + restOfLine)
+
+        def parsed_deprecated_mapping(pstr, loc, toks):
+            fragment = Mapping()
+            fragment.archive = toks[0].archive
+            fragment.name = re.sub(r"[^0-9a-zA-Z]+", "_", fragment.archive)
+            fragment.deprecated = True
+
+            fragment.entries = set()
+            condition_true = False
+            for entries in toks[0].entries[0]:
+                condition  = next(iter(entries.condition.asList())).strip()
+                condition_val = sdkconfig.evaluate_expression(condition)
+
+                if condition_val:
+                    for entry in entries[1]:
+                        fragment.entries.add((entry.object, None if entry.symbol == '' else entry.symbol, entry.scheme))
+                    condition_true = True
+                    break
+
+            if not fragment.entries and not condition_true:
+                try:
+                    entries = toks[0].entries[1][1]
+                except IndexError:
+                    entries = toks[0].entries[1][0]
+                for entry in entries:
+                    fragment.entries.add((entry.object, None if entry.symbol == '' else entry.symbol, entry.scheme))
+
+            if not fragment.entries:
+                fragment.entries.add(("*", None, "default"))
+
+            dep_warning = str(ParseFatalException(pstr, loc,
+                              "Warning: Deprecated old-style mapping fragment parsed in file %s." % fragment_file))
+
+            print(dep_warning)
+            return fragment
+
+        mapping.setParseAction(parsed_deprecated_mapping)
+        return mapping
+
+
+FRAGMENT_TYPES = {
+    "sections": Sections,
+    "scheme": Scheme,
+    "mapping": Mapping
+}
diff --git a/tools/ldgen/generation.py b/tools/ldgen/generation.py
new file mode 100644
index 00000000..686defc3
--- /dev/null
+++ b/tools/ldgen/generation.py
@@ -0,0 +1,636 @@
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import collections
+import itertools
+import os
+import fnmatch
+
+from fragments import Sections, Scheme, Mapping, Fragment
+from pyparsing import Suppress, White, ParseException, Literal, Group, ZeroOrMore
+from pyparsing import Word, OneOrMore, nums, alphanums, alphas, Optional, LineEnd, printables
+from ldgen_common import LdGenFailure
+
+
+class PlacementRule():
+    """
+    Encapsulates a generated placement rule placed under a target
+    """
+
+    DEFAULT_SPECIFICITY = 0
+    ARCHIVE_SPECIFICITY = 1
+    OBJECT_SPECIFICITY = 2
+    SYMBOL_SPECIFICITY = 3
+
+    class __container():
+        def __init__(self, content):
+            self.content = content
+
+    __metadata = collections.namedtuple("__metadata", "excludes expansions expanded")
+
+    def __init__(self, archive, obj, symbol, sections, target):
+        if archive == "*":
+            archive = None
+
+        if obj == "*":
+            obj = None
+
+        self.archive = archive
+        self.obj = obj
+        self.symbol = symbol
+        self.target = target
+        self.sections = dict()
+
+        self.specificity = 0
+        self.specificity += 1 if self.archive else 0
+        self.specificity += 1 if (self.obj and not self.obj == '*') else 0
+        self.specificity += 1 if self.symbol else 0
+
+        for section in sections:
+            section_data = Sections.get_section_data_from_entry(section, self.symbol)
+
+            if not self.symbol:
+                for s in section_data:
+                    metadata = self.__metadata(self.__container([]), self.__container([]), self.__container(False))
+                    self.sections[s] = metadata
+            else:
+                (section, expansion) = section_data
+                if expansion:
+                    metadata = self.__metadata(self.__container([]), self.__container([expansion]), self.__container(True))
+                    self.sections[section] = metadata
+
+    def get_section_names(self):
+        return self.sections.keys()
+
+    def add_exclusion(self, other, sections_infos=None):
+        # Utility functions for this method
+        def do_section_expansion(rule, section):
+            if section in rule.get_section_names():
+                sections_in_obj = sections_infos.get_obj_sections(rule.archive, rule.obj)
+
+                expansions = fnmatch.filter(sections_in_obj, section)
+                return expansions
+
+        def remove_section_expansions(rule, section, expansions):
+            existing_expansions = self.sections[section].expansions.content
+            self.sections[section].expansions.content = [e for e in existing_expansions if e not in expansions]
+
+        # Exit immediately if the exclusion to be added is more general than this rule.
+        if not other.is_more_specific_rule_of(self):
+            return
+
+        for section in self.get_sections_intersection(other):
+            if(other.specificity == PlacementRule.SYMBOL_SPECIFICITY):
+                # If this sections has not been expanded previously, expand now and keep track.
+                previously_expanded = self.sections[section].expanded.content
+                if not previously_expanded:
+                    expansions = do_section_expansion(self, section)
+                    if expansions:
+                        self.sections[section].expansions.content = expansions
+                        self.sections[section].expanded.content = True
+                        previously_expanded = True
+
+                # Remove the sections corresponding to the symbol name
+                remove_section_expansions(self, section, other.sections[section].expansions.content)
+
+                # If it has been expanded previously but now the expansions list is empty,
+                # it means adding exclusions has exhausted the list. Remove the section entirely.
+                if previously_expanded and not self.sections[section].expanded.content:
+                    del self.sections[section]
+            else:
+                # A rule section can have multiple rule sections excluded from it. Get the
+                # most specific rule from the list, and if an even more specific rule is found,
+                # replace it entirely. Otherwise, keep appending.
+                exclusions = self.sections[section].excludes
+                exclusions_list = exclusions.content if exclusions.content is not None else []
+                exclusions_to_remove = filter(lambda r: r.is_more_specific_rule_of(other), exclusions_list)
+
+                remaining_exclusions = [e for e in exclusions_list if e not in exclusions_to_remove]
+                remaining_exclusions.append(other)
+
+                self.sections[section].excludes.content = remaining_exclusions
+
+    def get_sections_intersection(self, other):
+        return set(self.sections.keys()).intersection(set(other.sections.keys()))
+
+    def is_more_specific_rule_of(self, other):
+        if (self.specificity <= other.specificity):
+            return False
+
+        # Compare archive, obj and target
+        for entity_index in range(1, other.specificity + 1):
+            if self[entity_index] != other[entity_index] and other[entity_index] is not None:
+                return False
+
+        return True
+
+    def maps_same_entities_as(self, other):
+        if self.specificity != other.specificity:
+            return False
+
+        # Compare archive, obj and target
+        for entity_index in range(1, other.specificity + 1):
+            if self[entity_index] != other[entity_index] and other[entity_index] is not None:
+                return False
+
+        return True
+
+    def __getitem__(self, key):
+        if key == PlacementRule.ARCHIVE_SPECIFICITY:
+            return self.archive
+        elif key == PlacementRule.OBJECT_SPECIFICITY:
+            return self.obj
+        elif key == PlacementRule.SYMBOL_SPECIFICITY:
+            return self.symbol
+        else:
+            return None
+
+    def __str__(self):
+        sorted_sections = sorted(self.get_section_names())
+
+        sections_string = list()
+
+        for section in sorted_sections:
+            exclusions = self.sections[section].excludes.content
+
+            exclusion_string = None
+
+            if exclusions:
+                exclusion_string = " ".join(map(lambda e: "*" + e.archive + (":" + e.obj + ".*" if e.obj else ""), exclusions))
+                exclusion_string = "EXCLUDE_FILE(" + exclusion_string + ")"
+            else:
+                exclusion_string = ""
+
+            section_string = None
+            exclusion_section_string = None
+
+            section_expansions = self.sections[section].expansions.content
+            section_expanded = self.sections[section].expanded.content
+
+            if section_expansions and section_expanded:
+                section_string = " ".join(section_expansions)
+                exclusion_section_string = section_string
+            else:
+                section_string = section
+                exclusion_section_string = exclusion_string + " " + section_string
+
+            sections_string.append(exclusion_section_string)
+
+        sections_string = " ".join(sections_string)
+
+        archive = str(self.archive) if self.archive else ""
+        obj = (str(self.obj) + (".*" if self.obj else "")) if self.obj else ""
+
+        # Handle output string generation based on information available
+        if self.specificity == PlacementRule.DEFAULT_SPECIFICITY:
+            rule_string = "*(%s)" % (sections_string)
+        elif self.specificity == PlacementRule.ARCHIVE_SPECIFICITY:
+            rule_string = "*%s:(%s)" % (archive, sections_string)
+        else:
+            rule_string = "*%s:%s(%s)" % (archive, obj, sections_string)
+
+        return rule_string
+
+    def __eq__(self, other):
+        if id(self) == id(other):
+            return True
+
+        def exclusions_set(exclusions):
+            exclusions_set = {(e.archive, e.obj, e.symbol, e.target) for e in exclusions}
+            return exclusions_set
+
+        if self.archive != other.archive:
+            return False
+
+        if self.obj != other.obj:
+            return False
+
+        if self.symbol != other.symbol:
+            return False
+
+        if set(self.sections.keys()) != set(other.sections.keys()):
+            return False
+
+        for (section, metadata) in self.sections.items():
+
+            self_meta = metadata
+            other_meta = other.sections[section]
+
+            if exclusions_set(self_meta.excludes.content) != exclusions_set(other_meta.excludes.content):
+                return False
+
+            if set(self_meta.expansions.content) != set(other_meta.expansions.content):
+                return False
+
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __iter__(self):
+        yield self.archive
+        yield self.obj
+        yield self.symbol
+        raise StopIteration
+
+
+class GenerationModel:
+    """
+    Implements generation of placement rules based on collected sections, scheme and mapping fragment.
+    """
+
+    DEFAULT_SCHEME = "default"
+
+    def __init__(self):
+        self.schemes = {}
+        self.sections = {}
+        self.mappings = {}
+
+    def _add_mapping_rules(self, archive, obj, symbol, scheme_name, scheme_dict, rules):
+        # Use an ordinary dictionary to raise exception on non-existing keys
+        temp_dict = dict(scheme_dict)
+
+        sections_bucket = temp_dict[scheme_name]
+
+        for (target, sections) in sections_bucket.items():
+            section_entries = []
+
+            for section in sections:
+                section_entries.extend(section.entries)
+
+            rule = PlacementRule(archive, obj, symbol, section_entries, target)
+
+            if rule not in rules:
+                rules.append(rule)
+
+    def _build_scheme_dictionary(self):
+        scheme_dictionary = collections.defaultdict(dict)
+
+        # Collect sections into buckets based on target name
+        for scheme in self.schemes.values():
+            sections_bucket = collections.defaultdict(list)
+
+            for (sections_name, target_name) in scheme.entries:
+                # Get the sections under the bucket 'target_name'. If this bucket does not exist
+                # is is created automatically
+                sections_in_bucket = sections_bucket[target_name]
+
+                try:
+                    sections = self.sections[sections_name]
+                except KeyError:
+                    message = GenerationException.UNDEFINED_REFERENCE + " to sections '" + sections + "'."
+                    raise GenerationException(message, scheme)
+
+                sections_in_bucket.append(sections)
+
+            scheme_dictionary[scheme.name] = sections_bucket
+
+        # Search for and raise exception on first instance of sections mapped to multiple targets
+        for (scheme_name, sections_bucket) in scheme_dictionary.items():
+            for sections_a, sections_b in itertools.combinations(sections_bucket.values(), 2):
+                set_a = set()
+                set_b = set()
+
+                for sections in sections_a:
+                    set_a.update(sections.entries)
+
+                for sections in sections_b:
+                    set_b.update(sections.entries)
+
+                intersection = set_a.intersection(set_b)
+
+                # If the intersection is a non-empty set, it means sections are mapped to multiple
+                # targets. Raise exception.
+                if intersection:
+                    scheme = self.schemes[scheme_name]
+                    message = "Sections " + str(intersection) + " mapped to multiple targets."
+                    raise GenerationException(message, scheme)
+
+        return scheme_dictionary
+
+    def generate_rules(self, sections_infos):
+        placement_rules = collections.defaultdict(list)
+
+        scheme_dictionary = self._build_scheme_dictionary()
+
+        # Generate default rules
+        default_rules = list()
+        self._add_mapping_rules(None, None, None, GenerationModel.DEFAULT_SCHEME, scheme_dictionary, default_rules)
+
+        all_mapping_rules = collections.defaultdict(list)
+
+        # Generate rules based on mapping fragments
+        for mapping in self.mappings.values():
+            archive = mapping.archive
+            mapping_rules = all_mapping_rules[archive]
+            for (obj, symbol, scheme_name) in mapping.entries:
+                try:
+                    if not (obj == Mapping.MAPPING_ALL_OBJECTS and symbol is None and
+                            scheme_name == GenerationModel.DEFAULT_SCHEME):
+                        self._add_mapping_rules(archive, obj, symbol, scheme_name, scheme_dictionary, mapping_rules)
+                except KeyError:
+                    message = GenerationException.UNDEFINED_REFERENCE + " to scheme '" + scheme_name + "'."
+                    raise GenerationException(message, mapping)
+
+        # Detect rule conflicts
+        for mapping_rules in all_mapping_rules.items():
+            self._detect_conflicts(mapping_rules)
+
+        # Add exclusions
+        for mapping_rules in all_mapping_rules.values():
+            self._create_exclusions(mapping_rules, default_rules, sections_infos)
+
+        # Add the default rules grouped by target
+        for default_rule in default_rules:
+            existing_rules = placement_rules[default_rule.target]
+            if default_rule.get_section_names():
+                existing_rules.append(default_rule)
+
+        for mapping_rules in all_mapping_rules.values():
+            # Add the mapping rules grouped by target
+            for mapping_rule in mapping_rules:
+                existing_rules = placement_rules[mapping_rule.target]
+                if mapping_rule.get_section_names():
+                    existing_rules.append(mapping_rule)
+
+        return placement_rules
+
+    def _detect_conflicts(self, rules):
+        (archive, rules_list) = rules
+
+        for specificity in range(0, PlacementRule.OBJECT_SPECIFICITY + 1):
+            rules_with_specificity = filter(lambda r: r.specificity == specificity, rules_list)
+
+            for rule_a, rule_b in itertools.combinations(rules_with_specificity, 2):
+                intersections = rule_a.get_sections_intersection(rule_b)
+
+                if intersections and rule_a.maps_same_entities_as(rule_b):
+                    rules_string = str([str(rule_a), str(rule_b)])
+                    message = "Rules " + rules_string + " map sections " + str(list(intersections)) + " into multiple targets."
+                    raise GenerationException(message)
+
+    def _create_extra_rules(self, rules):
+        # This function generates extra rules for symbol specific rules. The reason for generating extra rules is to isolate,
+        # as much as possible, rules that require expansion. Particularly, object specific extra rules are generated.
+        rules_to_process = sorted(rules, key=lambda r: r.specificity)
+        symbol_specific_rules = list(filter(lambda r: r.specificity == PlacementRule.SYMBOL_SPECIFICITY, rules_to_process))
+
+        extra_rules = dict()
+
+        for symbol_specific_rule in symbol_specific_rules:
+            extra_rule_candidate = {s: None for s in symbol_specific_rule.get_section_names()}
+
+            super_rules = filter(lambda r: symbol_specific_rule.is_more_specific_rule_of(r), rules_to_process)
+
+            # Take a look at the existing rules that are more general than the current symbol-specific rule.
+            # Only generate an extra rule if there is no existing object specific rule for that section
+            for super_rule in super_rules:
+                intersections = symbol_specific_rule.get_sections_intersection(super_rule)
+                for intersection in intersections:
+                    if super_rule.specificity != PlacementRule.OBJECT_SPECIFICITY:
+                        extra_rule_candidate[intersection] = super_rule
+                    else:
+                        extra_rule_candidate[intersection] = None
+
+            # Generate the extra rules for the symbol specific rule section, keeping track of the generated extra rules
+            for (section, section_rule) in extra_rule_candidate.items():
+                if section_rule:
+                    extra_rule = None
+                    extra_rules_key = (symbol_specific_rule.archive, symbol_specific_rule.obj, section_rule.target)
+
+                    try:
+                        extra_rule = extra_rules[extra_rules_key]
+
+                        if section not in extra_rule.get_section_names():
+                            new_rule = PlacementRule(extra_rule.archive, extra_rule.obj, extra_rule.symbol,
+                                                     list(extra_rule.get_section_names()) + [section], extra_rule.target)
+                            extra_rules[extra_rules_key] = new_rule
+                    except KeyError:
+                        extra_rule = PlacementRule(symbol_specific_rule.archive, symbol_specific_rule.obj, None, [section], section_rule.target)
+                        extra_rules[extra_rules_key] = extra_rule
+
+        return extra_rules.values()
+
+    def _create_exclusions(self, mapping_rules, default_rules, sections_info):
+        rules = list(default_rules)
+        rules.extend(mapping_rules)
+
+        extra_rules = self._create_extra_rules(rules)
+
+        mapping_rules.extend(extra_rules)
+        rules.extend(extra_rules)
+
+        # Sort the rules by means of how specific they are. Sort by specificity from lowest to highest
+        # * -> lib:* -> lib:obj -> lib:obj:symbol
+        sorted_rules = sorted(rules, key=lambda r: r.specificity)
+
+        # Now that the rules have been sorted, loop through each rule, and then loop
+        # through rules below it (higher indeces), adding exclusions whenever appropriate.
+        for general_rule in sorted_rules:
+            for specific_rule in reversed(sorted_rules):
+                if (specific_rule.specificity > general_rule.specificity and
+                    specific_rule.specificity != PlacementRule.SYMBOL_SPECIFICITY) or \
+                    (specific_rule.specificity == PlacementRule.SYMBOL_SPECIFICITY and
+                     general_rule.specificity == PlacementRule.OBJECT_SPECIFICITY):
+                    general_rule.add_exclusion(specific_rule, sections_info)
+
+    def add_fragments_from_file(self, fragment_file):
+        for fragment in fragment_file.fragments:
+            dict_to_append_to = None
+
+            if isinstance(fragment, Mapping) and fragment.deprecated and fragment.name in self.mappings.keys():
+                self.mappings[fragment.name].entries |= fragment.entries
+            else:
+                if isinstance(fragment, Scheme):
+                    dict_to_append_to = self.schemes
+                elif isinstance(fragment, Sections):
+                    dict_to_append_to = self.sections
+                else:
+                    dict_to_append_to = self.mappings
+
+                # Raise exception when the fragment of the same type is already in the stored fragments
+                if fragment.name in dict_to_append_to.keys():
+                    stored = dict_to_append_to[fragment.name].path
+                    new = fragment.path
+                    message = "Duplicate definition of fragment '%s' found in %s and %s." % (fragment.name, stored, new)
+                    raise GenerationException(message)
+
+                dict_to_append_to[fragment.name] = fragment
+
+
+class TemplateModel:
+    """
+    Encapsulates a linker script template file. Finds marker syntax and handles replacement to generate the
+    final output.
+    """
+
+    Marker = collections.namedtuple("Marker", "target indent rules")
+
+    def __init__(self, template_file):
+        self.members = []
+        self.file = os.path.realpath(template_file.name)
+
+        self._generate_members(template_file)
+
+    def _generate_members(self, template_file):
+        lines = template_file.readlines()
+
+        target = Fragment.IDENTIFIER
+        reference = Suppress("mapping") + Suppress("[") + target.setResultsName("target") + Suppress("]")
+        pattern = White(" \t").setResultsName("indent") + reference
+
+        # Find the markers in the template file line by line. If line does not match marker grammar,
+        # set it as a literal to be copied as is to the output file.
+        for line in lines:
+            try:
+                parsed = pattern.parseString(line)
+
+                indent = parsed.indent
+                target = parsed.target
+
+                marker = TemplateModel.Marker(target, indent, [])
+
+                self.members.append(marker)
+            except ParseException:
+                # Does not match marker syntax
+                self.members.append(line)
+
+    def fill(self, mapping_rules):
+        for member in self.members:
+            target = None
+            try:
+                target = member.target
+                rules = member.rules
+
+                del rules[:]
+
+                rules.extend(mapping_rules[target])
+            except KeyError:
+                message = GenerationException.UNDEFINED_REFERENCE + " to target '" + target + "'."
+                raise GenerationException(message)
+            except AttributeError:
+                pass
+
+    def write(self, output_file):
+        # Add information that this is a generated file.
+        output_file.write("/* Automatically generated file; DO NOT EDIT */\n")
+        output_file.write("/* Espressif IoT Development Framework Linker Script */\n")
+        output_file.write("/* Generated from: %s */\n" % self.file)
+        output_file.write("\n")
+
+        # Do the text replacement
+        for member in self.members:
+            try:
+                indent = member.indent
+                rules = member.rules
+
+                for rule in rules:
+                    generated_line = "".join([indent, str(rule), '\n'])
+                    output_file.write(generated_line)
+            except AttributeError:
+                output_file.write(member)
+
+
+class GenerationException(LdGenFailure):
+    """
+    Exception for linker script generation failures such as undefined references/ failure to
+    evaluate conditions, duplicate mappings, etc.
+    """
+
+    UNDEFINED_REFERENCE = "Undefined reference"
+
+    def __init__(self, message, fragment=None):
+        self.fragment = fragment
+        self.message = message
+
+    def __str__(self):
+        if self.fragment:
+            return "%s\nIn fragment '%s' defined in '%s'." % (self.message, self.fragment.name, self.fragment.path)
+        else:
+            return self.message
+
+
+class SectionsInfo(dict):
+    """
+    Encapsulates an output of objdump. Contains information about the static library sections
+    and names
+    """
+
+    __info = collections.namedtuple("__info", "filename content")
+
+    def __init__(self):
+        self.sections = dict()
+
+    def add_sections_info(self, sections_info_dump):
+        first_line = sections_info_dump.readline()
+
+        archive_path = (Literal("In archive").suppress() +
+                        # trim the last character from archive_path, :
+                        Word(printables + " ").setResultsName("archive_path").setParseAction(lambda t: t[0][:-1]) +
+                        LineEnd())
+        parser = archive_path
+
+        results = None
+
+        try:
+            results = parser.parseString(first_line)
+        except ParseException as p:
+            raise ParseException("Parsing sections info for library " + sections_info_dump.name + " failed. " + p.message)
+
+        archive = os.path.basename(results.archive_path)
+        self.sections[archive] = SectionsInfo.__info(sections_info_dump.name, sections_info_dump.read())
+
+    def _get_infos_from_file(self, info):
+        # Object file line: '{object}:  file format elf32-xtensa-le'
+        object = Fragment.ENTITY.setResultsName("object") + Literal(":").suppress() + Literal("file format elf32-xtensa-le").suppress()
+
+        # Sections table
+        header = Suppress(Literal("Sections:") + Literal("Idx") + Literal("Name") + Literal("Size") + Literal("VMA") +
+                          Literal("LMA") + Literal("File off") + Literal("Algn"))
+        entry = Word(nums).suppress() + Fragment.ENTITY + Suppress(OneOrMore(Word(alphanums, exact=8)) +
+                                                                   Word(nums + "*") + ZeroOrMore(Word(alphas.upper()) +
+                                                                   Optional(Literal(","))))
+
+        # Content is object file line + sections table
+        content = Group(object + header + Group(ZeroOrMore(entry)).setResultsName("sections"))
+
+        parser = Group(ZeroOrMore(content)).setResultsName("contents")
+
+        sections_info_text = info.content
+        results = None
+
+        try:
+            results = parser.parseString(sections_info_text)
+        except ParseException as p:
+            raise ParseException("Unable to parse section info file " + info.filename + ". " + p.message)
+
+        return results
+
+    def get_obj_sections(self, archive, obj):
+        stored = self.sections[archive]
+
+        # Parse the contents of the sections file
+        if not isinstance(stored, dict):
+            parsed = self._get_infos_from_file(stored)
+            stored = dict()
+            for content in parsed.contents:
+                sections = list(map(lambda s: s, content.sections))
+                stored[content.object] = sections
+            self.sections[archive] = stored
+
+        for obj_key in stored.keys():
+            if obj_key == obj + ".o" or obj_key == obj + ".c.obj":
+                return stored[obj_key]
diff --git a/tools/ldgen/ldgen.py b/tools/ldgen/ldgen.py
new file mode 100755
index 00000000..0eabb3d2
--- /dev/null
+++ b/tools/ldgen/ldgen.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import argparse
+import json
+import sys
+import tempfile
+import subprocess
+import os
+import errno
+
+from fragments import FragmentFile
+from sdkconfig import SDKConfig
+from generation import GenerationModel, TemplateModel, SectionsInfo
+from ldgen_common import LdGenFailure
+from pyparsing import ParseException, ParseFatalException
+from io import StringIO
+
+
+def _update_environment(args):
+    env = [(name, value) for (name,value) in (e.split("=",1) for e in args.env)]
+    for name, value in env:
+        value = " ".join(value.split())
+        os.environ[name] = value
+
+    if args.env_file is not None:
+        env = json.load(args.env_file)
+        os.environ.update(env)
+
+
+def main():
+
+    argparser = argparse.ArgumentParser(description="ESP-IDF linker script generator")
+
+    argparser.add_argument(
+        "--input", "-i",
+        help="Linker template file",
+        type=argparse.FileType("r"))
+
+    argparser.add_argument(
+        "--fragments", "-f",
+        type=argparse.FileType("r"),
+        help="Input fragment files",
+        nargs="+")
+
+    argparser.add_argument(
+        "--libraries-file",
+        type=argparse.FileType("r"),
+        help="File that contains the list of libraries in the build")
+
+    argparser.add_argument(
+        "--output", "-o",
+        help="Output linker script",
+        type=str)
+
+    argparser.add_argument(
+        "--config", "-c",
+        help="Project configuration")
+
+    argparser.add_argument(
+        "--kconfig", "-k",
+        help="IDF Kconfig file")
+
+    argparser.add_argument(
+        "--env", "-e",
+        action='append', default=[],
+        help='Environment to set when evaluating the config file', metavar='NAME=VAL')
+
+    argparser.add_argument('--env-file', type=argparse.FileType('r'),
+                           help='Optional file to load environment variables from. Contents '
+                           'should be a JSON object where each key/value pair is a variable.')
+
+    argparser.add_argument(
+        "--objdump",
+        help="Path to toolchain objdump")
+
+    args = argparser.parse_args()
+
+    input_file = args.input
+    fragment_files = [] if not args.fragments else args.fragments
+    libraries_file = args.libraries_file
+    config_file = args.config
+    output_path = args.output
+    kconfig_file = args.kconfig
+    objdump = args.objdump
+
+    try:
+        sections_infos = SectionsInfo()
+        for library in libraries_file:
+            library = library.strip()
+            if library:
+                dump = StringIO(subprocess.check_output([objdump, "-h", library]).decode())
+                dump.name = library
+                sections_infos.add_sections_info(dump)
+
+        generation_model = GenerationModel()
+
+        _update_environment(args)  # assign args.env and args.env_file to os.environ
+
+        sdkconfig = SDKConfig(kconfig_file, config_file)
+
+        for fragment_file in fragment_files:
+            try:
+                fragment_file = FragmentFile(fragment_file, sdkconfig)
+            except (ParseException, ParseFatalException) as e:
+                # ParseException is raised on incorrect grammar
+                # ParseFatalException is raised on correct grammar, but inconsistent contents (ex. duplicate
+                # keys, key unsupported by fragment, unexpected number of values, etc.)
+                raise LdGenFailure("failed to parse %s\n%s" % (fragment_file.name, str(e)))
+            generation_model.add_fragments_from_file(fragment_file)
+
+        mapping_rules = generation_model.generate_rules(sections_infos)
+
+        script_model = TemplateModel(input_file)
+        script_model.fill(mapping_rules)
+
+        with tempfile.TemporaryFile("w+") as output:
+            script_model.write(output)
+            output.seek(0)
+
+            if not os.path.exists(os.path.dirname(output_path)):
+                try:
+                    os.makedirs(os.path.dirname(output_path))
+                except OSError as exc:
+                    if exc.errno != errno.EEXIST:
+                        raise
+
+            with open(output_path, "w") as f:  # only create output file after generation has suceeded
+                f.write(output.read())
+    except LdGenFailure as e:
+        print("linker script generation failed for %s\nERROR: %s" % (input_file.name, e))
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/tools/ldgen/ldgen_common.py b/tools/ldgen/ldgen_common.py
new file mode 100644
index 00000000..55a2a74b
--- /dev/null
+++ b/tools/ldgen/ldgen_common.py
@@ -0,0 +1,23 @@
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+class LdGenFailure(RuntimeError):
+    """
+    Parent class for any ldgen runtime failure which is due to input data
+    """
+    def __init__(self, message):
+        super(LdGenFailure, self).__init__(message)
diff --git a/tools/ldgen/samples/esp32.lf b/tools/ldgen/samples/esp32.lf
new file mode 100644
index 00000000..251eb34d
--- /dev/null
+++ b/tools/ldgen/samples/esp32.lf
@@ -0,0 +1,80 @@
+[sections:text]
+entries: 
+    .text+
+    .literal+
+    
+[sections:data]
+entries:
+    .data+
+
+[sections:bss]
+entries:
+    .bss+
+
+[sections:common]
+entries:
+    COMMON
+
+[sections:rodata]
+entries:
+    .rodata+
+
+[sections:rtc_text]
+entries:
+    .rtc.text+
+    .rtc.literal
+
+[sections:rtc_data]
+entries:
+    .rtc.data+
+
+[sections:rtc_rodata]
+entries:
+    .rtc.rodata+
+
+[sections:rtc_bss]
+entries:
+    .rtc.bss
+
+[sections:extram_bss]
+entries:
+    .ext_ram.bss+
+
+[sections:iram]
+entries:
+    .iram1+
+
+[sections:dram]
+entries:
+    .dram1+
+
+[scheme:default]
+entries:
+    text -> flash_text
+    rodata -> flash_rodata
+    data -> dram0_data
+    bss -> dram0_bss
+    common -> dram0_bss
+    iram -> iram0_text
+    dram -> dram0_data
+    rtc_text -> rtc_text
+    rtc_data -> rtc_data
+    rtc_rodata -> rtc_data
+    rtc_bss -> rtc_bss
+
+[scheme:rtc]
+entries:
+    text -> rtc_text
+    data -> rtc_data
+    rodata -> rtc_data
+    bss -> rtc_bss
+    common -> rtc_bss
+
+[scheme:noflash]
+entries:
+    text -> iram0_text
+    rodata -> dram0_data
+
+[scheme:noflash_data]
+entries:
+    rodata -> dram0_data
\ No newline at end of file
diff --git a/tools/ldgen/samples/mappings.lf b/tools/ldgen/samples/mappings.lf
new file mode 100644
index 00000000..7722cd68
--- /dev/null
+++ b/tools/ldgen/samples/mappings.lf
@@ -0,0 +1,62 @@
+
+[mapping:heap]
+archive: libheap.a
+entries:
+    multi_heap (noflash)
+    multi_heap_poisoning (noflash)
+
+[mapping:soc]
+archive: libsoc.a
+entries: 
+    * (noflash)
+
+[mapping:freertos]
+archive: libfreertos.a
+entries:
+    * (noflash)
+
+[mapping:esp32]
+archive: libesp32.a
+entries: 
+    core_dump (noflash)
+    panic (noflash)
+
+[mapping:app_trace]
+archive: libapp_trace.a
+entries: 
+    * (noflash)
+
+[mapping:xtensa_debug_module]
+archive: libxtensa-debug-module.a
+entries: 
+    eri (noflash)
+
+[mapping:phy]
+archive: libphy.a
+entries: 
+    * (noflash_data)
+
+[mapping:rtc]
+archive: librtc.a
+entries: 
+    * (noflash)
+
+[mapping:hal]
+archive: libhal.a
+entries: 
+    * (noflash)
+
+[mapping:gcc]
+archive: libgcc.a
+entries: 
+    lib2funcs (noflash)
+
+[mapping:spi_flash]
+archive: libspi_flash.a
+entries: 
+    spi_flash_rom_patch (noflash)
+
+[mapping:gcov]
+archive: libgcov.a
+entries: 
+    * (noflash)
\ No newline at end of file
diff --git a/tools/ldgen/samples/sdkconfig b/tools/ldgen/samples/sdkconfig
new file mode 100644
index 00000000..8fbfd615
--- /dev/null
+++ b/tools/ldgen/samples/sdkconfig
@@ -0,0 +1,542 @@
+#
+# SDK tool configuration
+#
+CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-"
+CONFIG_SDK_PYTHON="python"
+CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES=y
+
+#
+# Bootloader config
+#
+CONFIG_BOOTLOADER_LOG_LEVEL_NONE=
+CONFIG_BOOTLOADER_LOG_LEVEL_ERROR=
+CONFIG_BOOTLOADER_LOG_LEVEL_WARN=y
+CONFIG_BOOTLOADER_LOG_LEVEL_INFO=
+CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG=
+CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE=
+CONFIG_BOOTLOADER_LOG_LEVEL=2
+CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V=
+CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
+
+#
+# Security features
+#
+CONFIG_SECURE_BOOT_ENABLED=
+CONFIG_SECURE_FLASH_ENC_ENABLED=
+
+#
+# Serial flasher config
+#
+CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0"
+CONFIG_ESPTOOLPY_BAUD_115200B=y
+CONFIG_ESPTOOLPY_BAUD_230400B=
+CONFIG_ESPTOOLPY_BAUD_921600B=
+CONFIG_ESPTOOLPY_BAUD_2MB=
+CONFIG_ESPTOOLPY_BAUD_OTHER=
+CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
+CONFIG_ESPTOOLPY_BAUD=115200
+CONFIG_ESPTOOLPY_COMPRESSED=
+CONFIG_ESPTOOLPY_FLASHMODE_QIO=
+CONFIG_ESPTOOLPY_FLASHMODE_QOUT=
+CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
+CONFIG_ESPTOOLPY_FLASHMODE_DOUT=
+CONFIG_ESPTOOLPY_FLASHMODE="dio"
+CONFIG_ESPTOOLPY_FLASHFREQ_80M=
+CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
+CONFIG_ESPTOOLPY_FLASHFREQ_26M=
+CONFIG_ESPTOOLPY_FLASHFREQ_20M=
+CONFIG_ESPTOOLPY_FLASHFREQ="40m"
+CONFIG_ESPTOOLPY_FLASHSIZE_1MB=
+CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
+CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
+CONFIG_ESPTOOLPY_FLASHSIZE_8MB=
+CONFIG_ESPTOOLPY_FLASHSIZE_16MB=
+CONFIG_ESPTOOLPY_FLASHSIZE="2MB"
+CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
+CONFIG_ESPTOOLPY_BEFORE_RESET=y
+CONFIG_ESPTOOLPY_BEFORE_NORESET=
+CONFIG_ESPTOOLPY_BEFORE="default_reset"
+CONFIG_ESPTOOLPY_AFTER_RESET=y
+CONFIG_ESPTOOLPY_AFTER_NORESET=
+CONFIG_ESPTOOLPY_AFTER="hard_reset"
+CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B=
+CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B=
+CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y
+CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B=
+CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B=
+CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB=
+CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER=
+CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200
+CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
+
+#
+# Partition Table
+#
+CONFIG_PARTITION_TABLE_SINGLE_APP=y
+CONFIG_PARTITION_TABLE_TWO_OTA=
+CONFIG_PARTITION_TABLE_CUSTOM=
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
+CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000
+CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv"
+CONFIG_APP_OFFSET=0x10000
+CONFIG_PARTITION_TABLE_MD5=y
+
+#
+# Compiler options
+#
+CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
+CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=
+CONFIG_COMPILER_CXX_EXCEPTIONS=
+CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
+CONFIG_COMPILER_STACK_CHECK_MODE_NORM=
+CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=
+CONFIG_COMPILER_STACK_CHECK_MODE_ALL=
+CONFIG_COMPILER_STACK_CHECK=
+CONFIG_COMPILER_WARN_WRITE_STRINGS=
+
+#
+# Component config
+#
+
+#
+# Application Level Tracing
+#
+CONFIG_ESP32_APPTRACE_DEST_TRAX=
+CONFIG_ESP32_APPTRACE_DEST_NONE=y
+CONFIG_ESP32_APPTRACE_ENABLE=
+CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y
+
+#
+# FreeRTOS SystemView Tracing
+#
+CONFIG_AWS_IOT_SDK=
+
+#
+# Bluetooth
+#
+CONFIG_BT_ENABLED=
+CONFIG_BTDM_CTRL_PINNED_TO_CORE=0
+CONFIG_BT_RESERVE_DRAM=0
+
+#
+# ADC configuration
+#
+CONFIG_ADC_FORCE_XPD_FSM=
+CONFIG_ADC_DISABLE_DAC=y
+
+#
+# ESP32-specific
+#
+CONFIG_ESP32_DEFAULT_CPU_FREQ_80=
+CONFIG_ESP32_DEFAULT_CPU_FREQ_160=
+CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
+CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
+CONFIG_ESP32_SPIRAM_SUPPORT=
+CONFIG_ESP32_MEMMAP_TRACEMEM=
+CONFIG_ESP32_MEMMAP_TRACEMEM_TWOBANKS=
+CONFIG_ESP32_TRAX=
+CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0
+CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=
+CONFIG_ESP32_ENABLE_COREDUMP_TO_UART=
+CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y
+CONFIG_ESP32_ENABLE_COREDUMP=
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO=
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4
+CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2048
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=4096
+CONFIG_ESP_IPC_TASK_STACK_SIZE=1024
+CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
+CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
+CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF=
+CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR=
+CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF=
+CONFIG_NEWLIB_STDIN_LINE_ENDING_LF=
+CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
+CONFIG_NEWLIB_NANO_FORMAT=
+CONFIG_ESP_CONSOLE_UART_DEFAULT=y
+CONFIG_ESP_CONSOLE_UART_CUSTOM=
+CONFIG_ESP_CONSOLE_UART_NONE=
+CONFIG_ESP_CONSOLE_UART_NUM=0
+CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200
+CONFIG_ESP32_ULP_COPROC_ENABLED=
+CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0
+CONFIG_ESP32_PANIC_PRINT_HALT=
+CONFIG_ESP32_PANIC_PRINT_REBOOT=y
+CONFIG_ESP32_PANIC_SILENT_REBOOT=
+CONFIG_ESP32_PANIC_GDBSTUB=
+CONFIG_ESP32_DEBUG_OCDAWARE=y
+CONFIG_ESP_INT_WDT=y
+CONFIG_ESP_INT_WDT_TIMEOUT_MS=300
+CONFIG_ESP_TASK_WDT=y
+CONFIG_ESP_TASK_WDT_PANIC=
+CONFIG_ESP_TASK_WDT_TIMEOUT_S=5
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_ESP32_BROWNOUT_DET=y
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1=
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2=
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3=
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4=
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5=
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6=
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7=
+CONFIG_ESP32_BROWNOUT_DET_LVL=0
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC=
+CONFIG_ESP32_TIME_SYSCALL_USE_FRC1=
+CONFIG_ESP32_TIME_SYSCALL_USE_NONE=
+CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y
+CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS=
+CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024
+CONFIG_ESP32_RTC_XTAL_BOOTSTRAP_CYCLES=100
+CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000
+CONFIG_ESP32_XTAL_FREQ_40=y
+CONFIG_ESP32_XTAL_FREQ_26=
+CONFIG_ESP32_XTAL_FREQ_AUTO=
+CONFIG_ESP32_XTAL_FREQ=40
+CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE=
+CONFIG_ESP32_NO_BLOBS=
+CONFIG_ESP_TIMER_PROFILING=
+CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS=
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
+
+#
+# Wi-Fi
+#
+CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
+CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
+CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
+CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
+CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP32_WIFI_TX_BA_WIN=6
+CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP32_WIFI_RX_BA_WIN=6
+CONFIG_ESP32_WIFI_NVS_ENABLED=y
+
+#
+# PHY
+#
+CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
+CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION=
+CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
+CONFIG_ESP32_PHY_MAX_TX_POWER=20
+
+#
+# Power Management
+#
+CONFIG_PM_ENABLE=
+
+#
+# ADC-Calibration
+#
+CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y
+CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y
+CONFIG_ADC_CAL_LUT_ENABLE=y
+
+#
+# Ethernet
+#
+CONFIG_ETH_DMA_RX_BUF_NUM=10
+CONFIG_ETH_DMA_TX_BUF_NUM=10
+CONFIG_ETH_EMAC_L2_TO_L3_RX_BUF_MODE=
+CONFIG_ETH_EMAC_TASK_PRIORITY=20
+
+#
+# FAT Filesystem support
+#
+CONFIG_FATFS_CODEPAGE_DYNAMIC=
+CONFIG_FATFS_CODEPAGE_437=y
+CONFIG_FATFS_CODEPAGE_720=
+CONFIG_FATFS_CODEPAGE_737=
+CONFIG_FATFS_CODEPAGE_771=
+CONFIG_FATFS_CODEPAGE_775=
+CONFIG_FATFS_CODEPAGE_850=
+CONFIG_FATFS_CODEPAGE_852=
+CONFIG_FATFS_CODEPAGE_855=
+CONFIG_FATFS_CODEPAGE_857=
+CONFIG_FATFS_CODEPAGE_860=
+CONFIG_FATFS_CODEPAGE_861=
+CONFIG_FATFS_CODEPAGE_862=
+CONFIG_FATFS_CODEPAGE_863=
+CONFIG_FATFS_CODEPAGE_864=
+CONFIG_FATFS_CODEPAGE_865=
+CONFIG_FATFS_CODEPAGE_866=
+CONFIG_FATFS_CODEPAGE_869=
+CONFIG_FATFS_CODEPAGE_932=
+CONFIG_FATFS_CODEPAGE_936=
+CONFIG_FATFS_CODEPAGE_949=
+CONFIG_FATFS_CODEPAGE_950=
+CONFIG_FATFS_CODEPAGE=437
+CONFIG_FATFS_LFN_NONE=y
+CONFIG_FATFS_LFN_HEAP=
+CONFIG_FATFS_LFN_STACK=
+CONFIG_FATFS_FS_LOCK=0
+CONFIG_FATFS_TIMEOUT_MS=10000
+CONFIG_FATFS_PER_FILE_CACHE=y
+
+#
+# FreeRTOS
+#
+CONFIG_FREERTOS_UNICORE=y
+CONFIG_FREERTOS_CORETIMER_0=y
+CONFIG_FREERTOS_CORETIMER_1=
+CONFIG_FREERTOS_HZ=1000
+CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE=
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL=y
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=
+CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=
+CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
+CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
+CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE=
+CONFIG_FREERTOS_ASSERT_DISABLE=
+CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024
+CONFIG_FREERTOS_ISR_STACKSIZE=1536
+CONFIG_FREERTOS_LEGACY_HOOKS=
+CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
+CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=
+CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1
+CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10
+CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0
+CONFIG_FREERTOS_USE_TRACE_FACILITY=
+CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=
+CONFIG_FREERTOS_DEBUG_INTERNALS=
+
+#
+# Heap memory debugging
+#
+CONFIG_HEAP_POISONING_DISABLED=y
+CONFIG_HEAP_POISONING_LIGHT=
+CONFIG_HEAP_POISONING_COMPREHENSIVE=
+CONFIG_HEAP_TRACING=
+
+#
+# libsodium
+#
+CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y
+
+#
+# Log output
+#
+CONFIG_LOG_DEFAULT_LEVEL_NONE=
+CONFIG_LOG_DEFAULT_LEVEL_ERROR=
+CONFIG_LOG_DEFAULT_LEVEL_WARN=
+CONFIG_LOG_DEFAULT_LEVEL_INFO=y
+CONFIG_LOG_DEFAULT_LEVEL_DEBUG=
+CONFIG_LOG_DEFAULT_LEVEL_VERBOSE=
+CONFIG_LOG_DEFAULT_LEVEL=3
+CONFIG_LOG_COLORS=y
+
+#
+# LWIP
+#
+CONFIG_LWIP_L2_TO_L3_COPY=
+CONFIG_LWIP_IRAM_OPTIMIZATION=
+CONFIG_LWIP_MAX_SOCKETS=4
+CONFIG_LWIP_SO_REUSE=
+CONFIG_LWIP_SO_RCVBUF=
+CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
+CONFIG_LWIP_IP_FRAG=
+CONFIG_LWIP_IP_REASSEMBLY=
+CONFIG_LWIP_STATS=
+CONFIG_LWIP_ETHARP_TRUST_IP_MAC=y
+CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
+CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
+
+#
+# DHCP server
+#
+CONFIG_LWIP_DHCPS_LEASE_UNIT=60
+CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
+CONFIG_LWIP_AUTOIP=
+CONFIG_LWIP_NETIF_LOOPBACK=y
+CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
+
+#
+# TCP
+#
+CONFIG_LWIP_MAX_ACTIVE_TCP=16
+CONFIG_LWIP_MAX_LISTENING_TCP=16
+CONFIG_LWIP_TCP_MAXRTX=12
+CONFIG_LWIP_TCP_SYNMAXRTX=6
+CONFIG_LWIP_TCP_MSS=1436
+CONFIG_LWIP_TCP_MSL=60000
+CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744
+CONFIG_LWIP_TCP_WND_DEFAULT=5744
+CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
+CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
+CONFIG_LWIP_TCP_OVERSIZE_MSS=y
+CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS=
+CONFIG_LWIP_TCP_OVERSIZE_DISABLE=
+
+#
+# UDP
+#
+CONFIG_LWIP_MAX_UDP_PCBS=16
+CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
+CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=2048
+CONFIG_LWIP_PPP_SUPPORT=
+
+#
+# ICMP
+#
+CONFIG_LWIP_MULTICAST_PING=
+CONFIG_LWIP_BROADCAST_PING=
+
+#
+# LWIP RAW API
+#
+CONFIG_LWIP_MAX_RAW_PCBS=16
+
+#
+# mbedTLS
+#
+CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384
+CONFIG_MBEDTLS_DEBUG=
+CONFIG_MBEDTLS_HARDWARE_AES=y
+CONFIG_MBEDTLS_HARDWARE_MPI=y
+CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y
+CONFIG_MBEDTLS_HARDWARE_SHA=
+CONFIG_MBEDTLS_HAVE_TIME=y
+CONFIG_MBEDTLS_HAVE_TIME_DATE=
+CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
+CONFIG_MBEDTLS_TLS_SERVER_ONLY=
+CONFIG_MBEDTLS_TLS_CLIENT_ONLY=
+CONFIG_MBEDTLS_TLS_DISABLED=
+CONFIG_MBEDTLS_TLS_SERVER=y
+CONFIG_MBEDTLS_TLS_CLIENT=y
+CONFIG_MBEDTLS_TLS_ENABLED=y
+
+#
+# TLS Key Exchange Methods
+#
+CONFIG_MBEDTLS_PSK_MODES=
+CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
+CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
+CONFIG_MBEDTLS_SSL_PROTO_SSL3=
+CONFIG_MBEDTLS_SSL_PROTO_TLS1=y
+CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y
+CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
+CONFIG_MBEDTLS_SSL_PROTO_DTLS=
+CONFIG_MBEDTLS_SSL_ALPN=y
+CONFIG_MBEDTLS_SSL_SESSION_TICKETS=y
+
+#
+# Symmetric Ciphers
+#
+CONFIG_MBEDTLS_AES_C=y
+CONFIG_MBEDTLS_CAMELLIA_C=
+CONFIG_MBEDTLS_DES_C=
+CONFIG_MBEDTLS_RC4_DISABLED=y
+CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT=
+CONFIG_MBEDTLS_RC4_ENABLED=
+CONFIG_MBEDTLS_BLOWFISH_C=
+CONFIG_MBEDTLS_XTEA_C=
+CONFIG_MBEDTLS_CCM_C=y
+CONFIG_MBEDTLS_GCM_C=y
+CONFIG_MBEDTLS_RIPEMD160_C=
+
+#
+# Certificates
+#
+CONFIG_MBEDTLS_PEM_PARSE_C=y
+CONFIG_MBEDTLS_PEM_WRITE_C=y
+CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
+CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
+CONFIG_MBEDTLS_ECP_C=y
+CONFIG_MBEDTLS_ECDH_C=y
+CONFIG_MBEDTLS_ECDSA_C=y
+CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
+CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
+
+#
+# OpenSSL
+#
+CONFIG_OPENSSL_DEBUG=
+CONFIG_OPENSSL_ASSERT_DO_NOTHING=y
+CONFIG_OPENSSL_ASSERT_EXIT=
+
+#
+# PThreads
+#
+CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+
+#
+# SPI Flash driver
+#
+CONFIG_SPI_FLASH_VERIFY_WRITE=
+CONFIG_SPI_FLASH_ENABLE_COUNTERS=
+CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
+CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
+CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS=
+CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED=
+
+#
+# SPIFFS Configuration
+#
+CONFIG_SPIFFS_MAX_PARTITIONS=3
+
+#
+# SPIFFS Cache Configuration
+#
+CONFIG_SPIFFS_CACHE=y
+CONFIG_SPIFFS_CACHE_WR=y
+CONFIG_SPIFFS_CACHE_STATS=
+CONFIG_SPIFFS_PAGE_CHECK=y
+CONFIG_SPIFFS_GC_MAX_RUNS=10
+CONFIG_SPIFFS_GC_STATS=
+CONFIG_SPIFFS_PAGE_SIZE=256
+CONFIG_SPIFFS_OBJ_NAME_LEN=32
+CONFIG_SPIFFS_USE_MAGIC=y
+CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
+CONFIG_SPIFFS_META_LENGTH=4
+CONFIG_SPIFFS_USE_MTIME=y
+
+#
+# Debug Configuration
+#
+CONFIG_SPIFFS_DBG=
+CONFIG_SPIFFS_API_DBG=
+CONFIG_SPIFFS_GC_DBG=
+CONFIG_SPIFFS_CACHE_DBG=
+CONFIG_SPIFFS_CHECK_DBG=
+CONFIG_SPIFFS_TEST_VISUALISATION=
+
+#
+# tcpip adapter
+#
+CONFIG_NETIF_IP_LOST_TIMER_INTERVAL=120
+
+#
+# Wear Levelling
+#
+CONFIG_WL_SECTOR_SIZE_512=
+CONFIG_WL_SECTOR_SIZE_4096=y
+CONFIG_WL_SECTOR_SIZE=4096
diff --git a/tools/ldgen/samples/sections.info b/tools/ldgen/samples/sections.info
new file mode 100644
index 00000000..db450cfb
--- /dev/null
+++ b/tools/ldgen/samples/sections.info
@@ -0,0 +1,1626 @@
+In archive libfreertos.a:
+
+FreeRTOS-openocd.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .text         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  2 .bss          00000000  00000000  00000000  00000034  2**0
+                  ALLOC
+  3 .dram1        00000004  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+  4 .debug_info   0000008f  00000000  00000000  00000038  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  5 .debug_abbrev 0000003e  00000000  00000000  000000c7  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  6 .debug_aranges 00000018  00000000  00000000  00000105  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_line   0000005e  00000000  00000000  0000011d  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_str    0000018d  00000000  00000000  0000017b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  9 .comment      0000003b  00000000  00000000  00000308  2**0
+                  CONTENTS, READONLY
+ 10 .xtensa.info  00000038  00000000  00000000  00000343  2**0
+                  CONTENTS, READONLY
+ 11 .xt.prop      0000000c  00000000  00000000  0000037b  2**0
+                  CONTENTS, RELOC, READONLY
+
+croutine.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvCheckPendingReadyList 00000018  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvCheckDelayedList 0000002c  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xCoRoutineCreate 0000001c  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.vCoRoutineAddToDelayedList 00000020  00000000  00000000  00000094  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.vCoRoutineSchedule 00000014  00000000  00000000  000000b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xCoRoutineRemoveFromEventList 00000010  00000000  00000000  000000c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .text         00000000  00000000  00000000  000000d8  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  7 .data         00000000  00000000  00000000  000000d8  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  8 .bss          00000000  00000000  00000000  000000d8  2**0
+                  ALLOC
+  9 .text.prvCheckPendingReadyList 00000056  00000000  00000000  000000d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .text.prvCheckDelayedList 000000ac  00000000  00000000  00000130  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .rodata.str1.4 00000074  00000000  00000000  000001dc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 12 .text.xCoRoutineCreate 00000028  00000000  00000000  00000250  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .text.vCoRoutineAddToDelayedList 00000056  00000000  00000000  00000278  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .text.vCoRoutineSchedule 0000007a  00000000  00000000  000002d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .text.xCoRoutineRemoveFromEventList 00000031  00000000  00000000  0000034c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .rodata.__FUNCTION__$5025 00000011  00000000  00000000  00000380  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 17 .bss.xPassedTicks 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 18 .bss.xLastTickCount 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 19 .bss.xCoRoutineTickCount 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 20 .bss.uxTopCoRoutineReadyPriority 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 21 .bss.pxCurrentCoRoutine 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 22 .bss.xPendingReadyCoRoutineList 00000014  00000000  00000000  00000394  2**2
+                  ALLOC
+ 23 .bss.pxOverflowDelayedCoRoutineList 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 24 .bss.pxDelayedCoRoutineList 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 25 .bss.pxReadyCoRoutineLists 00000028  00000000  00000000  00000394  2**2
+                  ALLOC
+ 26 .debug_frame  000000a0  00000000  00000000  00000394  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 27 .debug_info   000006b8  00000000  00000000  00000434  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 28 .debug_abbrev 00000233  00000000  00000000  00000aec  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 29 .debug_loc    0000013b  00000000  00000000  00000d1f  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 30 .debug_aranges 00000048  00000000  00000000  00000e5a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 31 .debug_ranges 00000038  00000000  00000000  00000ea2  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 32 .debug_line   0000037e  00000000  00000000  00000eda  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 33 .debug_str    00000533  00000000  00000000  00001258  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 34 .comment      0000003b  00000000  00000000  0000178b  2**0
+                  CONTENTS, READONLY
+ 35 .xtensa.info  00000038  00000000  00000000  000017c6  2**0
+                  CONTENTS, READONLY
+ 36 .xt.lit       00000030  00000000  00000000  000017fe  2**0
+                  CONTENTS, RELOC, READONLY
+ 37 .xt.prop      00000270  00000000  00000000  0000182e  2**0
+                  CONTENTS, RELOC, READONLY
+
+event_groups.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.xEventGroupCreate 0000000c  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xEventGroupWaitBits 0000006c  00000000  00000000  00000040  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xEventGroupClearBits 00000028  00000000  00000000  000000ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.xEventGroupGetBitsFromISR 00000004  00000000  00000000  000000d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.xEventGroupSetBits 0000003c  00000000  00000000  000000d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xEventGroupSync 0000005c  00000000  00000000  00000114  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.vEventGroupDelete 00000030  00000000  00000000  00000170  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.vEventGroupSetBitsCallback 00000004  00000000  00000000  000001a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.vEventGroupClearBitsCallback 00000004  00000000  00000000  000001a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .text         00000000  00000000  00000000  000001a8  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 10 .data         00000000  00000000  00000000  000001a8  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 11 .bss          00000000  00000000  00000000  000001a8  2**0
+                  ALLOC
+ 12 .text.prvTestWaitCondition 0000001e  00000000  00000000  000001a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .text.xEventGroupCreate 00000027  00000000  00000000  000001c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .rodata.str1.4 00000058  00000000  00000000  000001f0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 15 .text.xEventGroupWaitBits 00000140  00000000  00000000  00000248  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .text.xEventGroupClearBits 00000060  00000000  00000000  00000388  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .text.xEventGroupGetBitsFromISR 00000010  00000000  00000000  000003e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .text.xEventGroupSetBits 000000c3  00000000  00000000  000003f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .text.xEventGroupSync 00000108  00000000  00000000  000004bc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .text.vEventGroupDelete 0000005d  00000000  00000000  000005c4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .text.vEventGroupSetBitsCallback 0000000f  00000000  00000000  00000624  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .text.vEventGroupClearBitsCallback 0000000f  00000000  00000000  00000634  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .rodata.__FUNCTION__$5129 00000012  00000000  00000000  00000644  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 24 .rodata.__FUNCTION__$5120 00000013  00000000  00000000  00000658  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 25 .rodata.__FUNCTION__$5100 00000015  00000000  00000000  0000066c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 26 .rodata.__FUNCTION__$5092 00000014  00000000  00000000  00000684  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 27 .rodata.__FUNCTION__$5078 00000010  00000000  00000000  00000698  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 28 .debug_frame  00000100  00000000  00000000  000006a8  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 29 .debug_info   00000e02  00000000  00000000  000007a8  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 30 .debug_abbrev 00000236  00000000  00000000  000015aa  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 31 .debug_loc    00000546  00000000  00000000  000017e0  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 32 .debug_aranges 00000068  00000000  00000000  00001d26  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 33 .debug_ranges 00000070  00000000  00000000  00001d8e  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 34 .debug_line   000006af  00000000  00000000  00001dfe  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 35 .debug_str    00000677  00000000  00000000  000024ad  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 36 .comment      0000003b  00000000  00000000  00002b24  2**0
+                  CONTENTS, READONLY
+ 37 .xtensa.info  00000038  00000000  00000000  00002b5f  2**0
+                  CONTENTS, READONLY
+ 38 .xt.lit       00000048  00000000  00000000  00002b97  2**0
+                  CONTENTS, RELOC, READONLY
+ 39 .xt.prop      00000468  00000000  00000000  00002bdf  2**0
+                  CONTENTS, RELOC, READONLY
+
+list.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .text         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  2 .bss          00000000  00000000  00000000  00000034  2**0
+                  ALLOC
+  3 .text.vListInitialise 00000015  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  4 .text.vListInitialiseItem 00000009  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  5 .text.vListInsertEnd 0000001b  00000000  00000000  00000058  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  6 .text.vListInsert 0000002f  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .text.uxListRemove 00000026  00000000  00000000  000000a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .debug_frame  00000088  00000000  00000000  000000cc  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .debug_info   000002a1  00000000  00000000  00000154  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 10 .debug_abbrev 000000dc  00000000  00000000  000003f5  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 11 .debug_loc    00000081  00000000  00000000  000004d1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_aranges 00000040  00000000  00000000  00000552  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 13 .debug_ranges 00000030  00000000  00000000  00000592  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_line   0000024c  00000000  00000000  000005c2  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 15 .debug_str    000002c2  00000000  00000000  0000080e  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 16 .comment      0000003b  00000000  00000000  00000ad0  2**0
+                  CONTENTS, READONLY
+ 17 .xtensa.info  00000038  00000000  00000000  00000b0b  2**0
+                  CONTENTS, READONLY
+ 18 .xt.prop      000000f0  00000000  00000000  00000b43  2**0
+                  CONTENTS, RELOC, READONLY
+
+port.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.pxPortInitialiseStack 00000018  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xPortStartScheduler 00000014  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xPortSysTickHandler 00000008  00000000  00000000  00000060  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.vPortYieldOtherCore 00000004  00000000  00000000  00000068  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.vPortReleaseTaskMPUSettings 00000004  00000000  00000000  0000006c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xPortInIsrContext 00000008  00000000  00000000  00000070  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .iram1.literal 00000004  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.vPortAssertIfInISR 00000018  00000000  00000000  0000007c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.vPortCPUInitializeMutex 00000004  00000000  00000000  00000094  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  9 .literal.vPortCPUAcquireMutex 00000030  00000000  00000000  00000098  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.vPortCPUAcquireMutexTimeout 00000030  00000000  00000000  000000c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.vPortCPUReleaseMutex 00000028  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.vPortSetStackWatchpoint 00000008  00000000  00000000  00000120  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .text         00000000  00000000  00000000  00000128  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 14 .data         00000000  00000000  00000000  00000128  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 15 .bss          00000000  00000000  00000000  00000128  2**0
+                  ALLOC
+ 16 .text.pxPortInitialiseStack 00000086  00000000  00000000  00000128  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .text.vPortEndScheduler 00000005  00000000  00000000  000001b0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 18 .text.xPortStartScheduler 0000002e  00000000  00000000  000001b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .text.xPortSysTickHandler 00000016  00000000  00000000  000001e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .text.vPortYieldOtherCore 0000000e  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .text.vPortStoreTaskMPUSettings 00000013  00000000  00000000  00000210  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 22 .text.vPortReleaseTaskMPUSettings 0000000e  00000000  00000000  00000224  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .text.xPortInIsrContext 00000026  00000000  00000000  00000234  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .iram1        0000001a  00000000  00000000  0000025c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .rodata.str1.4 0000013b  00000000  00000000  00000278  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 26 .text.vPortAssertIfInISR 00000025  00000000  00000000  000003b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .text.vPortCPUInitializeMutex 0000000e  00000000  00000000  000003dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .text.vPortCPUAcquireMutex 00000088  00000000  00000000  000003ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .text.vPortCPUAcquireMutexTimeout 000000ab  00000000  00000000  00000474  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .text.vPortCPUReleaseMutex 00000061  00000000  00000000  00000520  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .text.vPortSetStackWatchpoint 0000001a  00000000  00000000  00000584  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .text.xPortGetTickRateHz 00000008  00000000  00000000  000005a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 33 .rodata.__func__$5264 00000029  00000000  00000000  000005a8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 34 .rodata.__func__$5259 00000029  00000000  00000000  000005d4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 35 .rodata.__FUNCTION__$5243 00000013  00000000  00000000  00000600  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 36 .bss.port_interruptNesting 00000008  00000000  00000000  00000614  2**2
+                  ALLOC
+ 37 .bss.port_xSchedulerRunning 00000008  00000000  00000000  00000614  2**2
+                  ALLOC
+ 38 .debug_frame  00000190  00000000  00000000  00000614  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 39 .debug_info   00000e78  00000000  00000000  000007a4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 40 .debug_abbrev 00000404  00000000  00000000  0000161c  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 41 .debug_loc    000005f1  00000000  00000000  00001a20  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 42 .debug_aranges 00000098  00000000  00000000  00002011  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 43 .debug_ranges 000000a0  00000000  00000000  000020a9  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 44 .debug_line   000005fb  00000000  00000000  00002149  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 45 .debug_str    0000071f  00000000  00000000  00002744  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 46 .comment      0000003b  00000000  00000000  00002e63  2**0
+                  CONTENTS, READONLY
+ 47 .xtensa.info  00000038  00000000  00000000  00002e9e  2**0
+                  CONTENTS, READONLY
+ 48 .xt.lit       00000068  00000000  00000000  00002ed6  2**0
+                  CONTENTS, RELOC, READONLY
+ 49 .xt.prop      00000408  00000000  00000000  00002f3e  2**0
+                  CONTENTS, RELOC, READONLY
+
+portasm.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal      00000074  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .text         000001e0  00000000  00000000  000000a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .data         00000c0c  00000000  00000000  00000290  2**4
+                  CONTENTS, ALLOC, LOAD, DATA
+  3 .bss          00000000  00000000  00000000  00000e9c  2**0
+                  ALLOC
+  4 .xtensa.info  00000038  00000000  00000000  00000e9c  2**0
+                  CONTENTS, READONLY
+  5 .debug_line   00000432  00000000  00000000  00000ed4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  6 .debug_info   00000093  00000000  00000000  00001306  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_abbrev 00000014  00000000  00000000  00001399  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_aranges 00000020  00000000  00000000  000013b0  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .xt.lit       00000008  00000000  00000000  000013d0  2**0
+                  CONTENTS, RELOC, READONLY
+ 10 .xt.prop      00000168  00000000  00000000  000013d8  2**0
+                  CONTENTS, RELOC, READONLY
+
+queue.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvIsQueueFull 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvCopyDataToQueue 0000000c  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.prvNotifyQueueSetContainer 0000002c  00000000  00000000  00000048  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.prvCopyDataFromQueue 00000004  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.xQueueGenericReset 00000030  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.prvInitialiseNewQueue 00000004  00000000  00000000  000000a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.xQueueGenericCreate 0000001c  00000000  00000000  000000ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.xQueueGetMutexHolder 00000008  00000000  00000000  000000c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.xQueueCreateCountingSemaphore 00000028  00000000  00000000  000000d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.xQueueGenericSend 0000007c  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.prvInitialiseMutex 00000008  00000000  00000000  00000174  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.xQueueCreateMutex 00000008  00000000  00000000  0000017c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.xQueueGiveMutexRecursive 0000001c  00000000  00000000  00000184  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xQueueGenericSendFromISR 0000003c  00000000  00000000  000001a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.xQueueGiveFromISR 00000030  00000000  00000000  000001dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.xQueueGenericReceive 00000078  00000000  00000000  0000020c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.xQueueTakeMutexRecursive 0000001c  00000000  00000000  00000284  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.xQueueReceiveFromISR 00000030  00000000  00000000  000002a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xQueuePeekFromISR 00000034  00000000  00000000  000002d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .literal.uxQueueMessagesWaiting 0000001c  00000000  00000000  00000304  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .literal.uxQueueSpacesAvailable 0000001c  00000000  00000000  00000320  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .literal.uxQueueMessagesWaitingFromISR 0000001c  00000000  00000000  0000033c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .literal.vQueueDelete 00000018  00000000  00000000  00000358  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .literal.xQueueIsQueueEmptyFromISR 0000001c  00000000  00000000  00000370  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .literal.xQueueIsQueueFullFromISR 0000001c  00000000  00000000  0000038c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .literal.vQueueWaitForMessageRestricted 0000000c  00000000  00000000  000003a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .literal.xQueueCreateSet 00000004  00000000  00000000  000003b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .literal.xQueueSelectFromSet 00000004  00000000  00000000  000003b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .literal.xQueueSelectFromSetFromISR 00000004  00000000  00000000  000003bc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .text         00000000  00000000  00000000  000003c0  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 30 .data         00000000  00000000  00000000  000003c0  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 31 .bss          00000000  00000000  00000000  000003c0  2**0
+                  ALLOC
+ 32 .text.prvIsQueueEmpty 00000012  00000000  00000000  000003c0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .text.prvIsQueueFull 0000002a  00000000  00000000  000003d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .text.prvCopyDataToQueue 0000009e  00000000  00000000  00000400  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 35 .rodata.str1.4 00000050  00000000  00000000  000004a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 36 .text.prvNotifyQueueSetContainer 00000076  00000000  00000000  000004f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .text.prvCopyDataFromQueue 00000024  00000000  00000000  00000568  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .text.xQueueGenericReset 00000096  00000000  00000000  0000058c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .text.prvInitialiseNewQueue 00000023  00000000  00000000  00000624  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 40 .text.xQueueGenericCreate 0000004d  00000000  00000000  00000648  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .text.xQueueGetMutexHolder 00000023  00000000  00000000  00000698  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 42 .text.xQueueCreateCountingSemaphore 0000006a  00000000  00000000  000006bc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .text.xQueueGenericSend 0000018c  00000000  00000000  00000728  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .text.prvInitialiseMutex 00000026  00000000  00000000  000008b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .text.xQueueCreateMutex 0000001a  00000000  00000000  000008dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 46 .text.xQueueGiveMutexRecursive 0000004c  00000000  00000000  000008f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 47 .text.xQueueGenericSendFromISR 000000e6  00000000  00000000  00000944  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 48 .text.xQueueGiveFromISR 000000c2  00000000  00000000  00000a2c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 49 .text.xQueueGenericReceive 00000178  00000000  00000000  00000af0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 50 .text.xQueueTakeMutexRecursive 00000051  00000000  00000000  00000c68  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 51 .text.xQueueReceiveFromISR 000000a6  00000000  00000000  00000cbc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 52 .text.xQueuePeekFromISR 00000098  00000000  00000000  00000d64  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 53 .text.uxQueueMessagesWaiting 00000038  00000000  00000000  00000dfc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 54 .text.uxQueueSpacesAvailable 0000003e  00000000  00000000  00000e34  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 55 .text.uxQueueMessagesWaitingFromISR 00000038  00000000  00000000  00000e74  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 56 .text.vQueueDelete 00000028  00000000  00000000  00000eac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 57 .text.xQueueIsQueueEmptyFromISR 00000042  00000000  00000000  00000ed4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 58 .text.xQueueIsQueueFullFromISR 00000044  00000000  00000000  00000f18  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 59 .text.vQueueWaitForMessageRestricted 0000002a  00000000  00000000  00000f5c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 60 .text.xQueueCreateSet 00000014  00000000  00000000  00000f88  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 61 .text.xQueueAddToSet 0000001e  00000000  00000000  00000f9c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 62 .text.xQueueRemoveFromSet 00000020  00000000  00000000  00000fbc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 63 .text.xQueueSelectFromSet 00000018  00000000  00000000  00000fdc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 64 .text.xQueueSelectFromSetFromISR 00000015  00000000  00000000  00000ff4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 65 .rodata.__FUNCTION__$5459 00000019  00000000  00000000  0000100c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 66 .rodata.__FUNCTION__$5449 0000001a  00000000  00000000  00001028  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 67 .rodata.__FUNCTION__$5429 0000000d  00000000  00000000  00001044  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 68 .rodata.__FUNCTION__$5424 0000001e  00000000  00000000  00001054  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 69 .rodata.__FUNCTION__$5418 00000017  00000000  00000000  00001074  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 70 .rodata.__FUNCTION__$5412 00000017  00000000  00000000  0000108c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 71 .rodata.__FUNCTION__$5406 00000012  00000000  00000000  000010a4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 72 .rodata.__FUNCTION__$5397 00000015  00000000  00000000  000010b8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 73 .rodata.__FUNCTION__$5387 00000015  00000000  00000000  000010d0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 74 .rodata.__FUNCTION__$5376 00000012  00000000  00000000  000010e8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 75 .rodata.__FUNCTION__$5368 00000019  00000000  00000000  000010fc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 76 .rodata.__FUNCTION__$5495 0000001b  00000000  00000000  00001118  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 77 .rodata.__FUNCTION__$5357 00000012  00000000  00000000  00001134  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 78 .rodata.__FUNCTION__$5346 0000001e  00000000  00000000  00001148  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 79 .rodata.__FUNCTION__$5340 00000019  00000000  00000000  00001168  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 80 .rodata.__FUNCTION__$5333 00000019  00000000  00000000  00001184  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 81 .rodata.__FUNCTION__$5306 00000014  00000000  00000000  000011a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 82 .rodata.__FUNCTION__$5297 00000013  00000000  00000000  000011b4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 83 .debug_frame  00000310  00000000  00000000  000011c8  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 84 .debug_info   0000226e  00000000  00000000  000014d8  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 85 .debug_abbrev 00000247  00000000  00000000  00003746  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 86 .debug_loc    000010f0  00000000  00000000  0000398d  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 87 .debug_aranges 00000118  00000000  00000000  00004a7d  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 88 .debug_ranges 00000108  00000000  00000000  00004b95  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 89 .debug_line   00000e69  00000000  00000000  00004c9d  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 90 .debug_str    000009f1  00000000  00000000  00005b06  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 91 .comment      0000003b  00000000  00000000  000064f7  2**0
+                  CONTENTS, READONLY
+ 92 .xtensa.info  00000038  00000000  00000000  00006532  2**0
+                  CONTENTS, READONLY
+ 93 .xt.lit       000000e8  00000000  00000000  0000656a  2**0
+                  CONTENTS, RELOC, READONLY
+ 94 .xt.prop      00000e10  00000000  00000000  00006652  2**0
+                  CONTENTS, RELOC, READONLY
+
+ringbuf.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.returnItemToRingbufBytebuf 0000001c  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.returnItemToRingbufDefault 00000044  00000000  00000000  00000050  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.getItemFromRingbufDefault 00000024  00000000  00000000  00000094  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.copyItemToRingbufNoSplit 00000024  00000000  00000000  000000b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.copyItemToRingbufByteBuf 00000008  00000000  00000000  000000dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.copyItemToRingbufAllowSplit 00000034  00000000  00000000  000000e4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.xRingbufferReceiveGeneric 00000020  00000000  00000000  00000118  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.xRingbufferPrintInfo 00000020  00000000  00000000  00000138  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.xRingbufferGetCurFreeSize 0000001c  00000000  00000000  00000158  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.xRingbufferCreate 00000064  00000000  00000000  00000174  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.xRingbufferCreateNoSplit 00000004  00000000  00000000  000001d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.vRingbufferDelete 00000010  00000000  00000000  000001dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.xRingbufferGetMaxItemSize 00000014  00000000  00000000  000001ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xRingbufferIsNextItemWrapped 00000014  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.xRingbufferSend 0000003c  00000000  00000000  00000214  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.xRingbufferSendFromISR 00000024  00000000  00000000  00000250  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.xRingbufferReceive 00000004  00000000  00000000  00000274  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.xRingbufferReceiveFromISR 0000001c  00000000  00000000  00000278  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xRingbufferReceiveUpTo 00000020  00000000  00000000  00000294  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .literal.xRingbufferReceiveUpToFromISR 00000024  00000000  00000000  000002b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .literal.vRingbufferReturnItem 0000000c  00000000  00000000  000002d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .literal.vRingbufferReturnItemFromISR 0000000c  00000000  00000000  000002e4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .literal.xRingbufferAddToQueueSetRead 00000018  00000000  00000000  000002f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .literal.xRingbufferAddToQueueSetWrite 00000018  00000000  00000000  00000308  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .literal.xRingbufferRemoveFromQueueSetRead 00000018  00000000  00000000  00000320  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .literal.xRingbufferRemoveFromQueueSetWrite 00000018  00000000  00000000  00000338  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .text         00000000  00000000  00000000  00000350  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 27 .data         00000000  00000000  00000000  00000350  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 28 .bss          00000000  00000000  00000000  00000350  2**0
+                  ALLOC
+ 29 .text.ringbufferFreeMem 00000015  00000000  00000000  00000350  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .text.getItemFromRingbufByteBuf 00000056  00000000  00000000  00000368  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .text.getCurFreeSizeByteBuf 00000015  00000000  00000000  000003c0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .text.getCurFreeSizeAllowSplit 00000030  00000000  00000000  000003d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .text.getCurFreeSizeNoSplit 00000024  00000000  00000000  00000408  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .rodata.str1.4 00000083  00000000  00000000  0000042c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 35 .text.returnItemToRingbufBytebuf 00000045  00000000  00000000  000004b0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 36 .text.returnItemToRingbufDefault 00000136  00000000  00000000  000004f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .text.getItemFromRingbufDefault 000000a5  00000000  00000000  00000630  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .text.copyItemToRingbufNoSplit 000000b0  00000000  00000000  000006d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .text.copyItemToRingbufByteBuf 00000046  00000000  00000000  00000788  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 40 .text.copyItemToRingbufAllowSplit 00000124  00000000  00000000  000007d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .text.xRingbufferReceiveGeneric 00000070  00000000  00000000  000008f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 42 .text.xRingbufferPrintInfo 00000046  00000000  00000000  00000964  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .text.xRingbufferGetCurFreeSize 00000043  00000000  00000000  000009ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .text.xRingbufferCreate 00000118  00000000  00000000  000009f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .text.xRingbufferCreateNoSplit 0000001c  00000000  00000000  00000b08  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 46 .text.vRingbufferDelete 0000002c  00000000  00000000  00000b24  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 47 .text.xRingbufferGetMaxItemSize 00000022  00000000  00000000  00000b50  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 48 .text.xRingbufferIsNextItemWrapped 00000030  00000000  00000000  00000b74  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 49 .text.xRingbufferSend 000000d4  00000000  00000000  00000ba4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 50 .text.xRingbufferSendFromISR 00000062  00000000  00000000  00000c78  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 51 .text.xRingbufferReceive 00000015  00000000  00000000  00000cdc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 52 .text.xRingbufferReceiveFromISR 00000040  00000000  00000000  00000cf4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 53 .text.xRingbufferReceiveUpTo 00000054  00000000  00000000  00000d34  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 54 .text.xRingbufferReceiveUpToFromISR 00000064  00000000  00000000  00000d88  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 55 .text.vRingbufferReturnItem 00000030  00000000  00000000  00000dec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 56 .text.vRingbufferReturnItemFromISR 0000002c  00000000  00000000  00000e1c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 57 .text.xRingbufferAddToQueueSetRead 0000002c  00000000  00000000  00000e48  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 58 .text.xRingbufferAddToQueueSetWrite 0000002c  00000000  00000000  00000e74  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 59 .text.xRingbufferRemoveFromQueueSetRead 0000002c  00000000  00000000  00000ea0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 60 .text.xRingbufferRemoveFromQueueSetWrite 0000002c  00000000  00000000  00000ecc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 61 .rodata.__FUNCTION__$5577 00000023  00000000  00000000  00000ef8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 62 .rodata.__FUNCTION__$5571 00000022  00000000  00000000  00000f1c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 63 .rodata.__FUNCTION__$5565 0000001e  00000000  00000000  00000f40  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 64 .rodata.__FUNCTION__$5559 0000001d  00000000  00000000  00000f60  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 65 .rodata.__FUNCTION__$5542 0000001e  00000000  00000000  00000f80  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 66 .rodata.__FUNCTION__$5534 00000017  00000000  00000000  00000fa0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 67 .rodata.__FUNCTION__$5527 0000001a  00000000  00000000  00000fb8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 68 .rodata.__FUNCTION__$5508 0000001a  00000000  00000000  00000fd4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 69 .rodata.__FUNCTION__$5497 00000017  00000000  00000000  00000ff0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 70 .rodata.__FUNCTION__$5482 00000010  00000000  00000000  00001008  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 71 .rodata.__FUNCTION__$5469 0000001d  00000000  00000000  00001018  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 72 .rodata.__FUNCTION__$5464 0000001a  00000000  00000000  00001038  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 73 .rodata.__FUNCTION__$5379 0000001c  00000000  00000000  00001054  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 74 .rodata.__FUNCTION__$5395 0000001a  00000000  00000000  00001070  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 75 .rodata.__FUNCTION__$5408 0000001b  00000000  00000000  0000108c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 76 .rodata.__FUNCTION__$5418 0000001b  00000000  00000000  000010a8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 77 .rodata.__FUNCTION__$5369 00000019  00000000  00000000  000010c4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 78 .rodata.__FUNCTION__$5450 00000012  00000000  00000000  000010e0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 79 .rodata.__FUNCTION__$5428 0000001a  00000000  00000000  000010f4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 80 .rodata.__FUNCTION__$5423 00000015  00000000  00000000  00001110  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 81 .debug_frame  000002f8  00000000  00000000  00001128  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 82 .debug_info   00001dc4  00000000  00000000  00001420  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 83 .debug_abbrev 000002c9  00000000  00000000  000031e4  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 84 .debug_loc    00000df4  00000000  00000000  000034ad  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 85 .debug_aranges 00000110  00000000  00000000  000042a1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 86 .debug_ranges 00000130  00000000  00000000  000043b1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 87 .debug_line   00000ce4  00000000  00000000  000044e1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 88 .debug_str    000008b1  00000000  00000000  000051c5  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 89 .comment      0000003b  00000000  00000000  00005a76  2**0
+                  CONTENTS, READONLY
+ 90 .xtensa.info  00000038  00000000  00000000  00005ab1  2**0
+                  CONTENTS, READONLY
+ 91 .xt.lit       000000d0  00000000  00000000  00005ae9  2**0
+                  CONTENTS, RELOC, READONLY
+ 92 .xt.prop      00000bb8  00000000  00000000  00005bb9  2**0
+                  CONTENTS, RELOC, READONLY
+
+tasks.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvResetNextTaskUnblockTime 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvTaskGetSnapshotsFromList 00000004  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.prvDeleteTLS 00000018  00000000  00000000  00000040  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.prvTaskIsTaskSuspended 0000001c  00000000  00000000  00000058  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.prvInitialiseNewTask 00000018  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.prvInitialiseTaskLists 00000040  00000000  00000000  0000008c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.prvDeleteTCB 0000002c  00000000  00000000  000000cc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.prvAddCurrentTaskToDelayedList 0000001c  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.taskYIELD_OTHER_CORE 00000010  00000000  00000000  00000114  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.vTaskEndScheduler 00000008  00000000  00000000  00000124  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.vTaskSuspendAll 00000008  00000000  00000000  0000012c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.uxTaskGetNumberOfTasks 00000004  00000000  00000000  00000134  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.xTaskGetIdleTaskHandle 0000001c  00000000  00000000  00000138  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xTaskGetIdleTaskHandleForCPU 0000001c  00000000  00000000  00000154  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.vTaskSwitchContext 0000003c  00000000  00000000  00000170  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.vTaskSetTimeOutState 00000020  00000000  00000000  000001ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.vTaskMissedYield 00000004  00000000  00000000  000001cc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.vTaskAllocateMPURegions 00000020  00000000  00000000  000001d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xTaskGetCurrentTaskHandle 00000008  00000000  00000000  000001f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .literal.__getreent 00000008  00000000  00000000  000001f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .literal.pcTaskGetTaskName 0000001c  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .literal.pvTaskGetThreadLocalStoragePointer 00000004  00000000  00000000  0000021c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .literal.xTaskGetAffinity 00000004  00000000  00000000  00000220  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .literal.uxTaskGetStackHighWaterMark 00000008  00000000  00000000  00000224  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .literal.pxTaskGetStackStart 00000004  00000000  00000000  0000022c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .literal.xTaskGetCurrentTaskHandleForCPU 00000004  00000000  00000000  00000230  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .literal.xTaskGetSchedulerState 0000000c  00000000  00000000  00000234  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .literal.vTaskEnterCritical 00000034  00000000  00000000  00000240  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .literal.vTaskExitCritical 00000030  00000000  00000000  00000274  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .literal.prvAddNewTaskToReadyList 00000058  00000000  00000000  000002a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .literal.xTaskCreateRestricted 00000028  00000000  00000000  000002fc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .literal.xTaskCreatePinnedToCore 00000018  00000000  00000000  00000324  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .literal.vTaskStartScheduler 00000038  00000000  00000000  0000033c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .literal.vTaskDelete 00000060  00000000  00000000  00000374  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .literal.vTaskDelayUntil 00000048  00000000  00000000  000003d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 35 .literal.vTaskDelay 00000038  00000000  00000000  0000041c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 36 .literal.eTaskGetState 00000038  00000000  00000000  00000454  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .literal.uxTaskPriorityGet 00000010  00000000  00000000  0000048c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .literal.uxTaskPriorityGetFromISR 00000010  00000000  00000000  0000049c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .literal.vTaskPrioritySet 00000044  00000000  00000000  000004ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 40 .literal.vTaskSuspend 00000060  00000000  00000000  000004f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .literal.vTaskResume 00000044  00000000  00000000  00000550  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 42 .literal.xTaskResumeFromISR 0000004c  00000000  00000000  00000594  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .literal.prvCheckTasksWaitingTermination 00000030  00000000  00000000  000005e0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .literal.prvIdleTask 00000008  00000000  00000000  00000610  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .literal.xTaskGetTickCount 00000010  00000000  00000000  00000618  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 46 .literal.xTaskGetTickCountFromISR 00000010  00000000  00000000  00000628  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 47 .literal.xTaskIncrementTick 00000078  00000000  00000000  00000638  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 48 .literal.xTaskResumeAll 0000005c  00000000  00000000  000006b0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 49 .literal.vTaskPlaceOnEventList 00000040  00000000  00000000  0000070c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 50 .literal.vTaskPlaceOnUnorderedEventList 00000054  00000000  00000000  0000074c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 51 .literal.vTaskPlaceOnEventListRestricted 00000038  00000000  00000000  000007a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 52 .literal.xTaskRemoveFromEventList 00000058  00000000  00000000  000007d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 53 .literal.xTaskRemoveFromUnorderedEventList 0000005c  00000000  00000000  00000830  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 54 .literal.xTaskCheckForTimeOut 0000003c  00000000  00000000  0000088c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 55 .literal.vTaskSetThreadLocalStoragePointerAndDelCallback 00000010  00000000  00000000  000008c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 56 .literal.vTaskSetThreadLocalStoragePointer 00000004  00000000  00000000  000008d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 57 .literal.vTaskPriorityInherit 0000002c  00000000  00000000  000008dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 58 .literal.xTaskPriorityDisinherit 00000040  00000000  00000000  00000908  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 59 .literal.uxTaskResetEventItemValue 00000010  00000000  00000000  00000948  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 60 .literal.pvTaskIncrementMutexHeldCount 00000010  00000000  00000000  00000958  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 61 .literal.ulTaskNotifyTake 00000030  00000000  00000000  00000968  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 62 .literal.xTaskNotifyWait 00000030  00000000  00000000  00000998  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 63 .literal.xTaskNotify 00000050  00000000  00000000  000009c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 64 .literal.xTaskNotifyFromISR 00000058  00000000  00000000  00000a18  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 65 .literal.vTaskNotifyGiveFromISR 00000058  00000000  00000000  00000a70  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 66 .literal.uxTaskGetSnapshotAll 00000030  00000000  00000000  00000ac8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 67 .text         00000000  00000000  00000000  00000af8  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 68 .data         00000000  00000000  00000000  00000af8  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 69 .bss          00000000  00000000  00000000  00000af8  2**0
+                  ALLOC
+ 70 .text.prvTaskCheckFreeStackSpace 00000019  00000000  00000000  00000af8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 71 .text.prvResetNextTaskUnblockTime 00000034  00000000  00000000  00000b14  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 72 .text.prvTaskGetSnapshot 00000036  00000000  00000000  00000b48  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 73 .text.prvTaskGetSnapshotsFromList 00000047  00000000  00000000  00000b80  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 74 .rodata.str1.4 00000161  00000000  00000000  00000bc8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 75 .text.prvDeleteTLS 00000040  00000000  00000000  00000d2c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 76 .text.prvTaskIsTaskSuspended 0000004e  00000000  00000000  00000d6c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 77 .text.prvInitialiseNewTask 000000d0  00000000  00000000  00000dbc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 78 .text.prvInitialiseTaskLists 0000006e  00000000  00000000  00000e8c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 79 .text.prvDeleteTCB 0000005d  00000000  00000000  00000efc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 80 .text.prvAddCurrentTaskToDelayedList 0000006a  00000000  00000000  00000f5c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 81 .text.taskYIELD_OTHER_CORE 00000053  00000000  00000000  00000fc8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 82 .text.vTaskEndScheduler 00000018  00000000  00000000  0000101c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 83 .text.vTaskSuspendAll 00000026  00000000  00000000  00001034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 84 .text.uxTaskGetNumberOfTasks 0000000d  00000000  00000000  0000105c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 85 .text.xTaskGetIdleTaskHandle 0000003b  00000000  00000000  0000106c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 86 .text.xTaskGetIdleTaskHandleForCPU 0000002e  00000000  00000000  000010a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 87 .text.vTaskSwitchContext 0000028a  00000000  00000000  000010d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 88 .text.vTaskSetTimeOutState 00000034  00000000  00000000  00001364  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 89 .text.vTaskMissedYield 00000018  00000000  00000000  00001398  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 90 .text.vTaskAllocateMPURegions 00000028  00000000  00000000  000013b0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 91 .text.xTaskGetCurrentTaskHandle 0000001f  00000000  00000000  000013d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 92 .text.__getreent 00000019  00000000  00000000  000013f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 93 .text.pcTaskGetTaskName 0000002d  00000000  00000000  00001414  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 94 .text.pvTaskGetThreadLocalStoragePointer 0000001e  00000000  00000000  00001444  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 95 .text.xTaskGetAffinity 00000013  00000000  00000000  00001464  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 96 .text.uxTaskGetStackHighWaterMark 0000001a  00000000  00000000  00001478  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 97 .text.pxTaskGetStackStart 00000012  00000000  00000000  00001494  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 98 .text.xTaskGetCurrentTaskHandleForCPU 00000018  00000000  00000000  000014a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 99 .text.xTaskGetSchedulerState 00000037  00000000  00000000  000014c0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+100 .text.vTaskEnterCritical 000000b3  00000000  00000000  000014f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+101 .text.vTaskExitCritical 0000008a  00000000  00000000  000015ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+102 .text.prvAddNewTaskToReadyList 00000173  00000000  00000000  00001638  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+103 .text.xTaskCreateRestricted 00000074  00000000  00000000  000017ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+104 .text.xTaskCreatePinnedToCore 00000076  00000000  00000000  00001820  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+105 .text.vTaskStartScheduler 00000072  00000000  00000000  00001898  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+106 .text.vTaskDelete 00000122  00000000  00000000  0000190c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+107 .text.vTaskDelayUntil 000000e7  00000000  00000000  00001a30  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+108 .text.vTaskDelay 00000080  00000000  00000000  00001b18  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+109 .text.eTaskGetState 000000aa  00000000  00000000  00001b98  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+110 .text.uxTaskPriorityGet 00000023  00000000  00000000  00001c44  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+111 .text.uxTaskPriorityGetFromISR 00000023  00000000  00000000  00001c68  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+112 .text.vTaskPrioritySet 00000143  00000000  00000000  00001c8c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+113 .text.vTaskSuspend 00000106  00000000  00000000  00001dd0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+114 .text.vTaskResume 000000d8  00000000  00000000  00001ed8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+115 .text.xTaskResumeFromISR 000000f6  00000000  00000000  00001fb0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+116 .text.prvCheckTasksWaitingTermination 000000c6  00000000  00000000  000020a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+117 .text.prvIdleTask 00000012  00000000  00000000  00002170  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+118 .text.xTaskGetTickCount 00000020  00000000  00000000  00002184  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+119 .text.xTaskGetTickCountFromISR 00000020  00000000  00000000  000021a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+120 .text.xTaskIncrementTick 000001ce  00000000  00000000  000021c4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+121 .text.xTaskResumeAll 00000186  00000000  00000000  00002394  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+122 .text.vTaskPlaceOnEventList 00000097  00000000  00000000  0000251c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+123 .text.vTaskPlaceOnUnorderedEventList 000000cf  00000000  00000000  000025b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+124 .text.vTaskPlaceOnEventListRestricted 0000006f  00000000  00000000  00002684  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+125 .text.xTaskRemoveFromEventList 00000143  00000000  00000000  000026f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+126 .text.xTaskRemoveFromUnorderedEventList 000000ff  00000000  00000000  00002838  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+127 .text.xTaskCheckForTimeOut 00000096  00000000  00000000  00002938  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+128 .text.vTaskSetThreadLocalStoragePointerAndDelCallback 0000002f  00000000  00000000  000029d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+129 .text.vTaskSetThreadLocalStoragePointer 00000013  00000000  00000000  00002a00  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+130 .text.vTaskPriorityInherit 000000db  00000000  00000000  00002a14  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+131 .text.xTaskPriorityDisinherit 000000aa  00000000  00000000  00002af0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+132 .text.uxTaskResetEventItemValue 0000003e  00000000  00000000  00002b9c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+133 .text.pvTaskIncrementMutexHeldCount 00000054  00000000  00000000  00002bdc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+134 .text.ulTaskNotifyTake 0000012e  00000000  00000000  00002c30  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+135 .text.xTaskNotifyWait 00000156  00000000  00000000  00002d60  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+136 .text.xTaskNotify 0000014a  00000000  00000000  00002eb8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+137 .text.xTaskNotifyFromISR 00000172  00000000  00000000  00003004  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+138 .text.vTaskNotifyGiveFromISR 0000011c  00000000  00000000  00003178  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+139 .text.uxTaskGetSnapshotAll 0000009c  00000000  00000000  00003294  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+140 .rodata.__FUNCTION__$5930 00000017  00000000  00000000  00003330  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+141 .rodata.__FUNCTION__$5917 00000013  00000000  00000000  00003348  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+142 .rodata.__FUNCTION__$5901 0000000c  00000000  00000000  0000335c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+143 .rodata.__func__$5851 00000029  00000000  00000000  00003368  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+144 .rodata.__func__$5846 00000029  00000000  00000000  00003394  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+145 .rodata.__FUNCTION__$5808 00000018  00000000  00000000  000033c0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+146 .rodata.__FUNCTION__$5718 00000018  00000000  00000000  000033d8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+147 .rodata.__FUNCTION__$5683 00000015  00000000  00000000  000033f0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+148 .rodata.__FUNCTION__$5677 00000015  00000000  00000000  00003408  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+149 .rodata.__FUNCTION__$5673 00000022  00000000  00000000  00003420  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+150 .rodata.__FUNCTION__$5663 00000019  00000000  00000000  00003444  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+151 .rodata.__FUNCTION__$5654 00000020  00000000  00000000  00003460  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+152 .rodata.__FUNCTION__$5648 0000001f  00000000  00000000  00003480  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+153 .rodata.__FUNCTION__$5641 00000016  00000000  00000000  000034a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+154 .rodata.ucExpectedStackBytes$5613 00000014  00000000  00000000  000034b8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+155 .rodata.__FUNCTION__$5605 00000013  00000000  00000000  000034cc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+156 .rodata.__FUNCTION__$5596 0000001d  00000000  00000000  000034e0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+157 .rodata.__FUNCTION__$5591 00000017  00000000  00000000  00003500  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+158 .rodata.__FUNCTION__$5587 00000012  00000000  00000000  00003518  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+159 .rodata.__FUNCTION__$5565 0000000f  00000000  00000000  0000352c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+160 .rodata.__FUNCTION__$5547 00000014  00000000  00000000  0000353c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+161 .rodata.__FUNCTION__$5536 00000013  00000000  00000000  00003550  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+162 .rodata.__FUNCTION__$5525 00000017  00000000  00000000  00003564  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+163 .rodata.__FUNCTION__$5530 0000000c  00000000  00000000  0000357c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+164 .rodata.__FUNCTION__$5519 0000000d  00000000  00000000  00003588  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+165 .rodata.__FUNCTION__$5513 00000011  00000000  00000000  00003598  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+166 .rodata.__FUNCTION__$5494 0000000e  00000000  00000000  000035ac  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+167 .rodata.__FUNCTION__$5485 0000000b  00000000  00000000  000035bc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+168 .rodata.__FUNCTION__$5478 00000010  00000000  00000000  000035c8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+169 .rodata.__FUNCTION__$5772 0000000d  00000000  00000000  000035d8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+170 .rodata.__FUNCTION__$5776 0000000d  00000000  00000000  000035e8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+171 .rodata.__FUNCTION__$5470 0000000c  00000000  00000000  000035f8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+172 .rodata.__FUNCTION__$5463 00000019  00000000  00000000  00003604  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+173 .rodata.__FUNCTION__$5421 00000016  00000000  00000000  00003620  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+174 .bss.xSwitchingContext 00000008  00000000  00000000  00003638  2**2
+                  ALLOC
+175 .data.xTickCountMutex 00000008  00000000  00000000  00003638  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+176 .data.xTaskQueueMutex 00000008  00000000  00000000  00003640  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+177 .bss.uxSchedulerSuspended 00000008  00000000  00000000  00003648  2**2
+                  ALLOC
+178 .data.xNextTaskUnblockTime 00000004  00000000  00000000  00003648  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+179 .bss.uxTaskNumber 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+180 .bss.xNumOfOverflows 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+181 .bss.xYieldPending 00000008  00000000  00000000  0000364c  2**2
+                  ALLOC
+182 .bss.uxPendedTicks 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+183 .bss.xSchedulerRunning 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+184 .bss.uxTopReadyPriority 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+185 .bss.xTickCount 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+186 .bss.uxCurrentNumberOfTasks 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+187 .bss.xIdleTaskHandle 00000008  00000000  00000000  0000364c  2**2
+                  ALLOC
+188 .bss.xSuspendedTaskList 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+189 .bss.uxTasksDeleted 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+190 .bss.xTasksWaitingTermination 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+191 .bss.xPendingReadyList 00000028  00000000  00000000  0000364c  2**2
+                  ALLOC
+192 .bss.pxOverflowDelayedTaskList 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+193 .bss.pxDelayedTaskList 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+194 .bss.xDelayedTaskList2 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+195 .bss.xDelayedTaskList1 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+196 .bss.pxReadyTasksLists 000001f4  00000000  00000000  0000364c  2**2
+                  ALLOC
+197 .bss.pxCurrentTCB 00000008  00000000  00000000  0000364c  2**2
+                  ALLOC
+198 .debug_frame  00000688  00000000  00000000  0000364c  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+199 .debug_info   00005e20  00000000  00000000  00003cd4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+200 .debug_abbrev 0000046f  00000000  00000000  00009af4  2**0
+                  CONTENTS, READONLY, DEBUGGING
+201 .debug_loc    000022ef  00000000  00000000  00009f63  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+202 .debug_aranges 00000240  00000000  00000000  0000c252  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+203 .debug_ranges 000002c8  00000000  00000000  0000c492  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+204 .debug_line   0000291c  00000000  00000000  0000c75a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+205 .debug_str    0000190d  00000000  00000000  0000f076  2**0
+                  CONTENTS, READONLY, DEBUGGING
+206 .comment      0000003b  00000000  00000000  00010983  2**0
+                  CONTENTS, READONLY
+207 .xtensa.info  00000038  00000000  00000000  000109be  2**0
+                  CONTENTS, READONLY
+208 .xt.lit       00000218  00000000  00000000  000109f6  2**0
+                  CONTENTS, RELOC, READONLY
+209 .xt.prop      00002154  00000000  00000000  00010c0e  2**0
+                  CONTENTS, RELOC, READONLY
+
+timers.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvGetNextExpireTime 00000004  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvInsertTimerInActiveList 00000010  00000000  00000000  00000038  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.prvCheckForValidListAndQueue 00000044  00000000  00000000  00000048  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.prvInitialiseNewTimer 0000001c  00000000  00000000  0000008c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.xTimerCreateTimerTask 0000002c  00000000  00000000  000000a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xTimerCreate 00000008  00000000  00000000  000000d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.xTimerGenericCommand 00000014  00000000  00000000  000000dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.prvSwitchTimerLists 00000028  00000000  00000000  000000f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.prvSampleTimeNow 0000000c  00000000  00000000  00000118  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.prvProcessExpiredTimer 00000024  00000000  00000000  00000124  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.prvProcessTimerOrBlockTask 00000024  00000000  00000000  00000148  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.prvProcessReceivedCommands 00000040  00000000  00000000  0000016c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.prvTimerTask 0000000c  00000000  00000000  000001ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xTimerGetPeriod 00000014  00000000  00000000  000001b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.xTimerGetExpiryTime 00000014  00000000  00000000  000001cc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.xTimerIsTimerActive 0000000c  00000000  00000000  000001e0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.vTimerSetTimerID 00000014  00000000  00000000  000001ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.xTimerPendFunctionCallFromISR 00000008  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xTimerPendFunctionCall 0000001c  00000000  00000000  00000208  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .text         00000000  00000000  00000000  00000224  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 20 .data         00000000  00000000  00000000  00000224  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 21 .bss          00000000  00000000  00000000  00000224  2**0
+                  ALLOC
+ 22 .text.prvGetNextExpireTime 00000020  00000000  00000000  00000224  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .text.prvInsertTimerInActiveList 00000054  00000000  00000000  00000244  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .rodata.str1.4 00000058  00000000  00000000  00000298  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 25 .text.prvCheckForValidListAndQueue 0000007e  00000000  00000000  000002f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .text.prvInitialiseNewTimer 0000003a  00000000  00000000  00000370  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .text.xTimerCreateTimerTask 0000004c  00000000  00000000  000003ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .text.xTimerCreate 00000026  00000000  00000000  000003f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .text.xTimerGenericCommand 0000005d  00000000  00000000  00000420  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .text.prvSwitchTimerLists 00000082  00000000  00000000  00000480  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .text.prvSampleTimeNow 0000002f  00000000  00000000  00000504  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .text.prvProcessExpiredTimer 0000005f  00000000  00000000  00000534  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .text.prvProcessTimerOrBlockTask 0000006c  00000000  00000000  00000594  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .text.prvProcessReceivedCommands 000000e6  00000000  00000000  00000600  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 35 .rodata.prvProcessReceivedCommands 00000028  00000000  00000000  000006e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+ 36 .text.prvTimerTask 0000001d  00000000  00000000  00000710  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .text.xTimerGetPeriod 00000022  00000000  00000000  00000730  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .text.xTimerGetExpiryTime 00000022  00000000  00000000  00000754  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .text.pcTimerGetTimerName 00000007  00000000  00000000  00000778  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 40 .text.xTimerIsTimerActive 00000024  00000000  00000000  00000780  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .text.pvTimerGetTimerID 00000007  00000000  00000000  000007a4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 42 .text.vTimerSetTimerID 00000022  00000000  00000000  000007ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .text.xTimerPendFunctionCallFromISR 00000022  00000000  00000000  000007d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .text.xTimerPendFunctionCall 0000003c  00000000  00000000  000007f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .rodata.__FUNCTION__$5352 00000017  00000000  00000000  00000830  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 46 .rodata.__FUNCTION__$5335 00000011  00000000  00000000  00000848  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 47 .rodata.__FUNCTION__$5240 00000014  00000000  00000000  0000085c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 48 .rodata.__FUNCTION__$5234 00000010  00000000  00000000  00000870  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 49 .rodata.__FUNCTION__$5220 00000016  00000000  00000000  00000880  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 50 .rodata.__FUNCTION__$5320 0000001d  00000000  00000000  00000898  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 51 .rodata.__FUNCTION__$5289 0000001b  00000000  00000000  000008b8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 52 .rodata.__FUNCTION__$5251 00000017  00000000  00000000  000008d4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 53 .rodata.__FUNCTION__$5313 00000014  00000000  00000000  000008ec  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 54 .bss.xLastTime$5272 00000004  00000000  00000000  00000900  2**2
+                  ALLOC
+ 55 .rodata.__FUNCTION__$5203 00000016  00000000  00000000  00000900  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 56 .data.xTimerMux 00000008  00000000  00000000  00000918  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+ 57 .bss.xTimerQueue 00000004  00000000  00000000  00000920  2**2
+                  ALLOC
+ 58 .bss.pxOverflowTimerList 00000004  00000000  00000000  00000920  2**2
+                  ALLOC
+ 59 .bss.pxCurrentTimerList 00000004  00000000  00000000  00000920  2**2
+                  ALLOC
+ 60 .bss.xActiveTimerList2 00000014  00000000  00000000  00000920  2**2
+                  ALLOC
+ 61 .bss.xActiveTimerList1 00000014  00000000  00000000  00000920  2**2
+                  ALLOC
+ 62 .debug_frame  00000208  00000000  00000000  00000920  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 63 .debug_info   00001405  00000000  00000000  00000b28  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 64 .debug_abbrev 00000279  00000000  00000000  00001f2d  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 65 .debug_loc    0000062f  00000000  00000000  000021a6  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 66 .debug_aranges 000000c0  00000000  00000000  000027d5  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 67 .debug_ranges 000000b0  00000000  00000000  00002895  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 68 .debug_line   00000771  00000000  00000000  00002945  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 69 .debug_str    00000934  00000000  00000000  000030b6  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 70 .comment      0000003b  00000000  00000000  000039ea  2**0
+                  CONTENTS, READONLY
+ 71 .xtensa.info  00000038  00000000  00000000  00003a25  2**0
+                  CONTENTS, READONLY
+ 72 .xt.lit       00000098  00000000  00000000  00003a5d  2**0
+                  CONTENTS, RELOC, READONLY
+ 73 .xt.prop      00000714  00000000  00000000  00003af5  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_context.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal      00000024  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .text         0000013a  00000000  00000000  00000058  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .data         00000000  00000000  00000000  00000192  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  3 .bss          00000000  00000000  00000000  00000192  2**0
+                  ALLOC
+  4 .xtensa.info  00000038  00000000  00000000  00000192  2**0
+                  CONTENTS, READONLY
+  5 .debug_line   00000313  00000000  00000000  000001ca  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  6 .debug_info   0000009a  00000000  00000000  000004dd  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_abbrev 00000014  00000000  00000000  00000577  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_aranges 00000020  00000000  00000000  00000590  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .xt.lit       00000008  00000000  00000000  000005b0  2**0
+                  CONTENTS, RELOC, READONLY
+ 10 .xt.prop      000000e4  00000000  00000000  000005b8  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_init.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal._xt_tick_divisor_init 0000000c  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xt_clock_freq 00000004  00000000  00000000  00000040  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .text         00000000  00000000  00000000  00000044  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  3 .data         00000000  00000000  00000000  00000044  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  4 .bss          00000000  00000000  00000000  00000044  2**0
+                  ALLOC
+  5 .text._xt_tick_divisor_init 0000001f  00000000  00000000  00000044  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .text.xt_clock_freq 0000000d  00000000  00000000  00000064  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .bss._xt_tick_divisor 00000004  00000000  00000000  00000074  2**2
+                  ALLOC
+  8 .debug_frame  00000040  00000000  00000000  00000074  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .debug_info   000000d4  00000000  00000000  000000b4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 10 .debug_abbrev 0000008b  00000000  00000000  00000188  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 11 .debug_aranges 00000028  00000000  00000000  00000213  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_ranges 00000018  00000000  00000000  0000023b  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 13 .debug_line   000000c8  00000000  00000000  00000253  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_str    00000180  00000000  00000000  0000031b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 15 .comment      0000003b  00000000  00000000  0000049b  2**0
+                  CONTENTS, READONLY
+ 16 .xtensa.info  00000038  00000000  00000000  000004d6  2**0
+                  CONTENTS, READONLY
+ 17 .xt.lit       00000010  00000000  00000000  0000050e  2**0
+                  CONTENTS, RELOC, READONLY
+ 18 .xt.prop      0000006c  00000000  00000000  0000051e  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_intr.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.xt_unhandled_interrupt 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xt_set_exception_handler 00000008  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xt_set_interrupt_handler 0000000c  00000000  00000000  00000044  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .text         00000000  00000000  00000000  00000050  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  4 .data         00000000  00000000  00000000  00000050  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  5 .bss          00000000  00000000  00000000  00000050  2**0
+                  ALLOC
+  6 .rodata.str1.4 00000023  00000000  00000000  00000050  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+  7 .text.xt_unhandled_interrupt 00000016  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .text.xt_set_exception_handler 00000042  00000000  00000000  0000008c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .text.xt_set_interrupt_handler 00000046  00000000  00000000  000000d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .debug_frame  00000058  00000000  00000000  00000118  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 11 .debug_info   0000042d  00000000  00000000  00000170  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_abbrev 000001b6  00000000  00000000  0000059d  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 13 .debug_loc    0000015c  00000000  00000000  00000753  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_aranges 00000030  00000000  00000000  000008af  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 15 .debug_ranges 00000020  00000000  00000000  000008df  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 16 .debug_line   000002b8  00000000  00000000  000008ff  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 17 .debug_str    000002a5  00000000  00000000  00000bb7  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 18 .comment      0000003b  00000000  00000000  00000e5c  2**0
+                  CONTENTS, READONLY
+ 19 .xtensa.info  00000038  00000000  00000000  00000e97  2**0
+                  CONTENTS, READONLY
+ 20 .xt.lit       00000018  00000000  00000000  00000ecf  2**0
+                  CONTENTS, RELOC, READONLY
+ 21 .xt.prop      00000120  00000000  00000000  00000ee7  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_intr_asm.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .text         00000033  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         00000400  00000000  00000000  00000068  2**3
+                  CONTENTS, ALLOC, LOAD, RELOC, DATA
+  2 .bss          00000000  00000000  00000000  00000468  2**0
+                  ALLOC
+  3 .xtensa.info  00000038  00000000  00000000  00000468  2**0
+                  CONTENTS, READONLY
+  4 .debug_line   000000da  00000000  00000000  000004a0  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  5 .debug_info   0000009b  00000000  00000000  0000057a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  6 .debug_abbrev 00000014  00000000  00000000  00000615  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  7 .debug_aranges 00000020  00000000  00000000  00000630  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  8 .xt.prop      00000054  00000000  00000000  00000650  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_overlay_os_hook.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.xt_overlay_init_os 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xt_overlay_lock 00000008  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xt_overlay_unlock 00000008  00000000  00000000  00000044  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .text         00000000  00000000  00000000  0000004c  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  4 .data         00000000  00000000  00000000  0000004c  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  5 .bss          00000000  00000000  00000000  0000004c  2**0
+                  ALLOC
+  6 .text.xt_overlay_init_os 00000013  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .text.xt_overlay_lock 00000016  00000000  00000000  00000060  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .text.xt_overlay_unlock 00000016  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .bss.xt_overlay_mutex 00000004  00000000  00000000  00000090  2**2
+                  ALLOC
+ 10 .debug_frame  00000058  00000000  00000000  00000090  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 11 .debug_info   00000193  00000000  00000000  000000e8  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_abbrev 0000008f  00000000  00000000  0000027b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 13 .debug_aranges 00000030  00000000  00000000  0000030a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_ranges 00000020  00000000  00000000  0000033a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 15 .debug_line   00000192  00000000  00000000  0000035a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 16 .debug_str    0000025c  00000000  00000000  000004ec  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 17 .comment      0000003b  00000000  00000000  00000748  2**0
+                  CONTENTS, READONLY
+ 18 .xtensa.info  00000038  00000000  00000000  00000783  2**0
+                  CONTENTS, READONLY
+ 19 .xt.lit       00000018  00000000  00000000  000007bb  2**0
+                  CONTENTS, RELOC, READONLY
+ 20 .xt.prop      0000009c  00000000  00000000  000007d3  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_vector_defaults.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .iram1.literal 00000004  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .text         00000000  00000000  00000000  00000038  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  2 .data         00000000  00000000  00000000  00000038  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  3 .bss          00000000  00000000  00000000  00000038  2**0
+                  ALLOC
+  4 .iram1        00000032  00000000  00000000  00000038  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .xtensa.info  00000038  00000000  00000000  0000006a  2**0
+                  CONTENTS, READONLY
+  6 .debug_line   000000c2  00000000  00000000  000000a2  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_info   000000a2  00000000  00000000  00000164  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  8 .debug_abbrev 00000014  00000000  00000000  00000206  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  9 .debug_aranges 00000020  00000000  00000000  00000220  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 10 .xt.lit       00000008  00000000  00000000  00000240  2**0
+                  CONTENTS, RELOC, READONLY
+ 11 .xt.prop      00000078  00000000  00000000  00000248  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_vectors.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .iram1.literal 000000a8  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .DebugExceptionVector.literal 00000004  00000000  00000000  000000dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .DoubleExceptionVector.literal 00000004  00000000  00000000  000000e0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .KernelExceptionVector.literal 00000004  00000000  00000000  000000e4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .UserExceptionVector.literal 00000004  00000000  00000000  000000e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .Level2InterruptVector.literal 00000004  00000000  00000000  000000ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .Level3InterruptVector.literal 00000004  00000000  00000000  000000f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .Level4InterruptVector.literal 00000004  00000000  00000000  000000f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .Level5InterruptVector.literal 00000004  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .NMIExceptionVector.literal 00000004  00000000  00000000  000000fc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .text         00000000  00000000  00000000  00000100  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 11 .data         00000008  00000000  00000000  00000100  2**4
+                  CONTENTS, ALLOC, LOAD, DATA
+ 12 .bss          00000000  00000000  00000000  00000108  2**0
+                  ALLOC
+ 13 .iram1        000004ec  00000000  00000000  00000108  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .rodata       00000024  00000000  00000000  00000600  2**4
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 15 .DebugExceptionVector.text 00000009  00000000  00000000  00000624  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .DoubleExceptionVector.text 00000011  00000000  00000000  00000630  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .KernelExceptionVector.text 00000009  00000000  00000000  00000644  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .UserExceptionVector.text 00000009  00000000  00000000  00000650  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .Level2InterruptVector.text 00000009  00000000  00000000  0000065c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .Level3InterruptVector.text 00000009  00000000  00000000  00000668  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .Level4InterruptVector.text 00000009  00000000  00000000  00000674  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .Level5InterruptVector.text 00000009  00000000  00000000  00000680  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .NMIExceptionVector.text 00000009  00000000  00000000  0000068c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .WindowVectors.text 0000016a  00000000  00000000  00000698  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .UserEnter.text 00000000  00000000  00000000  00000804  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 26 .xtensa.info  00000038  00000000  00000000  00000804  2**0
+                  CONTENTS, READONLY
+ 27 .debug_line   000009b8  00000000  00000000  0000083c  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 28 .debug_info   00000096  00000000  00000000  000011f4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 29 .debug_abbrev 00000012  00000000  00000000  0000128a  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 30 .debug_aranges 00000070  00000000  00000000  000012a0  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 31 .debug_ranges 00000068  00000000  00000000  00001310  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 32 .xt.lit       00000050  00000000  00000000  00001378  2**0
+                  CONTENTS, RELOC, READONLY
+ 33 .xt.prop      000004f8  00000000  00000000  000013c8  2**0
+                  CONTENTS, RELOC, READONLY
diff --git a/tools/ldgen/samples/template.ld b/tools/ldgen/samples/template.ld
new file mode 100644
index 00000000..743cf5c6
--- /dev/null
+++ b/tools/ldgen/samples/template.ld
@@ -0,0 +1,214 @@
+/*  Default entry point:  */
+ENTRY(call_start_cpu0);
+
+SECTIONS
+{
+  /* RTC fast memory holds RTC wake stub code,
+     including from any source file named rtc_wake_stub*.c
+  */
+  .rtc.text :
+  {
+    . = ALIGN(4);
+
+    mapping[rtc_text]
+
+    *rtc_wake_stub*.o(.literal .text .literal.* .text.*)
+  } >rtc_iram_seg
+
+  /* RTC slow memory holds RTC wake stub
+     data/rodata, including from any source file
+     named rtc_wake_stub*.c
+  */
+  .rtc.data :
+  {
+    _rtc_data_start = ABSOLUTE(.);
+
+    mapping[rtc_data]
+
+    *rtc_wake_stub*.o(.data .rodata .data.* .rodata.* .bss .bss.*)
+    _rtc_data_end = ABSOLUTE(.);
+  } > rtc_slow_seg
+
+  /* RTC bss, from any source file named rtc_wake_stub*.c */
+  .rtc.bss (NOLOAD) :
+  {
+    _rtc_bss_start = ABSOLUTE(.);
+
+    mapping[rtc_bss]
+
+    *rtc_wake_stub*.o(.bss .bss.*)
+    *rtc_wake_stub*.o(COMMON)
+    _rtc_bss_end = ABSOLUTE(.);
+  } > rtc_slow_seg
+
+  /* Send .iram0 code to iram */
+  .iram0.vectors :
+  {
+    /* Vectors go to IRAM */
+    _init_start = ABSOLUTE(.);
+    /* Vectors according to builds/RF-2015.2-win32/esp108_v1_2_s5_512int_2/config.html */
+    . = 0x0;
+    KEEP(*(.WindowVectors.text));
+    . = 0x180;
+    KEEP(*(.Level2InterruptVector.text));
+    . = 0x1c0;
+    KEEP(*(.Level3InterruptVector.text));
+    . = 0x200;
+    KEEP(*(.Level4InterruptVector.text));
+    . = 0x240;
+    KEEP(*(.Level5InterruptVector.text));
+    . = 0x280;
+    KEEP(*(.DebugExceptionVector.text));
+    . = 0x2c0;
+    KEEP(*(.NMIExceptionVector.text));
+    . = 0x300;
+    KEEP(*(.KernelExceptionVector.text));
+    . = 0x340;
+    KEEP(*(.UserExceptionVector.text));
+    . = 0x3C0;
+    KEEP(*(.DoubleExceptionVector.text));
+    . = 0x400;
+    *(.*Vector.literal)
+
+    *(.UserEnter.literal);
+    *(.UserEnter.text);
+    . = ALIGN (16);
+    *(.entry.text)
+    *(.init.literal)
+    *(.init)
+    _init_end = ABSOLUTE(.);
+
+    /* This goes here, not at top of linker script, so addr2line finds it last,
+       and uses it in preference to the first symbol in IRAM */
+    _iram_start = ABSOLUTE(0);
+  } > iram0_0_seg
+
+  .iram0.text :
+  {
+    /* Code marked as runnning out of IRAM */
+    _iram_text_start = ABSOLUTE(.);
+
+    mapping[iram0_text]
+    
+    _iram_text_end = ABSOLUTE(.);
+  } > iram0_0_seg
+
+  .dram0.data :
+  {
+    _data_start = ABSOLUTE(.);
+
+    mapping[dram0_data]
+
+    *(.gnu.linkonce.d.*)
+    *(.data1)
+    *(.sdata)
+    *(.sdata.*)
+    *(.gnu.linkonce.s.*)
+    *(.sdata2)
+    *(.sdata2.*)
+    *(.gnu.linkonce.s2.*)
+    *(.jcr)
+    _data_end = ABSOLUTE(.);
+    . = ALIGN(4);
+  } >dram0_0_seg
+
+  /* Shared RAM */
+  .dram0.bss (NOLOAD) :
+  {
+    . = ALIGN (8);
+    _bss_start = ABSOLUTE(.);
+
+    mapping[dram0_bss]
+
+    *(.dynsbss)
+    *(.sbss)
+    *(.sbss.*)
+    *(.gnu.linkonce.sb.*)
+    *(.scommon)
+    *(.sbss2)
+    *(.sbss2.*)
+    *(.gnu.linkonce.sb2.*)
+    *(.dynbss)
+    *(.share.mem)
+    *(.gnu.linkonce.b.*)
+
+    . = ALIGN (8);
+    _bss_end = ABSOLUTE(.);
+  } >dram0_0_seg
+
+  .flash.rodata :
+  {
+    _rodata_start = ABSOLUTE(.);
+
+    mapping[flash_rodata]
+
+    *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
+    *(.gnu.linkonce.r.*)
+    *(.rodata1)
+    __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
+    *(.xt_except_table)
+    *(.gcc_except_table .gcc_except_table.*)
+    *(.gnu.linkonce.e.*)
+    *(.gnu.version_r)
+    . = (. + 3) & ~ 3;
+    __eh_frame = ABSOLUTE(.);
+    KEEP(*(.eh_frame))
+    . = (. + 7) & ~ 3;
+    /*  C++ constructor and destructor tables, properly ordered:  */
+    __init_array_start = ABSOLUTE(.);
+    KEEP (*crtbegin.o(.ctors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    __init_array_end = ABSOLUTE(.);
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    /*  C++ exception handlers table:  */
+    __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
+    *(.xt_except_desc)
+    *(.gnu.linkonce.h.*)
+    __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+    *(.xt_except_desc_end)
+    *(.dynamic)
+    *(.gnu.version_d)
+    _rodata_end = ABSOLUTE(.);
+    /* Literals are also RO data. */
+    _lit4_start = ABSOLUTE(.);
+    *(*.lit4)
+    *(.lit4.*)
+    *(.gnu.linkonce.lit4.*)
+    _lit4_end = ABSOLUTE(.);
+    . = ALIGN(4);
+    _thread_local_start = ABSOLUTE(.);
+    *(.tdata)
+    *(.tdata.*)
+    *(.tbss)
+    *(.tbss.*)
+    _thread_local_end = ABSOLUTE(.);
+    . = ALIGN(4);
+  } >drom0_0_seg
+
+  .flash.text :
+  {
+    _stext = .;
+    _text_start = ABSOLUTE(.);
+
+    mapping[flash_text]
+
+    *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+    *(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */
+    *(.fini.literal)
+    *(.fini)
+    *(.gnu.version)
+    _text_end = ABSOLUTE(.);
+    _etext = .;
+
+    /* Similar to _iram_start, this symbol goes here so it is
+       resolved by addr2line in preference to the first symbol in
+       the flash.text segment.
+    */
+    _flash_cache_start = ABSOLUTE(0);
+  } >iram0_2_seg
+}
diff --git a/tools/ldgen/sdkconfig.py b/tools/ldgen/sdkconfig.py
new file mode 100644
index 00000000..943013df
--- /dev/null
+++ b/tools/ldgen/sdkconfig.py
@@ -0,0 +1,81 @@
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os
+from pyparsing import Word, alphanums, printables, Combine, Literal, hexnums, quotedString, Optional, nums, removeQuotes, oneOf, Group, infixNotation, opAssoc
+
+import sys
+try:
+    import kconfiglib
+except ImportError:
+    parent_dir_name = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+    kconfig_new_dir = os.path.abspath(parent_dir_name + "/kconfig_new")
+    sys.path.append(kconfig_new_dir)
+    import kconfiglib
+
+
+class SDKConfig:
+    """
+    Encapsulates an sdkconfig file. Defines grammar of a configuration entry, and enables
+    evaluation of logical expressions involving those entries.
+    """
+
+    # A configuration entry is in the form CONFIG=VALUE. Definitions of components of that grammar
+    IDENTIFIER = Word(alphanums.upper() + "_")
+
+    HEX = Combine("0x" + Word(hexnums)).setParseAction(lambda t:int(t[0], 16))
+    DECIMAL = Combine(Optional(Literal("+") | Literal("-")) + Word(nums)).setParseAction(lambda t:int(t[0]))
+    LITERAL = Word(printables.replace(":", ""))
+    QUOTED_LITERAL = quotedString.setParseAction(removeQuotes)
+
+    VALUE = HEX | DECIMAL | LITERAL | QUOTED_LITERAL
+
+    # Operators supported by the expression evaluation
+    OPERATOR = oneOf(["=", "!=", ">", "<", "<=", ">="])
+
+    def __init__(self, kconfig_file, sdkconfig_file):
+        self.config = kconfiglib.Kconfig(kconfig_file)
+        self.config.load_config(sdkconfig_file)
+
+    def evaluate_expression(self, expression):
+        result = self.config.eval_string(expression)
+
+        if result == 0:  # n
+            return False
+        elif result == 2:  # y
+            return True
+        else:  # m
+            raise Exception("unsupported config expression result")
+
+    @staticmethod
+    def get_expression_grammar():
+        identifier = SDKConfig.IDENTIFIER.setResultsName("identifier")
+        operator = SDKConfig.OPERATOR.setResultsName("operator")
+        value = SDKConfig.VALUE.setResultsName("value")
+
+        test_binary = identifier + operator + value
+        test_single = identifier
+
+        test = test_binary | test_single
+
+        condition = Group(Optional("(").suppress() + test + Optional(")").suppress())
+
+        grammar = infixNotation(condition, [
+                                ("!", 1, opAssoc.RIGHT),
+                                ("&&", 2, opAssoc.LEFT),
+                                ("||",  2, opAssoc.LEFT)])
+
+        return grammar
diff --git a/tools/ldgen/test/data/Kconfig b/tools/ldgen/test/data/Kconfig
new file mode 100644
index 00000000..cb0b364d
--- /dev/null
+++ b/tools/ldgen/test/data/Kconfig
@@ -0,0 +1,19 @@
+menu "Test config"
+
+    config PERFORMANCE_LEVEL
+        int
+        range 0 3
+        prompt "Performance level"
+
+    config A
+        bool
+        default "y"
+
+    config B
+        bool
+        default "n"
+
+    config C
+        bool
+        default "y"
+endmenu
diff --git a/tools/ldgen/test/data/sample.lf b/tools/ldgen/test/data/sample.lf
new file mode 100644
index 00000000..45cb85dc
--- /dev/null
+++ b/tools/ldgen/test/data/sample.lf
@@ -0,0 +1,84 @@
+[sections:text]
+entries: 
+    .text+
+    .literal+
+    
+[sections:data]
+entries:
+    .data+
+
+[sections:bss]
+entries:
+    .bss+
+
+[sections:common]
+entries:
+    COMMON
+
+[sections:rodata]
+entries:
+    .rodata+
+
+[sections:rtc_text]
+entries:
+    .rtc.text
+    .rtc.literal
+
+[sections:rtc_data]
+entries:
+    .rtc.data
+
+[sections:rtc_rodata]
+entries:
+    .rtc.rodata
+
+[sections:rtc_bss]
+entries:
+    .rtc.bss
+
+[sections:extram_bss]
+entries:
+    .exram.bss
+
+[sections:iram]
+entries:
+    .iram+
+
+[sections:dram]
+entries:
+    .dram+
+
+[scheme:default]
+entries:
+    text -> flash_text
+    rodata -> flash_rodata
+    data -> dram0_data
+    bss -> dram0_bss
+    common -> dram0_bss
+    iram -> iram0_text
+    dram -> dram0_data
+    rtc_text -> rtc_text
+    rtc_data -> rtc_data
+    rtc_rodata -> rtc_data
+    rtc_bss -> rtc_bss
+
+[scheme:rtc]
+entries:
+    text -> rtc_text
+    data -> rtc_data
+    rodata -> rtc_data
+    bss -> rtc_bss
+    common -> rtc_bss
+
+[scheme:noflash]
+entries:
+    text -> iram0_text
+    rodata -> dram0_data
+
+[scheme:noflash_text]
+entries:
+    text -> iram0_text
+
+[scheme:noflash_data]
+entries:
+    rodata -> dram0_data
\ No newline at end of file
diff --git a/tools/ldgen/test/data/sdkconfig b/tools/ldgen/test/data/sdkconfig
new file mode 100644
index 00000000..b9e025fa
--- /dev/null
+++ b/tools/ldgen/test/data/sdkconfig
@@ -0,0 +1,8 @@
+CONFIG_TEST_STRING="This Is~AString#$^#$&^(*&^#(*&^)(*@_)(#*_)(*_(*}Value"
+CONFIG_TEST_NON_STRING=y
+CONFIG_TEST_WHITESPACE=      y
+CONFIG_TEST_EMPTY=
+CONFIG_TEST_POSITIVE_INT=110
+CONFIG_TEST_HEX_INT=0x8000
+CONFIG_TEST_NEGATIVE_INT=-9
+CONFIG_PERFORMANCE_LEVEL=0
\ No newline at end of file
diff --git a/tools/ldgen/test/data/sections.info b/tools/ldgen/test/data/sections.info
new file mode 100644
index 00000000..db450cfb
--- /dev/null
+++ b/tools/ldgen/test/data/sections.info
@@ -0,0 +1,1626 @@
+In archive libfreertos.a:
+
+FreeRTOS-openocd.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .text         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  2 .bss          00000000  00000000  00000000  00000034  2**0
+                  ALLOC
+  3 .dram1        00000004  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+  4 .debug_info   0000008f  00000000  00000000  00000038  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  5 .debug_abbrev 0000003e  00000000  00000000  000000c7  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  6 .debug_aranges 00000018  00000000  00000000  00000105  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_line   0000005e  00000000  00000000  0000011d  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_str    0000018d  00000000  00000000  0000017b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  9 .comment      0000003b  00000000  00000000  00000308  2**0
+                  CONTENTS, READONLY
+ 10 .xtensa.info  00000038  00000000  00000000  00000343  2**0
+                  CONTENTS, READONLY
+ 11 .xt.prop      0000000c  00000000  00000000  0000037b  2**0
+                  CONTENTS, RELOC, READONLY
+
+croutine.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvCheckPendingReadyList 00000018  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvCheckDelayedList 0000002c  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xCoRoutineCreate 0000001c  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.vCoRoutineAddToDelayedList 00000020  00000000  00000000  00000094  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.vCoRoutineSchedule 00000014  00000000  00000000  000000b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xCoRoutineRemoveFromEventList 00000010  00000000  00000000  000000c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .text         00000000  00000000  00000000  000000d8  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  7 .data         00000000  00000000  00000000  000000d8  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  8 .bss          00000000  00000000  00000000  000000d8  2**0
+                  ALLOC
+  9 .text.prvCheckPendingReadyList 00000056  00000000  00000000  000000d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .text.prvCheckDelayedList 000000ac  00000000  00000000  00000130  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .rodata.str1.4 00000074  00000000  00000000  000001dc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 12 .text.xCoRoutineCreate 00000028  00000000  00000000  00000250  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .text.vCoRoutineAddToDelayedList 00000056  00000000  00000000  00000278  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .text.vCoRoutineSchedule 0000007a  00000000  00000000  000002d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .text.xCoRoutineRemoveFromEventList 00000031  00000000  00000000  0000034c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .rodata.__FUNCTION__$5025 00000011  00000000  00000000  00000380  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 17 .bss.xPassedTicks 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 18 .bss.xLastTickCount 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 19 .bss.xCoRoutineTickCount 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 20 .bss.uxTopCoRoutineReadyPriority 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 21 .bss.pxCurrentCoRoutine 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 22 .bss.xPendingReadyCoRoutineList 00000014  00000000  00000000  00000394  2**2
+                  ALLOC
+ 23 .bss.pxOverflowDelayedCoRoutineList 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 24 .bss.pxDelayedCoRoutineList 00000004  00000000  00000000  00000394  2**2
+                  ALLOC
+ 25 .bss.pxReadyCoRoutineLists 00000028  00000000  00000000  00000394  2**2
+                  ALLOC
+ 26 .debug_frame  000000a0  00000000  00000000  00000394  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 27 .debug_info   000006b8  00000000  00000000  00000434  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 28 .debug_abbrev 00000233  00000000  00000000  00000aec  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 29 .debug_loc    0000013b  00000000  00000000  00000d1f  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 30 .debug_aranges 00000048  00000000  00000000  00000e5a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 31 .debug_ranges 00000038  00000000  00000000  00000ea2  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 32 .debug_line   0000037e  00000000  00000000  00000eda  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 33 .debug_str    00000533  00000000  00000000  00001258  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 34 .comment      0000003b  00000000  00000000  0000178b  2**0
+                  CONTENTS, READONLY
+ 35 .xtensa.info  00000038  00000000  00000000  000017c6  2**0
+                  CONTENTS, READONLY
+ 36 .xt.lit       00000030  00000000  00000000  000017fe  2**0
+                  CONTENTS, RELOC, READONLY
+ 37 .xt.prop      00000270  00000000  00000000  0000182e  2**0
+                  CONTENTS, RELOC, READONLY
+
+event_groups.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.xEventGroupCreate 0000000c  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xEventGroupWaitBits 0000006c  00000000  00000000  00000040  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xEventGroupClearBits 00000028  00000000  00000000  000000ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.xEventGroupGetBitsFromISR 00000004  00000000  00000000  000000d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.xEventGroupSetBits 0000003c  00000000  00000000  000000d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xEventGroupSync 0000005c  00000000  00000000  00000114  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.vEventGroupDelete 00000030  00000000  00000000  00000170  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.vEventGroupSetBitsCallback 00000004  00000000  00000000  000001a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.vEventGroupClearBitsCallback 00000004  00000000  00000000  000001a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .text         00000000  00000000  00000000  000001a8  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 10 .data         00000000  00000000  00000000  000001a8  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 11 .bss          00000000  00000000  00000000  000001a8  2**0
+                  ALLOC
+ 12 .text.prvTestWaitCondition 0000001e  00000000  00000000  000001a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .text.xEventGroupCreate 00000027  00000000  00000000  000001c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .rodata.str1.4 00000058  00000000  00000000  000001f0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 15 .text.xEventGroupWaitBits 00000140  00000000  00000000  00000248  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .text.xEventGroupClearBits 00000060  00000000  00000000  00000388  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .text.xEventGroupGetBitsFromISR 00000010  00000000  00000000  000003e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .text.xEventGroupSetBits 000000c3  00000000  00000000  000003f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .text.xEventGroupSync 00000108  00000000  00000000  000004bc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .text.vEventGroupDelete 0000005d  00000000  00000000  000005c4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .text.vEventGroupSetBitsCallback 0000000f  00000000  00000000  00000624  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .text.vEventGroupClearBitsCallback 0000000f  00000000  00000000  00000634  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .rodata.__FUNCTION__$5129 00000012  00000000  00000000  00000644  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 24 .rodata.__FUNCTION__$5120 00000013  00000000  00000000  00000658  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 25 .rodata.__FUNCTION__$5100 00000015  00000000  00000000  0000066c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 26 .rodata.__FUNCTION__$5092 00000014  00000000  00000000  00000684  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 27 .rodata.__FUNCTION__$5078 00000010  00000000  00000000  00000698  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 28 .debug_frame  00000100  00000000  00000000  000006a8  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 29 .debug_info   00000e02  00000000  00000000  000007a8  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 30 .debug_abbrev 00000236  00000000  00000000  000015aa  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 31 .debug_loc    00000546  00000000  00000000  000017e0  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 32 .debug_aranges 00000068  00000000  00000000  00001d26  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 33 .debug_ranges 00000070  00000000  00000000  00001d8e  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 34 .debug_line   000006af  00000000  00000000  00001dfe  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 35 .debug_str    00000677  00000000  00000000  000024ad  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 36 .comment      0000003b  00000000  00000000  00002b24  2**0
+                  CONTENTS, READONLY
+ 37 .xtensa.info  00000038  00000000  00000000  00002b5f  2**0
+                  CONTENTS, READONLY
+ 38 .xt.lit       00000048  00000000  00000000  00002b97  2**0
+                  CONTENTS, RELOC, READONLY
+ 39 .xt.prop      00000468  00000000  00000000  00002bdf  2**0
+                  CONTENTS, RELOC, READONLY
+
+list.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .text         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         00000000  00000000  00000000  00000034  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  2 .bss          00000000  00000000  00000000  00000034  2**0
+                  ALLOC
+  3 .text.vListInitialise 00000015  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  4 .text.vListInitialiseItem 00000009  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  5 .text.vListInsertEnd 0000001b  00000000  00000000  00000058  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  6 .text.vListInsert 0000002f  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .text.uxListRemove 00000026  00000000  00000000  000000a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .debug_frame  00000088  00000000  00000000  000000cc  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .debug_info   000002a1  00000000  00000000  00000154  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 10 .debug_abbrev 000000dc  00000000  00000000  000003f5  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 11 .debug_loc    00000081  00000000  00000000  000004d1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_aranges 00000040  00000000  00000000  00000552  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 13 .debug_ranges 00000030  00000000  00000000  00000592  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_line   0000024c  00000000  00000000  000005c2  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 15 .debug_str    000002c2  00000000  00000000  0000080e  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 16 .comment      0000003b  00000000  00000000  00000ad0  2**0
+                  CONTENTS, READONLY
+ 17 .xtensa.info  00000038  00000000  00000000  00000b0b  2**0
+                  CONTENTS, READONLY
+ 18 .xt.prop      000000f0  00000000  00000000  00000b43  2**0
+                  CONTENTS, RELOC, READONLY
+
+port.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.pxPortInitialiseStack 00000018  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xPortStartScheduler 00000014  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xPortSysTickHandler 00000008  00000000  00000000  00000060  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.vPortYieldOtherCore 00000004  00000000  00000000  00000068  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.vPortReleaseTaskMPUSettings 00000004  00000000  00000000  0000006c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xPortInIsrContext 00000008  00000000  00000000  00000070  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .iram1.literal 00000004  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.vPortAssertIfInISR 00000018  00000000  00000000  0000007c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.vPortCPUInitializeMutex 00000004  00000000  00000000  00000094  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  9 .literal.vPortCPUAcquireMutex 00000030  00000000  00000000  00000098  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.vPortCPUAcquireMutexTimeout 00000030  00000000  00000000  000000c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.vPortCPUReleaseMutex 00000028  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.vPortSetStackWatchpoint 00000008  00000000  00000000  00000120  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .text         00000000  00000000  00000000  00000128  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 14 .data         00000000  00000000  00000000  00000128  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 15 .bss          00000000  00000000  00000000  00000128  2**0
+                  ALLOC
+ 16 .text.pxPortInitialiseStack 00000086  00000000  00000000  00000128  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .text.vPortEndScheduler 00000005  00000000  00000000  000001b0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 18 .text.xPortStartScheduler 0000002e  00000000  00000000  000001b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .text.xPortSysTickHandler 00000016  00000000  00000000  000001e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .text.vPortYieldOtherCore 0000000e  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .text.vPortStoreTaskMPUSettings 00000013  00000000  00000000  00000210  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 22 .text.vPortReleaseTaskMPUSettings 0000000e  00000000  00000000  00000224  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .text.xPortInIsrContext 00000026  00000000  00000000  00000234  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .iram1        0000001a  00000000  00000000  0000025c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .rodata.str1.4 0000013b  00000000  00000000  00000278  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 26 .text.vPortAssertIfInISR 00000025  00000000  00000000  000003b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .text.vPortCPUInitializeMutex 0000000e  00000000  00000000  000003dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .text.vPortCPUAcquireMutex 00000088  00000000  00000000  000003ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .text.vPortCPUAcquireMutexTimeout 000000ab  00000000  00000000  00000474  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .text.vPortCPUReleaseMutex 00000061  00000000  00000000  00000520  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .text.vPortSetStackWatchpoint 0000001a  00000000  00000000  00000584  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .text.xPortGetTickRateHz 00000008  00000000  00000000  000005a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 33 .rodata.__func__$5264 00000029  00000000  00000000  000005a8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 34 .rodata.__func__$5259 00000029  00000000  00000000  000005d4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 35 .rodata.__FUNCTION__$5243 00000013  00000000  00000000  00000600  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 36 .bss.port_interruptNesting 00000008  00000000  00000000  00000614  2**2
+                  ALLOC
+ 37 .bss.port_xSchedulerRunning 00000008  00000000  00000000  00000614  2**2
+                  ALLOC
+ 38 .debug_frame  00000190  00000000  00000000  00000614  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 39 .debug_info   00000e78  00000000  00000000  000007a4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 40 .debug_abbrev 00000404  00000000  00000000  0000161c  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 41 .debug_loc    000005f1  00000000  00000000  00001a20  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 42 .debug_aranges 00000098  00000000  00000000  00002011  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 43 .debug_ranges 000000a0  00000000  00000000  000020a9  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 44 .debug_line   000005fb  00000000  00000000  00002149  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 45 .debug_str    0000071f  00000000  00000000  00002744  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 46 .comment      0000003b  00000000  00000000  00002e63  2**0
+                  CONTENTS, READONLY
+ 47 .xtensa.info  00000038  00000000  00000000  00002e9e  2**0
+                  CONTENTS, READONLY
+ 48 .xt.lit       00000068  00000000  00000000  00002ed6  2**0
+                  CONTENTS, RELOC, READONLY
+ 49 .xt.prop      00000408  00000000  00000000  00002f3e  2**0
+                  CONTENTS, RELOC, READONLY
+
+portasm.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal      00000074  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .text         000001e0  00000000  00000000  000000a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .data         00000c0c  00000000  00000000  00000290  2**4
+                  CONTENTS, ALLOC, LOAD, DATA
+  3 .bss          00000000  00000000  00000000  00000e9c  2**0
+                  ALLOC
+  4 .xtensa.info  00000038  00000000  00000000  00000e9c  2**0
+                  CONTENTS, READONLY
+  5 .debug_line   00000432  00000000  00000000  00000ed4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  6 .debug_info   00000093  00000000  00000000  00001306  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_abbrev 00000014  00000000  00000000  00001399  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_aranges 00000020  00000000  00000000  000013b0  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .xt.lit       00000008  00000000  00000000  000013d0  2**0
+                  CONTENTS, RELOC, READONLY
+ 10 .xt.prop      00000168  00000000  00000000  000013d8  2**0
+                  CONTENTS, RELOC, READONLY
+
+queue.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvIsQueueFull 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvCopyDataToQueue 0000000c  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.prvNotifyQueueSetContainer 0000002c  00000000  00000000  00000048  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.prvCopyDataFromQueue 00000004  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.xQueueGenericReset 00000030  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.prvInitialiseNewQueue 00000004  00000000  00000000  000000a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.xQueueGenericCreate 0000001c  00000000  00000000  000000ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.xQueueGetMutexHolder 00000008  00000000  00000000  000000c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.xQueueCreateCountingSemaphore 00000028  00000000  00000000  000000d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.xQueueGenericSend 0000007c  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.prvInitialiseMutex 00000008  00000000  00000000  00000174  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.xQueueCreateMutex 00000008  00000000  00000000  0000017c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.xQueueGiveMutexRecursive 0000001c  00000000  00000000  00000184  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xQueueGenericSendFromISR 0000003c  00000000  00000000  000001a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.xQueueGiveFromISR 00000030  00000000  00000000  000001dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.xQueueGenericReceive 00000078  00000000  00000000  0000020c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.xQueueTakeMutexRecursive 0000001c  00000000  00000000  00000284  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.xQueueReceiveFromISR 00000030  00000000  00000000  000002a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xQueuePeekFromISR 00000034  00000000  00000000  000002d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .literal.uxQueueMessagesWaiting 0000001c  00000000  00000000  00000304  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .literal.uxQueueSpacesAvailable 0000001c  00000000  00000000  00000320  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .literal.uxQueueMessagesWaitingFromISR 0000001c  00000000  00000000  0000033c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .literal.vQueueDelete 00000018  00000000  00000000  00000358  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .literal.xQueueIsQueueEmptyFromISR 0000001c  00000000  00000000  00000370  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .literal.xQueueIsQueueFullFromISR 0000001c  00000000  00000000  0000038c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .literal.vQueueWaitForMessageRestricted 0000000c  00000000  00000000  000003a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .literal.xQueueCreateSet 00000004  00000000  00000000  000003b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .literal.xQueueSelectFromSet 00000004  00000000  00000000  000003b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .literal.xQueueSelectFromSetFromISR 00000004  00000000  00000000  000003bc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .text         00000000  00000000  00000000  000003c0  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 30 .data         00000000  00000000  00000000  000003c0  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 31 .bss          00000000  00000000  00000000  000003c0  2**0
+                  ALLOC
+ 32 .text.prvIsQueueEmpty 00000012  00000000  00000000  000003c0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .text.prvIsQueueFull 0000002a  00000000  00000000  000003d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .text.prvCopyDataToQueue 0000009e  00000000  00000000  00000400  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 35 .rodata.str1.4 00000050  00000000  00000000  000004a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 36 .text.prvNotifyQueueSetContainer 00000076  00000000  00000000  000004f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .text.prvCopyDataFromQueue 00000024  00000000  00000000  00000568  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .text.xQueueGenericReset 00000096  00000000  00000000  0000058c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .text.prvInitialiseNewQueue 00000023  00000000  00000000  00000624  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 40 .text.xQueueGenericCreate 0000004d  00000000  00000000  00000648  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .text.xQueueGetMutexHolder 00000023  00000000  00000000  00000698  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 42 .text.xQueueCreateCountingSemaphore 0000006a  00000000  00000000  000006bc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .text.xQueueGenericSend 0000018c  00000000  00000000  00000728  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .text.prvInitialiseMutex 00000026  00000000  00000000  000008b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .text.xQueueCreateMutex 0000001a  00000000  00000000  000008dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 46 .text.xQueueGiveMutexRecursive 0000004c  00000000  00000000  000008f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 47 .text.xQueueGenericSendFromISR 000000e6  00000000  00000000  00000944  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 48 .text.xQueueGiveFromISR 000000c2  00000000  00000000  00000a2c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 49 .text.xQueueGenericReceive 00000178  00000000  00000000  00000af0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 50 .text.xQueueTakeMutexRecursive 00000051  00000000  00000000  00000c68  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 51 .text.xQueueReceiveFromISR 000000a6  00000000  00000000  00000cbc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 52 .text.xQueuePeekFromISR 00000098  00000000  00000000  00000d64  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 53 .text.uxQueueMessagesWaiting 00000038  00000000  00000000  00000dfc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 54 .text.uxQueueSpacesAvailable 0000003e  00000000  00000000  00000e34  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 55 .text.uxQueueMessagesWaitingFromISR 00000038  00000000  00000000  00000e74  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 56 .text.vQueueDelete 00000028  00000000  00000000  00000eac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 57 .text.xQueueIsQueueEmptyFromISR 00000042  00000000  00000000  00000ed4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 58 .text.xQueueIsQueueFullFromISR 00000044  00000000  00000000  00000f18  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 59 .text.vQueueWaitForMessageRestricted 0000002a  00000000  00000000  00000f5c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 60 .text.xQueueCreateSet 00000014  00000000  00000000  00000f88  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 61 .text.xQueueAddToSet 0000001e  00000000  00000000  00000f9c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 62 .text.xQueueRemoveFromSet 00000020  00000000  00000000  00000fbc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 63 .text.xQueueSelectFromSet 00000018  00000000  00000000  00000fdc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 64 .text.xQueueSelectFromSetFromISR 00000015  00000000  00000000  00000ff4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 65 .rodata.__FUNCTION__$5459 00000019  00000000  00000000  0000100c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 66 .rodata.__FUNCTION__$5449 0000001a  00000000  00000000  00001028  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 67 .rodata.__FUNCTION__$5429 0000000d  00000000  00000000  00001044  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 68 .rodata.__FUNCTION__$5424 0000001e  00000000  00000000  00001054  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 69 .rodata.__FUNCTION__$5418 00000017  00000000  00000000  00001074  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 70 .rodata.__FUNCTION__$5412 00000017  00000000  00000000  0000108c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 71 .rodata.__FUNCTION__$5406 00000012  00000000  00000000  000010a4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 72 .rodata.__FUNCTION__$5397 00000015  00000000  00000000  000010b8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 73 .rodata.__FUNCTION__$5387 00000015  00000000  00000000  000010d0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 74 .rodata.__FUNCTION__$5376 00000012  00000000  00000000  000010e8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 75 .rodata.__FUNCTION__$5368 00000019  00000000  00000000  000010fc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 76 .rodata.__FUNCTION__$5495 0000001b  00000000  00000000  00001118  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 77 .rodata.__FUNCTION__$5357 00000012  00000000  00000000  00001134  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 78 .rodata.__FUNCTION__$5346 0000001e  00000000  00000000  00001148  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 79 .rodata.__FUNCTION__$5340 00000019  00000000  00000000  00001168  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 80 .rodata.__FUNCTION__$5333 00000019  00000000  00000000  00001184  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 81 .rodata.__FUNCTION__$5306 00000014  00000000  00000000  000011a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 82 .rodata.__FUNCTION__$5297 00000013  00000000  00000000  000011b4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 83 .debug_frame  00000310  00000000  00000000  000011c8  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 84 .debug_info   0000226e  00000000  00000000  000014d8  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 85 .debug_abbrev 00000247  00000000  00000000  00003746  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 86 .debug_loc    000010f0  00000000  00000000  0000398d  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 87 .debug_aranges 00000118  00000000  00000000  00004a7d  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 88 .debug_ranges 00000108  00000000  00000000  00004b95  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 89 .debug_line   00000e69  00000000  00000000  00004c9d  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 90 .debug_str    000009f1  00000000  00000000  00005b06  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 91 .comment      0000003b  00000000  00000000  000064f7  2**0
+                  CONTENTS, READONLY
+ 92 .xtensa.info  00000038  00000000  00000000  00006532  2**0
+                  CONTENTS, READONLY
+ 93 .xt.lit       000000e8  00000000  00000000  0000656a  2**0
+                  CONTENTS, RELOC, READONLY
+ 94 .xt.prop      00000e10  00000000  00000000  00006652  2**0
+                  CONTENTS, RELOC, READONLY
+
+ringbuf.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.returnItemToRingbufBytebuf 0000001c  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.returnItemToRingbufDefault 00000044  00000000  00000000  00000050  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.getItemFromRingbufDefault 00000024  00000000  00000000  00000094  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.copyItemToRingbufNoSplit 00000024  00000000  00000000  000000b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.copyItemToRingbufByteBuf 00000008  00000000  00000000  000000dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.copyItemToRingbufAllowSplit 00000034  00000000  00000000  000000e4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.xRingbufferReceiveGeneric 00000020  00000000  00000000  00000118  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.xRingbufferPrintInfo 00000020  00000000  00000000  00000138  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.xRingbufferGetCurFreeSize 0000001c  00000000  00000000  00000158  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.xRingbufferCreate 00000064  00000000  00000000  00000174  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.xRingbufferCreateNoSplit 00000004  00000000  00000000  000001d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.vRingbufferDelete 00000010  00000000  00000000  000001dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.xRingbufferGetMaxItemSize 00000014  00000000  00000000  000001ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xRingbufferIsNextItemWrapped 00000014  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.xRingbufferSend 0000003c  00000000  00000000  00000214  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.xRingbufferSendFromISR 00000024  00000000  00000000  00000250  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.xRingbufferReceive 00000004  00000000  00000000  00000274  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.xRingbufferReceiveFromISR 0000001c  00000000  00000000  00000278  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xRingbufferReceiveUpTo 00000020  00000000  00000000  00000294  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .literal.xRingbufferReceiveUpToFromISR 00000024  00000000  00000000  000002b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .literal.vRingbufferReturnItem 0000000c  00000000  00000000  000002d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .literal.vRingbufferReturnItemFromISR 0000000c  00000000  00000000  000002e4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .literal.xRingbufferAddToQueueSetRead 00000018  00000000  00000000  000002f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .literal.xRingbufferAddToQueueSetWrite 00000018  00000000  00000000  00000308  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .literal.xRingbufferRemoveFromQueueSetRead 00000018  00000000  00000000  00000320  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .literal.xRingbufferRemoveFromQueueSetWrite 00000018  00000000  00000000  00000338  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .text         00000000  00000000  00000000  00000350  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 27 .data         00000000  00000000  00000000  00000350  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 28 .bss          00000000  00000000  00000000  00000350  2**0
+                  ALLOC
+ 29 .text.ringbufferFreeMem 00000015  00000000  00000000  00000350  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .text.getItemFromRingbufByteBuf 00000056  00000000  00000000  00000368  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .text.getCurFreeSizeByteBuf 00000015  00000000  00000000  000003c0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .text.getCurFreeSizeAllowSplit 00000030  00000000  00000000  000003d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .text.getCurFreeSizeNoSplit 00000024  00000000  00000000  00000408  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .rodata.str1.4 00000083  00000000  00000000  0000042c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 35 .text.returnItemToRingbufBytebuf 00000045  00000000  00000000  000004b0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 36 .text.returnItemToRingbufDefault 00000136  00000000  00000000  000004f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .text.getItemFromRingbufDefault 000000a5  00000000  00000000  00000630  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .text.copyItemToRingbufNoSplit 000000b0  00000000  00000000  000006d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .text.copyItemToRingbufByteBuf 00000046  00000000  00000000  00000788  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 40 .text.copyItemToRingbufAllowSplit 00000124  00000000  00000000  000007d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .text.xRingbufferReceiveGeneric 00000070  00000000  00000000  000008f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 42 .text.xRingbufferPrintInfo 00000046  00000000  00000000  00000964  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .text.xRingbufferGetCurFreeSize 00000043  00000000  00000000  000009ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .text.xRingbufferCreate 00000118  00000000  00000000  000009f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .text.xRingbufferCreateNoSplit 0000001c  00000000  00000000  00000b08  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 46 .text.vRingbufferDelete 0000002c  00000000  00000000  00000b24  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 47 .text.xRingbufferGetMaxItemSize 00000022  00000000  00000000  00000b50  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 48 .text.xRingbufferIsNextItemWrapped 00000030  00000000  00000000  00000b74  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 49 .text.xRingbufferSend 000000d4  00000000  00000000  00000ba4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 50 .text.xRingbufferSendFromISR 00000062  00000000  00000000  00000c78  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 51 .text.xRingbufferReceive 00000015  00000000  00000000  00000cdc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 52 .text.xRingbufferReceiveFromISR 00000040  00000000  00000000  00000cf4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 53 .text.xRingbufferReceiveUpTo 00000054  00000000  00000000  00000d34  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 54 .text.xRingbufferReceiveUpToFromISR 00000064  00000000  00000000  00000d88  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 55 .text.vRingbufferReturnItem 00000030  00000000  00000000  00000dec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 56 .text.vRingbufferReturnItemFromISR 0000002c  00000000  00000000  00000e1c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 57 .text.xRingbufferAddToQueueSetRead 0000002c  00000000  00000000  00000e48  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 58 .text.xRingbufferAddToQueueSetWrite 0000002c  00000000  00000000  00000e74  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 59 .text.xRingbufferRemoveFromQueueSetRead 0000002c  00000000  00000000  00000ea0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 60 .text.xRingbufferRemoveFromQueueSetWrite 0000002c  00000000  00000000  00000ecc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 61 .rodata.__FUNCTION__$5577 00000023  00000000  00000000  00000ef8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 62 .rodata.__FUNCTION__$5571 00000022  00000000  00000000  00000f1c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 63 .rodata.__FUNCTION__$5565 0000001e  00000000  00000000  00000f40  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 64 .rodata.__FUNCTION__$5559 0000001d  00000000  00000000  00000f60  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 65 .rodata.__FUNCTION__$5542 0000001e  00000000  00000000  00000f80  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 66 .rodata.__FUNCTION__$5534 00000017  00000000  00000000  00000fa0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 67 .rodata.__FUNCTION__$5527 0000001a  00000000  00000000  00000fb8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 68 .rodata.__FUNCTION__$5508 0000001a  00000000  00000000  00000fd4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 69 .rodata.__FUNCTION__$5497 00000017  00000000  00000000  00000ff0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 70 .rodata.__FUNCTION__$5482 00000010  00000000  00000000  00001008  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 71 .rodata.__FUNCTION__$5469 0000001d  00000000  00000000  00001018  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 72 .rodata.__FUNCTION__$5464 0000001a  00000000  00000000  00001038  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 73 .rodata.__FUNCTION__$5379 0000001c  00000000  00000000  00001054  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 74 .rodata.__FUNCTION__$5395 0000001a  00000000  00000000  00001070  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 75 .rodata.__FUNCTION__$5408 0000001b  00000000  00000000  0000108c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 76 .rodata.__FUNCTION__$5418 0000001b  00000000  00000000  000010a8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 77 .rodata.__FUNCTION__$5369 00000019  00000000  00000000  000010c4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 78 .rodata.__FUNCTION__$5450 00000012  00000000  00000000  000010e0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 79 .rodata.__FUNCTION__$5428 0000001a  00000000  00000000  000010f4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 80 .rodata.__FUNCTION__$5423 00000015  00000000  00000000  00001110  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 81 .debug_frame  000002f8  00000000  00000000  00001128  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 82 .debug_info   00001dc4  00000000  00000000  00001420  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 83 .debug_abbrev 000002c9  00000000  00000000  000031e4  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 84 .debug_loc    00000df4  00000000  00000000  000034ad  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 85 .debug_aranges 00000110  00000000  00000000  000042a1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 86 .debug_ranges 00000130  00000000  00000000  000043b1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 87 .debug_line   00000ce4  00000000  00000000  000044e1  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 88 .debug_str    000008b1  00000000  00000000  000051c5  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 89 .comment      0000003b  00000000  00000000  00005a76  2**0
+                  CONTENTS, READONLY
+ 90 .xtensa.info  00000038  00000000  00000000  00005ab1  2**0
+                  CONTENTS, READONLY
+ 91 .xt.lit       000000d0  00000000  00000000  00005ae9  2**0
+                  CONTENTS, RELOC, READONLY
+ 92 .xt.prop      00000bb8  00000000  00000000  00005bb9  2**0
+                  CONTENTS, RELOC, READONLY
+
+tasks.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvResetNextTaskUnblockTime 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvTaskGetSnapshotsFromList 00000004  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.prvDeleteTLS 00000018  00000000  00000000  00000040  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.prvTaskIsTaskSuspended 0000001c  00000000  00000000  00000058  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.prvInitialiseNewTask 00000018  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.prvInitialiseTaskLists 00000040  00000000  00000000  0000008c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.prvDeleteTCB 0000002c  00000000  00000000  000000cc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.prvAddCurrentTaskToDelayedList 0000001c  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.taskYIELD_OTHER_CORE 00000010  00000000  00000000  00000114  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.vTaskEndScheduler 00000008  00000000  00000000  00000124  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.vTaskSuspendAll 00000008  00000000  00000000  0000012c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.uxTaskGetNumberOfTasks 00000004  00000000  00000000  00000134  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.xTaskGetIdleTaskHandle 0000001c  00000000  00000000  00000138  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xTaskGetIdleTaskHandleForCPU 0000001c  00000000  00000000  00000154  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.vTaskSwitchContext 0000003c  00000000  00000000  00000170  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.vTaskSetTimeOutState 00000020  00000000  00000000  000001ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.vTaskMissedYield 00000004  00000000  00000000  000001cc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.vTaskAllocateMPURegions 00000020  00000000  00000000  000001d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xTaskGetCurrentTaskHandle 00000008  00000000  00000000  000001f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .literal.__getreent 00000008  00000000  00000000  000001f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .literal.pcTaskGetTaskName 0000001c  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .literal.pvTaskGetThreadLocalStoragePointer 00000004  00000000  00000000  0000021c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .literal.xTaskGetAffinity 00000004  00000000  00000000  00000220  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .literal.uxTaskGetStackHighWaterMark 00000008  00000000  00000000  00000224  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .literal.pxTaskGetStackStart 00000004  00000000  00000000  0000022c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .literal.xTaskGetCurrentTaskHandleForCPU 00000004  00000000  00000000  00000230  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .literal.xTaskGetSchedulerState 0000000c  00000000  00000000  00000234  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .literal.vTaskEnterCritical 00000034  00000000  00000000  00000240  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .literal.vTaskExitCritical 00000030  00000000  00000000  00000274  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .literal.prvAddNewTaskToReadyList 00000058  00000000  00000000  000002a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .literal.xTaskCreateRestricted 00000028  00000000  00000000  000002fc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .literal.xTaskCreatePinnedToCore 00000018  00000000  00000000  00000324  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .literal.vTaskStartScheduler 00000038  00000000  00000000  0000033c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .literal.vTaskDelete 00000060  00000000  00000000  00000374  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .literal.vTaskDelayUntil 00000048  00000000  00000000  000003d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 35 .literal.vTaskDelay 00000038  00000000  00000000  0000041c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 36 .literal.eTaskGetState 00000038  00000000  00000000  00000454  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .literal.uxTaskPriorityGet 00000010  00000000  00000000  0000048c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .literal.uxTaskPriorityGetFromISR 00000010  00000000  00000000  0000049c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .literal.vTaskPrioritySet 00000044  00000000  00000000  000004ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 40 .literal.vTaskSuspend 00000060  00000000  00000000  000004f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .literal.vTaskResume 00000044  00000000  00000000  00000550  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 42 .literal.xTaskResumeFromISR 0000004c  00000000  00000000  00000594  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .literal.prvCheckTasksWaitingTermination 00000030  00000000  00000000  000005e0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .literal.prvIdleTask 00000008  00000000  00000000  00000610  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .literal.xTaskGetTickCount 00000010  00000000  00000000  00000618  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 46 .literal.xTaskGetTickCountFromISR 00000010  00000000  00000000  00000628  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 47 .literal.xTaskIncrementTick 00000078  00000000  00000000  00000638  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 48 .literal.xTaskResumeAll 0000005c  00000000  00000000  000006b0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 49 .literal.vTaskPlaceOnEventList 00000040  00000000  00000000  0000070c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 50 .literal.vTaskPlaceOnUnorderedEventList 00000054  00000000  00000000  0000074c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 51 .literal.vTaskPlaceOnEventListRestricted 00000038  00000000  00000000  000007a0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 52 .literal.xTaskRemoveFromEventList 00000058  00000000  00000000  000007d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 53 .literal.xTaskRemoveFromUnorderedEventList 0000005c  00000000  00000000  00000830  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 54 .literal.xTaskCheckForTimeOut 0000003c  00000000  00000000  0000088c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 55 .literal.vTaskSetThreadLocalStoragePointerAndDelCallback 00000010  00000000  00000000  000008c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 56 .literal.vTaskSetThreadLocalStoragePointer 00000004  00000000  00000000  000008d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 57 .literal.vTaskPriorityInherit 0000002c  00000000  00000000  000008dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 58 .literal.xTaskPriorityDisinherit 00000040  00000000  00000000  00000908  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 59 .literal.uxTaskResetEventItemValue 00000010  00000000  00000000  00000948  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 60 .literal.pvTaskIncrementMutexHeldCount 00000010  00000000  00000000  00000958  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 61 .literal.ulTaskNotifyTake 00000030  00000000  00000000  00000968  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 62 .literal.xTaskNotifyWait 00000030  00000000  00000000  00000998  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 63 .literal.xTaskNotify 00000050  00000000  00000000  000009c8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 64 .literal.xTaskNotifyFromISR 00000058  00000000  00000000  00000a18  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 65 .literal.vTaskNotifyGiveFromISR 00000058  00000000  00000000  00000a70  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 66 .literal.uxTaskGetSnapshotAll 00000030  00000000  00000000  00000ac8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 67 .text         00000000  00000000  00000000  00000af8  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 68 .data         00000000  00000000  00000000  00000af8  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 69 .bss          00000000  00000000  00000000  00000af8  2**0
+                  ALLOC
+ 70 .text.prvTaskCheckFreeStackSpace 00000019  00000000  00000000  00000af8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 71 .text.prvResetNextTaskUnblockTime 00000034  00000000  00000000  00000b14  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 72 .text.prvTaskGetSnapshot 00000036  00000000  00000000  00000b48  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 73 .text.prvTaskGetSnapshotsFromList 00000047  00000000  00000000  00000b80  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 74 .rodata.str1.4 00000161  00000000  00000000  00000bc8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 75 .text.prvDeleteTLS 00000040  00000000  00000000  00000d2c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 76 .text.prvTaskIsTaskSuspended 0000004e  00000000  00000000  00000d6c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 77 .text.prvInitialiseNewTask 000000d0  00000000  00000000  00000dbc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 78 .text.prvInitialiseTaskLists 0000006e  00000000  00000000  00000e8c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 79 .text.prvDeleteTCB 0000005d  00000000  00000000  00000efc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 80 .text.prvAddCurrentTaskToDelayedList 0000006a  00000000  00000000  00000f5c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 81 .text.taskYIELD_OTHER_CORE 00000053  00000000  00000000  00000fc8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 82 .text.vTaskEndScheduler 00000018  00000000  00000000  0000101c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 83 .text.vTaskSuspendAll 00000026  00000000  00000000  00001034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 84 .text.uxTaskGetNumberOfTasks 0000000d  00000000  00000000  0000105c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 85 .text.xTaskGetIdleTaskHandle 0000003b  00000000  00000000  0000106c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 86 .text.xTaskGetIdleTaskHandleForCPU 0000002e  00000000  00000000  000010a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 87 .text.vTaskSwitchContext 0000028a  00000000  00000000  000010d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 88 .text.vTaskSetTimeOutState 00000034  00000000  00000000  00001364  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 89 .text.vTaskMissedYield 00000018  00000000  00000000  00001398  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 90 .text.vTaskAllocateMPURegions 00000028  00000000  00000000  000013b0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 91 .text.xTaskGetCurrentTaskHandle 0000001f  00000000  00000000  000013d8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 92 .text.__getreent 00000019  00000000  00000000  000013f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 93 .text.pcTaskGetTaskName 0000002d  00000000  00000000  00001414  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 94 .text.pvTaskGetThreadLocalStoragePointer 0000001e  00000000  00000000  00001444  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 95 .text.xTaskGetAffinity 00000013  00000000  00000000  00001464  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 96 .text.uxTaskGetStackHighWaterMark 0000001a  00000000  00000000  00001478  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 97 .text.pxTaskGetStackStart 00000012  00000000  00000000  00001494  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 98 .text.xTaskGetCurrentTaskHandleForCPU 00000018  00000000  00000000  000014a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 99 .text.xTaskGetSchedulerState 00000037  00000000  00000000  000014c0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+100 .text.vTaskEnterCritical 000000b3  00000000  00000000  000014f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+101 .text.vTaskExitCritical 0000008a  00000000  00000000  000015ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+102 .text.prvAddNewTaskToReadyList 00000173  00000000  00000000  00001638  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+103 .text.xTaskCreateRestricted 00000074  00000000  00000000  000017ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+104 .text.xTaskCreatePinnedToCore 00000076  00000000  00000000  00001820  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+105 .text.vTaskStartScheduler 00000072  00000000  00000000  00001898  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+106 .text.vTaskDelete 00000122  00000000  00000000  0000190c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+107 .text.vTaskDelayUntil 000000e7  00000000  00000000  00001a30  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+108 .text.vTaskDelay 00000080  00000000  00000000  00001b18  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+109 .text.eTaskGetState 000000aa  00000000  00000000  00001b98  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+110 .text.uxTaskPriorityGet 00000023  00000000  00000000  00001c44  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+111 .text.uxTaskPriorityGetFromISR 00000023  00000000  00000000  00001c68  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+112 .text.vTaskPrioritySet 00000143  00000000  00000000  00001c8c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+113 .text.vTaskSuspend 00000106  00000000  00000000  00001dd0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+114 .text.vTaskResume 000000d8  00000000  00000000  00001ed8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+115 .text.xTaskResumeFromISR 000000f6  00000000  00000000  00001fb0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+116 .text.prvCheckTasksWaitingTermination 000000c6  00000000  00000000  000020a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+117 .text.prvIdleTask 00000012  00000000  00000000  00002170  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+118 .text.xTaskGetTickCount 00000020  00000000  00000000  00002184  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+119 .text.xTaskGetTickCountFromISR 00000020  00000000  00000000  000021a4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+120 .text.xTaskIncrementTick 000001ce  00000000  00000000  000021c4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+121 .text.xTaskResumeAll 00000186  00000000  00000000  00002394  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+122 .text.vTaskPlaceOnEventList 00000097  00000000  00000000  0000251c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+123 .text.vTaskPlaceOnUnorderedEventList 000000cf  00000000  00000000  000025b4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+124 .text.vTaskPlaceOnEventListRestricted 0000006f  00000000  00000000  00002684  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+125 .text.xTaskRemoveFromEventList 00000143  00000000  00000000  000026f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+126 .text.xTaskRemoveFromUnorderedEventList 000000ff  00000000  00000000  00002838  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+127 .text.xTaskCheckForTimeOut 00000096  00000000  00000000  00002938  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+128 .text.vTaskSetThreadLocalStoragePointerAndDelCallback 0000002f  00000000  00000000  000029d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+129 .text.vTaskSetThreadLocalStoragePointer 00000013  00000000  00000000  00002a00  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+130 .text.vTaskPriorityInherit 000000db  00000000  00000000  00002a14  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+131 .text.xTaskPriorityDisinherit 000000aa  00000000  00000000  00002af0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+132 .text.uxTaskResetEventItemValue 0000003e  00000000  00000000  00002b9c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+133 .text.pvTaskIncrementMutexHeldCount 00000054  00000000  00000000  00002bdc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+134 .text.ulTaskNotifyTake 0000012e  00000000  00000000  00002c30  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+135 .text.xTaskNotifyWait 00000156  00000000  00000000  00002d60  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+136 .text.xTaskNotify 0000014a  00000000  00000000  00002eb8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+137 .text.xTaskNotifyFromISR 00000172  00000000  00000000  00003004  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+138 .text.vTaskNotifyGiveFromISR 0000011c  00000000  00000000  00003178  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+139 .text.uxTaskGetSnapshotAll 0000009c  00000000  00000000  00003294  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+140 .rodata.__FUNCTION__$5930 00000017  00000000  00000000  00003330  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+141 .rodata.__FUNCTION__$5917 00000013  00000000  00000000  00003348  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+142 .rodata.__FUNCTION__$5901 0000000c  00000000  00000000  0000335c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+143 .rodata.__func__$5851 00000029  00000000  00000000  00003368  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+144 .rodata.__func__$5846 00000029  00000000  00000000  00003394  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+145 .rodata.__FUNCTION__$5808 00000018  00000000  00000000  000033c0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+146 .rodata.__FUNCTION__$5718 00000018  00000000  00000000  000033d8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+147 .rodata.__FUNCTION__$5683 00000015  00000000  00000000  000033f0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+148 .rodata.__FUNCTION__$5677 00000015  00000000  00000000  00003408  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+149 .rodata.__FUNCTION__$5673 00000022  00000000  00000000  00003420  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+150 .rodata.__FUNCTION__$5663 00000019  00000000  00000000  00003444  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+151 .rodata.__FUNCTION__$5654 00000020  00000000  00000000  00003460  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+152 .rodata.__FUNCTION__$5648 0000001f  00000000  00000000  00003480  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+153 .rodata.__FUNCTION__$5641 00000016  00000000  00000000  000034a0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+154 .rodata.ucExpectedStackBytes$5613 00000014  00000000  00000000  000034b8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+155 .rodata.__FUNCTION__$5605 00000013  00000000  00000000  000034cc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+156 .rodata.__FUNCTION__$5596 0000001d  00000000  00000000  000034e0  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+157 .rodata.__FUNCTION__$5591 00000017  00000000  00000000  00003500  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+158 .rodata.__FUNCTION__$5587 00000012  00000000  00000000  00003518  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+159 .rodata.__FUNCTION__$5565 0000000f  00000000  00000000  0000352c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+160 .rodata.__FUNCTION__$5547 00000014  00000000  00000000  0000353c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+161 .rodata.__FUNCTION__$5536 00000013  00000000  00000000  00003550  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+162 .rodata.__FUNCTION__$5525 00000017  00000000  00000000  00003564  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+163 .rodata.__FUNCTION__$5530 0000000c  00000000  00000000  0000357c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+164 .rodata.__FUNCTION__$5519 0000000d  00000000  00000000  00003588  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+165 .rodata.__FUNCTION__$5513 00000011  00000000  00000000  00003598  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+166 .rodata.__FUNCTION__$5494 0000000e  00000000  00000000  000035ac  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+167 .rodata.__FUNCTION__$5485 0000000b  00000000  00000000  000035bc  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+168 .rodata.__FUNCTION__$5478 00000010  00000000  00000000  000035c8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+169 .rodata.__FUNCTION__$5772 0000000d  00000000  00000000  000035d8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+170 .rodata.__FUNCTION__$5776 0000000d  00000000  00000000  000035e8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+171 .rodata.__FUNCTION__$5470 0000000c  00000000  00000000  000035f8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+172 .rodata.__FUNCTION__$5463 00000019  00000000  00000000  00003604  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+173 .rodata.__FUNCTION__$5421 00000016  00000000  00000000  00003620  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+174 .bss.xSwitchingContext 00000008  00000000  00000000  00003638  2**2
+                  ALLOC
+175 .data.xTickCountMutex 00000008  00000000  00000000  00003638  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+176 .data.xTaskQueueMutex 00000008  00000000  00000000  00003640  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+177 .bss.uxSchedulerSuspended 00000008  00000000  00000000  00003648  2**2
+                  ALLOC
+178 .data.xNextTaskUnblockTime 00000004  00000000  00000000  00003648  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+179 .bss.uxTaskNumber 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+180 .bss.xNumOfOverflows 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+181 .bss.xYieldPending 00000008  00000000  00000000  0000364c  2**2
+                  ALLOC
+182 .bss.uxPendedTicks 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+183 .bss.xSchedulerRunning 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+184 .bss.uxTopReadyPriority 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+185 .bss.xTickCount 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+186 .bss.uxCurrentNumberOfTasks 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+187 .bss.xIdleTaskHandle 00000008  00000000  00000000  0000364c  2**2
+                  ALLOC
+188 .bss.xSuspendedTaskList 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+189 .bss.uxTasksDeleted 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+190 .bss.xTasksWaitingTermination 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+191 .bss.xPendingReadyList 00000028  00000000  00000000  0000364c  2**2
+                  ALLOC
+192 .bss.pxOverflowDelayedTaskList 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+193 .bss.pxDelayedTaskList 00000004  00000000  00000000  0000364c  2**2
+                  ALLOC
+194 .bss.xDelayedTaskList2 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+195 .bss.xDelayedTaskList1 00000014  00000000  00000000  0000364c  2**2
+                  ALLOC
+196 .bss.pxReadyTasksLists 000001f4  00000000  00000000  0000364c  2**2
+                  ALLOC
+197 .bss.pxCurrentTCB 00000008  00000000  00000000  0000364c  2**2
+                  ALLOC
+198 .debug_frame  00000688  00000000  00000000  0000364c  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+199 .debug_info   00005e20  00000000  00000000  00003cd4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+200 .debug_abbrev 0000046f  00000000  00000000  00009af4  2**0
+                  CONTENTS, READONLY, DEBUGGING
+201 .debug_loc    000022ef  00000000  00000000  00009f63  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+202 .debug_aranges 00000240  00000000  00000000  0000c252  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+203 .debug_ranges 000002c8  00000000  00000000  0000c492  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+204 .debug_line   0000291c  00000000  00000000  0000c75a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+205 .debug_str    0000190d  00000000  00000000  0000f076  2**0
+                  CONTENTS, READONLY, DEBUGGING
+206 .comment      0000003b  00000000  00000000  00010983  2**0
+                  CONTENTS, READONLY
+207 .xtensa.info  00000038  00000000  00000000  000109be  2**0
+                  CONTENTS, READONLY
+208 .xt.lit       00000218  00000000  00000000  000109f6  2**0
+                  CONTENTS, RELOC, READONLY
+209 .xt.prop      00002154  00000000  00000000  00010c0e  2**0
+                  CONTENTS, RELOC, READONLY
+
+timers.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.prvGetNextExpireTime 00000004  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.prvInsertTimerInActiveList 00000010  00000000  00000000  00000038  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.prvCheckForValidListAndQueue 00000044  00000000  00000000  00000048  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .literal.prvInitialiseNewTimer 0000001c  00000000  00000000  0000008c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .literal.xTimerCreateTimerTask 0000002c  00000000  00000000  000000a8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .literal.xTimerCreate 00000008  00000000  00000000  000000d4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .literal.xTimerGenericCommand 00000014  00000000  00000000  000000dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .literal.prvSwitchTimerLists 00000028  00000000  00000000  000000f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .literal.prvSampleTimeNow 0000000c  00000000  00000000  00000118  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .literal.prvProcessExpiredTimer 00000024  00000000  00000000  00000124  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .literal.prvProcessTimerOrBlockTask 00000024  00000000  00000000  00000148  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 11 .literal.prvProcessReceivedCommands 00000040  00000000  00000000  0000016c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 12 .literal.prvTimerTask 0000000c  00000000  00000000  000001ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 13 .literal.xTimerGetPeriod 00000014  00000000  00000000  000001b8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .literal.xTimerGetExpiryTime 00000014  00000000  00000000  000001cc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 15 .literal.xTimerIsTimerActive 0000000c  00000000  00000000  000001e0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .literal.vTimerSetTimerID 00000014  00000000  00000000  000001ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .literal.xTimerPendFunctionCallFromISR 00000008  00000000  00000000  00000200  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .literal.xTimerPendFunctionCall 0000001c  00000000  00000000  00000208  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .text         00000000  00000000  00000000  00000224  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 20 .data         00000000  00000000  00000000  00000224  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+ 21 .bss          00000000  00000000  00000000  00000224  2**0
+                  ALLOC
+ 22 .text.prvGetNextExpireTime 00000020  00000000  00000000  00000224  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .text.prvInsertTimerInActiveList 00000054  00000000  00000000  00000244  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .rodata.str1.4 00000058  00000000  00000000  00000298  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 25 .text.prvCheckForValidListAndQueue 0000007e  00000000  00000000  000002f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 26 .text.prvInitialiseNewTimer 0000003a  00000000  00000000  00000370  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 27 .text.xTimerCreateTimerTask 0000004c  00000000  00000000  000003ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 28 .text.xTimerCreate 00000026  00000000  00000000  000003f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 29 .text.xTimerGenericCommand 0000005d  00000000  00000000  00000420  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 30 .text.prvSwitchTimerLists 00000082  00000000  00000000  00000480  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 31 .text.prvSampleTimeNow 0000002f  00000000  00000000  00000504  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 32 .text.prvProcessExpiredTimer 0000005f  00000000  00000000  00000534  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 33 .text.prvProcessTimerOrBlockTask 0000006c  00000000  00000000  00000594  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 34 .text.prvProcessReceivedCommands 000000e6  00000000  00000000  00000600  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 35 .rodata.prvProcessReceivedCommands 00000028  00000000  00000000  000006e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+ 36 .text.prvTimerTask 0000001d  00000000  00000000  00000710  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 37 .text.xTimerGetPeriod 00000022  00000000  00000000  00000730  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 38 .text.xTimerGetExpiryTime 00000022  00000000  00000000  00000754  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 39 .text.pcTimerGetTimerName 00000007  00000000  00000000  00000778  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 40 .text.xTimerIsTimerActive 00000024  00000000  00000000  00000780  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 41 .text.pvTimerGetTimerID 00000007  00000000  00000000  000007a4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 42 .text.vTimerSetTimerID 00000022  00000000  00000000  000007ac  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 43 .text.xTimerPendFunctionCallFromISR 00000022  00000000  00000000  000007d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 44 .text.xTimerPendFunctionCall 0000003c  00000000  00000000  000007f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 45 .rodata.__FUNCTION__$5352 00000017  00000000  00000000  00000830  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 46 .rodata.__FUNCTION__$5335 00000011  00000000  00000000  00000848  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 47 .rodata.__FUNCTION__$5240 00000014  00000000  00000000  0000085c  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 48 .rodata.__FUNCTION__$5234 00000010  00000000  00000000  00000870  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 49 .rodata.__FUNCTION__$5220 00000016  00000000  00000000  00000880  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 50 .rodata.__FUNCTION__$5320 0000001d  00000000  00000000  00000898  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 51 .rodata.__FUNCTION__$5289 0000001b  00000000  00000000  000008b8  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 52 .rodata.__FUNCTION__$5251 00000017  00000000  00000000  000008d4  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 53 .rodata.__FUNCTION__$5313 00000014  00000000  00000000  000008ec  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 54 .bss.xLastTime$5272 00000004  00000000  00000000  00000900  2**2
+                  ALLOC
+ 55 .rodata.__FUNCTION__$5203 00000016  00000000  00000000  00000900  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 56 .data.xTimerMux 00000008  00000000  00000000  00000918  2**2
+                  CONTENTS, ALLOC, LOAD, DATA
+ 57 .bss.xTimerQueue 00000004  00000000  00000000  00000920  2**2
+                  ALLOC
+ 58 .bss.pxOverflowTimerList 00000004  00000000  00000000  00000920  2**2
+                  ALLOC
+ 59 .bss.pxCurrentTimerList 00000004  00000000  00000000  00000920  2**2
+                  ALLOC
+ 60 .bss.xActiveTimerList2 00000014  00000000  00000000  00000920  2**2
+                  ALLOC
+ 61 .bss.xActiveTimerList1 00000014  00000000  00000000  00000920  2**2
+                  ALLOC
+ 62 .debug_frame  00000208  00000000  00000000  00000920  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 63 .debug_info   00001405  00000000  00000000  00000b28  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 64 .debug_abbrev 00000279  00000000  00000000  00001f2d  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 65 .debug_loc    0000062f  00000000  00000000  000021a6  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 66 .debug_aranges 000000c0  00000000  00000000  000027d5  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 67 .debug_ranges 000000b0  00000000  00000000  00002895  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 68 .debug_line   00000771  00000000  00000000  00002945  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 69 .debug_str    00000934  00000000  00000000  000030b6  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 70 .comment      0000003b  00000000  00000000  000039ea  2**0
+                  CONTENTS, READONLY
+ 71 .xtensa.info  00000038  00000000  00000000  00003a25  2**0
+                  CONTENTS, READONLY
+ 72 .xt.lit       00000098  00000000  00000000  00003a5d  2**0
+                  CONTENTS, RELOC, READONLY
+ 73 .xt.prop      00000714  00000000  00000000  00003af5  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_context.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal      00000024  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .text         0000013a  00000000  00000000  00000058  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .data         00000000  00000000  00000000  00000192  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  3 .bss          00000000  00000000  00000000  00000192  2**0
+                  ALLOC
+  4 .xtensa.info  00000038  00000000  00000000  00000192  2**0
+                  CONTENTS, READONLY
+  5 .debug_line   00000313  00000000  00000000  000001ca  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  6 .debug_info   0000009a  00000000  00000000  000004dd  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_abbrev 00000014  00000000  00000000  00000577  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_aranges 00000020  00000000  00000000  00000590  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .xt.lit       00000008  00000000  00000000  000005b0  2**0
+                  CONTENTS, RELOC, READONLY
+ 10 .xt.prop      000000e4  00000000  00000000  000005b8  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_init.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal._xt_tick_divisor_init 0000000c  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xt_clock_freq 00000004  00000000  00000000  00000040  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .text         00000000  00000000  00000000  00000044  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  3 .data         00000000  00000000  00000000  00000044  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  4 .bss          00000000  00000000  00000000  00000044  2**0
+                  ALLOC
+  5 .text._xt_tick_divisor_init 0000001f  00000000  00000000  00000044  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .text.xt_clock_freq 0000000d  00000000  00000000  00000064  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .bss._xt_tick_divisor 00000004  00000000  00000000  00000074  2**2
+                  ALLOC
+  8 .debug_frame  00000040  00000000  00000000  00000074  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  9 .debug_info   000000d4  00000000  00000000  000000b4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 10 .debug_abbrev 0000008b  00000000  00000000  00000188  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 11 .debug_aranges 00000028  00000000  00000000  00000213  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_ranges 00000018  00000000  00000000  0000023b  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 13 .debug_line   000000c8  00000000  00000000  00000253  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_str    00000180  00000000  00000000  0000031b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 15 .comment      0000003b  00000000  00000000  0000049b  2**0
+                  CONTENTS, READONLY
+ 16 .xtensa.info  00000038  00000000  00000000  000004d6  2**0
+                  CONTENTS, READONLY
+ 17 .xt.lit       00000010  00000000  00000000  0000050e  2**0
+                  CONTENTS, RELOC, READONLY
+ 18 .xt.prop      0000006c  00000000  00000000  0000051e  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_intr.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.xt_unhandled_interrupt 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xt_set_exception_handler 00000008  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xt_set_interrupt_handler 0000000c  00000000  00000000  00000044  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .text         00000000  00000000  00000000  00000050  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  4 .data         00000000  00000000  00000000  00000050  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  5 .bss          00000000  00000000  00000000  00000050  2**0
+                  ALLOC
+  6 .rodata.str1.4 00000023  00000000  00000000  00000050  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+  7 .text.xt_unhandled_interrupt 00000016  00000000  00000000  00000074  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .text.xt_set_exception_handler 00000042  00000000  00000000  0000008c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .text.xt_set_interrupt_handler 00000046  00000000  00000000  000000d0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .debug_frame  00000058  00000000  00000000  00000118  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 11 .debug_info   0000042d  00000000  00000000  00000170  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_abbrev 000001b6  00000000  00000000  0000059d  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 13 .debug_loc    0000015c  00000000  00000000  00000753  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_aranges 00000030  00000000  00000000  000008af  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 15 .debug_ranges 00000020  00000000  00000000  000008df  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 16 .debug_line   000002b8  00000000  00000000  000008ff  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 17 .debug_str    000002a5  00000000  00000000  00000bb7  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 18 .comment      0000003b  00000000  00000000  00000e5c  2**0
+                  CONTENTS, READONLY
+ 19 .xtensa.info  00000038  00000000  00000000  00000e97  2**0
+                  CONTENTS, READONLY
+ 20 .xt.lit       00000018  00000000  00000000  00000ecf  2**0
+                  CONTENTS, RELOC, READONLY
+ 21 .xt.prop      00000120  00000000  00000000  00000ee7  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_intr_asm.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .text         00000033  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         00000400  00000000  00000000  00000068  2**3
+                  CONTENTS, ALLOC, LOAD, RELOC, DATA
+  2 .bss          00000000  00000000  00000000  00000468  2**0
+                  ALLOC
+  3 .xtensa.info  00000038  00000000  00000000  00000468  2**0
+                  CONTENTS, READONLY
+  4 .debug_line   000000da  00000000  00000000  000004a0  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  5 .debug_info   0000009b  00000000  00000000  0000057a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  6 .debug_abbrev 00000014  00000000  00000000  00000615  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  7 .debug_aranges 00000020  00000000  00000000  00000630  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  8 .xt.prop      00000054  00000000  00000000  00000650  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_overlay_os_hook.c.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .literal.xt_overlay_init_os 00000008  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .literal.xt_overlay_lock 00000008  00000000  00000000  0000003c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .literal.xt_overlay_unlock 00000008  00000000  00000000  00000044  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .text         00000000  00000000  00000000  0000004c  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  4 .data         00000000  00000000  00000000  0000004c  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  5 .bss          00000000  00000000  00000000  0000004c  2**0
+                  ALLOC
+  6 .text.xt_overlay_init_os 00000013  00000000  00000000  0000004c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .text.xt_overlay_lock 00000016  00000000  00000000  00000060  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .text.xt_overlay_unlock 00000016  00000000  00000000  00000078  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .bss.xt_overlay_mutex 00000004  00000000  00000000  00000090  2**2
+                  ALLOC
+ 10 .debug_frame  00000058  00000000  00000000  00000090  2**2
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 11 .debug_info   00000193  00000000  00000000  000000e8  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 12 .debug_abbrev 0000008f  00000000  00000000  0000027b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 13 .debug_aranges 00000030  00000000  00000000  0000030a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 14 .debug_ranges 00000020  00000000  00000000  0000033a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 15 .debug_line   00000192  00000000  00000000  0000035a  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 16 .debug_str    0000025c  00000000  00000000  000004ec  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 17 .comment      0000003b  00000000  00000000  00000748  2**0
+                  CONTENTS, READONLY
+ 18 .xtensa.info  00000038  00000000  00000000  00000783  2**0
+                  CONTENTS, READONLY
+ 19 .xt.lit       00000018  00000000  00000000  000007bb  2**0
+                  CONTENTS, RELOC, READONLY
+ 20 .xt.prop      0000009c  00000000  00000000  000007d3  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_vector_defaults.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .iram1.literal 00000004  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .text         00000000  00000000  00000000  00000038  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  2 .data         00000000  00000000  00000000  00000038  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  3 .bss          00000000  00000000  00000000  00000038  2**0
+                  ALLOC
+  4 .iram1        00000032  00000000  00000000  00000038  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .xtensa.info  00000038  00000000  00000000  0000006a  2**0
+                  CONTENTS, READONLY
+  6 .debug_line   000000c2  00000000  00000000  000000a2  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  7 .debug_info   000000a2  00000000  00000000  00000164  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+  8 .debug_abbrev 00000014  00000000  00000000  00000206  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  9 .debug_aranges 00000020  00000000  00000000  00000220  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 10 .xt.lit       00000008  00000000  00000000  00000240  2**0
+                  CONTENTS, RELOC, READONLY
+ 11 .xt.prop      00000078  00000000  00000000  00000248  2**0
+                  CONTENTS, RELOC, READONLY
+
+xtensa_vectors.S.obj:     file format elf32-xtensa-le
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .iram1.literal 000000a8  00000000  00000000  00000034  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  1 .DebugExceptionVector.literal 00000004  00000000  00000000  000000dc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  2 .DoubleExceptionVector.literal 00000004  00000000  00000000  000000e0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  3 .KernelExceptionVector.literal 00000004  00000000  00000000  000000e4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  4 .UserExceptionVector.literal 00000004  00000000  00000000  000000e8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  5 .Level2InterruptVector.literal 00000004  00000000  00000000  000000ec  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  6 .Level3InterruptVector.literal 00000004  00000000  00000000  000000f0  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  7 .Level4InterruptVector.literal 00000004  00000000  00000000  000000f4  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  8 .Level5InterruptVector.literal 00000004  00000000  00000000  000000f8  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+  9 .NMIExceptionVector.literal 00000004  00000000  00000000  000000fc  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 10 .text         00000000  00000000  00000000  00000100  2**0
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 11 .data         00000008  00000000  00000000  00000100  2**4
+                  CONTENTS, ALLOC, LOAD, DATA
+ 12 .bss          00000000  00000000  00000000  00000108  2**0
+                  ALLOC
+ 13 .iram1        000004ec  00000000  00000000  00000108  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 14 .rodata       00000024  00000000  00000000  00000600  2**4
+                  CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 15 .DebugExceptionVector.text 00000009  00000000  00000000  00000624  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 16 .DoubleExceptionVector.text 00000011  00000000  00000000  00000630  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 17 .KernelExceptionVector.text 00000009  00000000  00000000  00000644  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 18 .UserExceptionVector.text 00000009  00000000  00000000  00000650  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 19 .Level2InterruptVector.text 00000009  00000000  00000000  0000065c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 20 .Level3InterruptVector.text 00000009  00000000  00000000  00000668  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 21 .Level4InterruptVector.text 00000009  00000000  00000000  00000674  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 22 .Level5InterruptVector.text 00000009  00000000  00000000  00000680  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 23 .NMIExceptionVector.text 00000009  00000000  00000000  0000068c  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 24 .WindowVectors.text 0000016a  00000000  00000000  00000698  2**2
+                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+ 25 .UserEnter.text 00000000  00000000  00000000  00000804  2**2
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 26 .xtensa.info  00000038  00000000  00000000  00000804  2**0
+                  CONTENTS, READONLY
+ 27 .debug_line   000009b8  00000000  00000000  0000083c  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 28 .debug_info   00000096  00000000  00000000  000011f4  2**0
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 29 .debug_abbrev 00000012  00000000  00000000  0000128a  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 30 .debug_aranges 00000070  00000000  00000000  000012a0  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 31 .debug_ranges 00000068  00000000  00000000  00001310  2**3
+                  CONTENTS, RELOC, READONLY, DEBUGGING
+ 32 .xt.lit       00000050  00000000  00000000  00001378  2**0
+                  CONTENTS, RELOC, READONLY
+ 33 .xt.prop      000004f8  00000000  00000000  000013c8  2**0
+                  CONTENTS, RELOC, READONLY
diff --git a/tools/ldgen/test/data/template.ld b/tools/ldgen/test/data/template.ld
new file mode 100644
index 00000000..512f724e
--- /dev/null
+++ b/tools/ldgen/test/data/template.ld
@@ -0,0 +1,215 @@
+/*  Default entry point:  */
+ENTRY(call_start_cpu0);
+
+SECTIONS
+{
+  /* RTC fast memory holds RTC wake stub code,
+     including from any source file named rtc_wake_stub*.c
+  */
+  .rtc.text :
+  {
+    . = ALIGN(4);
+
+    mapping[rtc_text]
+
+    *rtc_wake_stub*.o(.literal .text .literal.* .text.*)
+  } >rtc_iram_seg
+
+  /* RTC slow memory holds RTC wake stub
+     data/rodata, including from any source file
+     named rtc_wake_stub*.c
+  */
+  .rtc.data :
+  {
+    _rtc_data_start = ABSOLUTE(.);
+
+    mapping[rtc_data]
+
+    *rtc_wake_stub*.o(.data .rodata .data.* .rodata.* .bss .bss.*)
+    _rtc_data_end = ABSOLUTE(.);
+  } > rtc_slow_seg
+
+  /* RTC bss, from any source file named rtc_wake_stub*.c */
+  .rtc.bss (NOLOAD) :
+  {
+    _rtc_bss_start = ABSOLUTE(.);
+
+    mapping[rtc_bss]
+
+    *rtc_wake_stub*.o(.bss .bss.*)
+    *rtc_wake_stub*.o(COMMON)
+    _rtc_bss_end = ABSOLUTE(.);
+  } > rtc_slow_seg
+
+  /* Send .iram0 code to iram */
+  .iram0.vectors :
+  {
+    /* Vectors go to IRAM */
+    _init_start = ABSOLUTE(.);
+    /* Vectors according to builds/RF-2015.2-win32/esp108_v1_2_s5_512int_2/config.html */
+    . = 0x0;
+    KEEP(*(.WindowVectors.text));
+    . = 0x180;
+    KEEP(*(.Level2InterruptVector.text));
+    . = 0x1c0;
+    KEEP(*(.Level3InterruptVector.text));
+    . = 0x200;
+    KEEP(*(.Level4InterruptVector.text));
+    . = 0x240;
+    KEEP(*(.Level5InterruptVector.text));
+    . = 0x280;
+    KEEP(*(.DebugExceptionVector.text));
+    . = 0x2c0;
+    KEEP(*(.NMIExceptionVector.text));
+    . = 0x300;
+    KEEP(*(.KernelExceptionVector.text));
+    . = 0x340;
+    KEEP(*(.UserExceptionVector.text));
+    . = 0x3C0;
+    KEEP(*(.DoubleExceptionVector.text));
+    . = 0x400;
+    *(.*Vector.literal)
+
+    *(.UserEnter.literal);
+    *(.UserEnter.text);
+    . = ALIGN (16);
+    *(.entry.text)
+    *(.init.literal)
+    *(.init)
+    _init_end = ABSOLUTE(.);
+
+    /* This goes here, not at top of linker script, so addr2line finds it last,
+       and uses it in preference to the first symbol in IRAM */
+    _iram_start = ABSOLUTE(0);
+  } > iram0_0_seg
+
+  .iram0.text :
+  {
+    /* Code marked as runnning out of IRAM */
+    _iram_text_start = ABSOLUTE(.);
+
+    mapping[iram0_text]
+    
+    _iram_text_end = ABSOLUTE(.);
+  } > iram0_0_seg
+
+  .dram0.data :
+  {
+    _data_start = ABSOLUTE(.);
+
+    mapping[dram0_data]
+
+    *(.gnu.linkonce.d.*)
+    *(.data1)
+    *(.sdata)
+    *(.sdata.*)
+    *(.gnu.linkonce.s.*)
+    *(.sdata2)
+    *(.sdata2.*)
+    *(.gnu.linkonce.s2.*)
+    *(.jcr)
+    _data_end = ABSOLUTE(.);
+    . = ALIGN(4);
+  } >dram0_0_seg
+
+  /* Shared RAM */
+  .dram0.bss (NOLOAD) :
+  {
+    . = ALIGN (8);
+    _bss_start = ABSOLUTE(.);
+
+    mapping[dram0_bss]
+
+    *(.dynsbss)
+    *(.sbss)
+    *(.sbss.*)
+    *(.gnu.linkonce.sb.*)
+    *(.scommon)
+    *(.sbss2)
+    *(.sbss2.*)
+    *(.gnu.linkonce.sb2.*)
+    *(.dynbss)
+    *(.share.mem)
+    *(.gnu.linkonce.b.*)
+
+    . = ALIGN (8);
+    _bss_end = ABSOLUTE(.);
+    _heap_start = ABSOLUTE(.);
+  } >dram0_0_seg
+
+  .flash.rodata :
+  {
+    _rodata_start = ABSOLUTE(.);
+
+    mapping[flash_rodata]
+
+    *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
+    *(.gnu.linkonce.r.*)
+    *(.rodata1)
+    __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
+    *(.xt_except_table)
+    *(.gcc_except_table .gcc_except_table.*)
+    *(.gnu.linkonce.e.*)
+    *(.gnu.version_r)
+    . = (. + 3) & ~ 3;
+    __eh_frame = ABSOLUTE(.);
+    KEEP(*(.eh_frame))
+    . = (. + 7) & ~ 3;
+    /*  C++ constructor and destructor tables, properly ordered:  */
+    __init_array_start = ABSOLUTE(.);
+    KEEP (*crtbegin.o(.ctors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    __init_array_end = ABSOLUTE(.);
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    /*  C++ exception handlers table:  */
+    __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
+    *(.xt_except_desc)
+    *(.gnu.linkonce.h.*)
+    __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+    *(.xt_except_desc_end)
+    *(.dynamic)
+    *(.gnu.version_d)
+    _rodata_end = ABSOLUTE(.);
+    /* Literals are also RO data. */
+    _lit4_start = ABSOLUTE(.);
+    *(*.lit4)
+    *(.lit4.*)
+    *(.gnu.linkonce.lit4.*)
+    _lit4_end = ABSOLUTE(.);
+    . = ALIGN(4);
+    _thread_local_start = ABSOLUTE(.);
+    *(.tdata)
+    *(.tdata.*)
+    *(.tbss)
+    *(.tbss.*)
+    _thread_local_end = ABSOLUTE(.);
+    . = ALIGN(4);
+  } >drom0_0_seg
+
+  .flash.text :
+  {
+    _stext = .;
+    _text_start = ABSOLUTE(.);
+
+    mapping[flash_text]
+
+    *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+    *(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */
+    *(.fini.literal)
+    *(.fini)
+    *(.gnu.version)
+    _text_end = ABSOLUTE(.);
+    _etext = .;
+
+    /* Similar to _iram_start, this symbol goes here so it is
+       resolved by addr2line in preference to the first symbol in
+       the flash.text segment.
+    */
+    _flash_cache_start = ABSOLUTE(0);
+  } >iram0_2_seg
+}
diff --git a/tools/ldgen/test/test_fragments.py b/tools/ldgen/test/test_fragments.py
new file mode 100755
index 00000000..22daa574
--- /dev/null
+++ b/tools/ldgen/test/test_fragments.py
@@ -0,0 +1,982 @@
+#!/usr/bin/env python
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+import sys
+import unittest
+
+from io import StringIO
+from pyparsing import Word, ParseException, ParseFatalException, alphanums
+
+try:
+    from fragments import FragmentFile, FRAGMENT_TYPES, Fragment, KeyGrammar
+    from sdkconfig import SDKConfig
+except ImportError:
+    sys.path.append('../')
+    from fragments import FragmentFile, FRAGMENT_TYPES, Fragment, KeyGrammar
+    from sdkconfig import SDKConfig
+
+
+class SampleFragment(Fragment):
+
+    grammars = {
+        "key_1": KeyGrammar(Word(alphanums + "_").setResultsName("value"), 0, None, True),
+        "key_2": KeyGrammar(Word(alphanums + "_").setResultsName("value"), 0, None, False),
+        "key_3": KeyGrammar(Word(alphanums + "_").setResultsName("value"), 3, 5, False)
+    }
+
+    def set_key_value(self, key, parse_results):
+        if key == "key_1":
+            self.key_1 = list()
+            for result in parse_results:
+                self.key_1.append(result["value"])
+        elif key == "key_2":
+            self.key_2 = list()
+            for result in parse_results:
+                self.key_2.append(result["value"])
+
+    def get_key_grammars(self):
+        return self.__class__.grammars
+
+
+FRAGMENT_TYPES["test"] = SampleFragment
+
+
+class FragmentTest(unittest.TestCase):
+
+    def setUp(self):
+        self.sdkconfig = SDKConfig("data/Kconfig", "data/sdkconfig")
+
+    @staticmethod
+    def create_fragment_file(contents, name="test_fragment.lf"):
+        f = StringIO(contents)
+        f.name = name
+        return f
+
+    def test_basic(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_1
+    value_2 # comments should be ignored
+    value_3
+# this is a comment as well
+key_2: value_a
+
+# this is the last comment
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+
+        self.assertEqual(len(fragment_file.fragments[0].key_1), 3)
+        self.assertEqual(fragment_file.fragments[0].key_1[0], "value_1")
+        self.assertEqual(fragment_file.fragments[0].key_1[1], "value_2")
+        self.assertEqual(fragment_file.fragments[0].key_1[2], "value_3")
+        self.assertEqual(len(fragment_file.fragments[0].key_2), 1)
+        self.assertEqual(fragment_file.fragments[0].key_2[0], "value_a")
+
+    def test_duplicate_keys(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1: value_1
+key_1: value_a
+""")
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_empty_key(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+""")
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_conditional(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_1
+    if A = y:
+        value_2
+    value_3
+    if A = n:
+        value_4
+    if B = n:
+        value_5
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].key_1[0], "value_1")
+        self.assertEqual(fragment_file.fragments[0].key_1[1], "value_2")
+        self.assertEqual(fragment_file.fragments[0].key_1[2], "value_3")
+        self.assertEqual(fragment_file.fragments[0].key_1[3], "value_5")
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_1
+    if B = y:
+        value_2
+    elif C = y:
+        value_3
+    elif A = y:
+        value_4
+    else:
+        value_5
+    value_6
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].key_1[0], "value_1")
+        self.assertEqual(fragment_file.fragments[0].key_1[1], "value_3")
+        self.assertEqual(fragment_file.fragments[0].key_1[2], "value_6")
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_1
+    if A = y:
+        value_2
+        if B = y:
+            value_3
+        else:
+            value_4
+            if C = y:
+                value_5
+            value_6
+        value_7
+key_2:
+    value_a
+    if B != y:
+        value_b
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].key_1[0], "value_1")
+        self.assertEqual(fragment_file.fragments[0].key_1[1], "value_2")
+        self.assertEqual(fragment_file.fragments[0].key_1[2], "value_4")
+        self.assertEqual(fragment_file.fragments[0].key_1[3], "value_5")
+        self.assertEqual(fragment_file.fragments[0].key_1[4], "value_6")
+        self.assertEqual(fragment_file.fragments[0].key_1[5], "value_7")
+        self.assertEqual(fragment_file.fragments[0].key_2[0], "value_a")
+        self.assertEqual(fragment_file.fragments[0].key_2[1], "value_b")
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    if A = n:
+        value_2
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(len(fragment_file.fragments[0].key_1), 0)
+
+    def test_empty_file(self):
+        test_fragment = self.create_fragment_file(u"""
+
+
+
+
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(len(fragment_file.fragments), 0)
+
+    def test_setting_indent(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+ value_1
+ value_2
+ value_3
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+
+        self.assertEqual(len(fragment_file.fragments[0].key_1), 3)
+        self.assertEqual(fragment_file.fragments[0].key_1[0], "value_1")
+        self.assertEqual(fragment_file.fragments[0].key_1[1], "value_2")
+        self.assertEqual(fragment_file.fragments[0].key_1[2], "value_3")
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+ value_1
+  value_2 # first element dictates indent
+  value_3
+""")
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_values_num_limit(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_a
+key_3:
+    value_1
+    value_2
+    value_3
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_a
+key_3:
+    value_1
+    value_2
+    value_3
+    value_4
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(len(fragment_file.fragments), 1)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_a
+key_3:
+    value_1
+    value_2
+    value_3
+    value_4
+    value_5
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(len(fragment_file.fragments), 1)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_a
+key_3:
+    value_1
+    value_2
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_a
+key_3:
+    value_1
+    value_2
+    value_3
+    value_4
+    value_5
+    value_6
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_unsupported_key(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    value_a
+key_4:
+    value_1
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_empty_fragment(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_empty_conditional(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    if B = y:
+    else:
+        value_1
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    if B = y:
+        value_1
+    else B = y:
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    if B = y:
+        value_1
+    elif B = y:
+    else:
+        value_2
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_out_of_order_conditional(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    elif B = y:
+        value_1
+    else:
+        value_2
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_1:
+    else:
+        value_2
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_required_keys(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test]
+key_2:
+    value_1
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_multiple_fragments(self):
+        test_fragment = self.create_fragment_file(u"""
+[test:test1]
+key_1:
+    value_1
+
+[test:test2]
+key_1:
+    value_2
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+
+        self.assertEqual(len(fragment_file.fragments), 2)
+        self.assertEqual(fragment_file.fragments[0].key_1[0], "value_1")
+        self.assertEqual(fragment_file.fragments[1].key_1[0], "value_2")
+
+    def test_whole_conditional_fragment(self):
+        test_fragment = self.create_fragment_file(u"""
+if B = y:
+    [test:test1]
+    key_1:
+        value_1
+else:
+    [test:test2]
+    key_1:
+        value_2
+
+    if A = y:
+        [test:test3]
+        key_1:
+            value_3
+            if C = y:
+                value_6
+
+    [test:test4]
+    key_1:
+        value_4
+
+[test:test5]
+key_1:
+    value_5
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(len(fragment_file.fragments), 4)
+        self.assertEqual(fragment_file.fragments[0].name, "test2")
+        self.assertEqual(fragment_file.fragments[1].name, "test3")
+        self.assertEqual(fragment_file.fragments[1].key_1[1], "value_6")
+        self.assertEqual(fragment_file.fragments[2].name, "test4")
+        self.assertEqual(fragment_file.fragments[3].name, "test5")
+
+    def test_equivalent_conditional_fragment(self):
+        test_fragment1 = self.create_fragment_file(u"""
+if A = y:
+    [test:test1]
+    key_1:
+        value_1
+else:
+    [test:test2]
+    key_1:
+        value_2
+""")
+
+        fragment_file1 = FragmentFile(test_fragment1, self.sdkconfig)
+        self.assertEqual(len(fragment_file1.fragments), 1)
+        self.assertEqual(fragment_file1.fragments[0].key_1[0], "value_1")
+
+        test_fragment2 = self.create_fragment_file(u"""
+[test:test1]
+key_1:
+    if A = y:
+        value_1
+    else:
+        value_2
+""")
+
+        fragment_file2 = FragmentFile(test_fragment2, self.sdkconfig)
+        self.assertEqual(len(fragment_file2.fragments), 1)
+        self.assertEqual(fragment_file2.fragments[0].key_1[0], "value_1")
+
+
+class SectionsTest(FragmentTest):
+
+    def test_basic(self):
+        test_fragment = self.create_fragment_file(u"""
+[sections:test]
+entries:
+    .section1
+    .section2
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].entries, {".section1", ".section2"})
+
+    def test_duplicate_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[sections:test]
+entries:
+    .section1
+    .section2
+    .section3
+    .section2
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].entries, {".section1", ".section2", ".section3"})
+
+    def test_empty_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[sections:test]
+entries:
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[sections:test]
+entries:
+    if B = y:
+        .section1
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+
+class SchemeTest(FragmentTest):
+
+    def test_basic(self):
+        test_fragment = self.create_fragment_file(u"""
+[scheme:test]
+entries:
+    sections1 -> target1
+    sections2 -> target2
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].entries,
+                         {("sections1", "target1"),
+                          ("sections2", "target2")})
+
+    def test_duplicate_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[scheme:test]
+entries:
+    sections1 -> target1
+    sections2 -> target2
+    sections2 -> target2
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(fragment_file.fragments[0].entries,
+                         {("sections1", "target1"),
+                          ("sections2", "target2")})
+
+    def test_empty_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[scheme:test]
+entries:
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[scheme:test]
+entries:
+    if B = y:
+        sections1 -> target1
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_improper_grammar(self):
+        test_fragment = self.create_fragment_file(u"""
+[scheme:test]
+entries:
+    sections1, target1 # improper separator
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+
+class MappingTest(FragmentTest):
+
+    def test_basic(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    obj:symbol (noflash)
+    obj (noflash)
+    obj:symbol_2 (noflash)
+    obj_2 (noflash)
+    * (noflash)
+""")
+
+        expected = {("obj", "symbol", "noflash"),
+                    ("obj", None, "noflash"),
+                    ("obj", "symbol_2", "noflash"),
+                    ("obj_2", None, "noflash"),
+                    ("*", None, "noflash")}
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_archive(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive:
+entries:
+    * (default)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive:
+    lib1.a
+    lib2.a
+entries:
+    * (default)
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_empty_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive:
+    lib.a
+entries:
+    if B = y:
+        * (noflash) # if condition is false, then no 'entries' key value
+""")
+
+        expected = set()
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive:
+    lib.a
+entries:
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_duplicate_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive:
+    lib.a
+entries:
+    obj:symbol (noflash)
+    obj:symbol (noflash)
+""")
+
+        expected = {("obj", "symbol", "noflash")}
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_invalid_grammar(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive:
+    lib.a
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+entries:
+    * (default)
+""")
+
+        with self.assertRaises(ParseFatalException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    obj: (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    obj: ()
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    obj:symbol
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    obj:* (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    :symbol (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+        test_fragment = self.create_fragment_file(u"""
+[mapping:test]
+archive: lib.a
+entries:
+    *:symbol (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+
+class DeprecatedMappingTest(FragmentTest):
+
+    def test_valid_grammar(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    obj:symbol (noflash)
+    # Comments should not matter
+    obj (noflash)
+    # Nor should whitespace
+                    obj  :     symbol_2 (    noflash )
+        obj_2  (    noflash )
+    * (noflash)
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual("lib.a", fragment_file.fragments[0].archive)
+        self.assertEqual("lib_a", fragment_file.fragments[0].name)
+
+        expected = {("obj", "symbol", "noflash"),
+                    ("obj", None, "noflash"),
+                    ("obj", "symbol_2", "noflash"),
+                    ("obj_2", None, "noflash"),
+                    ("*", None, "noflash")
+                    }
+
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_explicit_blank_default_w_others(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = n
+    obj_a (noflash)
+    : default
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        expected = {("*", None, "default")}
+
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_implicit_blank_default_w_others(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = n
+    obj_a (noflash)
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        expected = {("*", None, "default")}
+
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_explicit_blank_default(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : default
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        expected = {("*", None, "default")}
+
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_implicit_blank_default(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : default
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        expected = {("*", None, "default")}
+
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_multiple_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = n
+    obj_a1 (noflash)
+    obj_a2 (noflash)
+    : B = n
+    obj_b1 (noflash)
+    obj_b2 (noflash)
+    obj_b3 (noflash)
+    : C = n
+    obj_c1 (noflash)
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        expected = {("obj_b1", None, "noflash"),
+                    ("obj_b2", None, "noflash"),
+                    ("obj_b3", None, "noflash")}
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_blank_entries(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = n
+    obj_a (noflash)
+    : B = n
+    : C = n
+    obj_c (noflash)
+    : default
+    obj (noflash)
+""")
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        expected = {("*", None, "default")}
+        self.assertEqual(expected, fragment_file.fragments[0].entries)
+
+    def test_blank_first_condition(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    obj_a (noflash)
+    : CONFIG_B = y
+    obj_b (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_nonlast_default_1(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : default
+    obj_a (noflash)
+    : CONFIG_A = y
+    obj_A (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_nonlast_default_2(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = y
+    obj_A (noflash)
+    : default
+    obj_a (noflash)
+    : B = y
+    obj_B (noflash
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_nonlast_default_3(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = y
+    obj_A (noflash)
+    :
+    obj_a (noflash)
+    : B = y
+    obj_B (noflash
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_duplicate_default_1(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : CONFIG_A = y
+    obj_A (noflash)
+    : default
+    obj_a (noflash)
+    : CONFIG_B = y
+    obj_B (noflash)
+    : default
+    obj_a (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_duplicate_default_2(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : CONFIG_A = y
+    obj_A (noflash)
+    : CONFIG_B = y
+    obj_a (noflash)
+    : default
+    obj_B (noflash)
+    :
+    obj_a (noflash)
+""")
+
+        with self.assertRaises(ParseException):
+            FragmentFile(test_fragment, self.sdkconfig)
+
+    def test_mixed_deprecated_mapping(self):
+        test_fragment = self.create_fragment_file(u"""
+[mapping]
+archive: lib.a
+entries:
+    : A = n
+    obj_A (noflash)
+    : default
+    obj_B (noflash)
+
+
+[mapping:test]
+archive: lib.a
+entries:
+    if A = n:
+        obj_A (noflash)
+    else:
+        obj_B (noflash)
+""")
+
+        fragment_file = FragmentFile(test_fragment, self.sdkconfig)
+        self.assertEqual(2, len(fragment_file.fragments))
+
+        self.assertEqual(fragment_file.fragments[0].entries,
+                         fragment_file.fragments[1].entries)
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/tools/ldgen/test/test_generation.py b/tools/ldgen/test/test_generation.py
new file mode 100755
index 00000000..ec5de672
--- /dev/null
+++ b/tools/ldgen/test/test_generation.py
@@ -0,0 +1,1354 @@
+#!/usr/bin/env python
+#
+# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import unittest
+import sys
+
+try:
+    from generation import PlacementRule
+except ImportError:
+    sys.path.append('../')
+    from generation import PlacementRule
+
+from generation import GenerationException
+from generation import SectionsInfo
+from generation import TemplateModel
+from generation import GenerationModel
+
+from fragments import FragmentFile
+
+from sdkconfig import SDKConfig
+from io import StringIO
+
+
+class GenerationModelTest(unittest.TestCase):
+
+    def setUp(self):
+        self.model = GenerationModel()
+        self.sections_info = None
+        self.script_model = None
+
+        self.sdkconfig = SDKConfig("data/Kconfig", "data/sdkconfig")
+
+        with open("data/sample.lf") as fragment_file_obj:
+            fragment_file = FragmentFile(fragment_file_obj, self.sdkconfig)
+            self.model.add_fragments_from_file(fragment_file)
+
+        self.sections_info = SectionsInfo()
+
+        with open("data/sections.info") as sections_info_file_obj:
+            self.sections_info.add_sections_info(sections_info_file_obj)
+
+        with open("data/template.ld") as template_file_obj:
+            self.script_model = TemplateModel(template_file_obj)
+
+    @staticmethod
+    def create_fragment_file(contents, name="test_fragment.lf"):
+        f = StringIO(contents)
+        f.name = name
+        return f
+
+    def add_fragments(self, text):
+        fragment_file = self.create_fragment_file(text)
+        fragment_file = FragmentFile(fragment_file, self.sdkconfig)
+        self.model.add_fragments_from_file(fragment_file)
+
+    def write(self, expected, actual):
+        self.script_model.fill(expected)
+        self.script_model.write(open("expected.ld", "w"))
+
+        self.script_model.fill(actual)
+        self.script_model.write(open("actual.ld", "w"))
+
+    def generate_default_rules(self):
+        rules = dict()
+
+        # flash_text
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["text"].entries, "flash_text")
+        placement_rules.append(rule)
+        rules["flash_text"] = placement_rules
+
+        # flash_rodata
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["rodata"].entries, "flash_rodata")
+        placement_rules.append(rule)
+        rules["flash_rodata"] = placement_rules
+
+        # dram0_data
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["data"].entries | self.model.sections["dram"].entries, "dram0_data")
+        placement_rules.append(rule)
+        rules["dram0_data"] = placement_rules
+
+        # dram0_bss
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "dram0_bss")
+        placement_rules.append(rule)
+        rules["dram0_bss"] = placement_rules
+
+        # iram0_text
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["iram"].entries, "iram0_text")
+        placement_rules.append(rule)
+        rules["iram0_text"] = placement_rules
+
+        # rtc_text
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["rtc_text"].entries, "rtc_text")
+        placement_rules.append(rule)
+        rules["rtc_text"] = placement_rules
+
+        # rtc_data
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["rtc_data"].entries | self.model.sections["rtc_rodata"].entries, "rtc_data")
+        placement_rules.append(rule)
+        rules["rtc_data"] = placement_rules
+
+        # rtc_bss
+        placement_rules = list()
+        rule = PlacementRule(None, None, None, self.model.sections["rtc_bss"].entries, "rtc_bss")
+        placement_rules.append(rule)
+        rules["rtc_bss"] = placement_rules
+
+        return rules
+
+    def compare_rules(self, expected, actual):
+        self.assertEqual(set(expected.keys()), set(actual.keys()))
+
+        for (target, rules) in actual.items():
+
+            message = "target: " + target
+
+            actual_target_rules = rules
+            expected_target_rules = expected[target]
+
+            self.assertEqual(len(actual_target_rules), len(expected_target_rules))
+
+            for actual_target_rule in actual_target_rules:
+                self.assertTrue(actual_target_rule in expected_target_rules, message + str(actual_target_rule))
+
+            for expected_target_rule in expected_target_rules:
+                self.assertTrue(expected_target_rule in actual_target_rules, message + str(expected_target_rule))
+
+    def get_default(self, target, rules):
+        return rules[target][0]
+
+    def test_rule_generation_default(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    * (default)
+"""
+
+        self.add_fragments(normal)
+        actual = self.model.generate_rules(self.sections_info)
+        expected = self.generate_default_rules()
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_1(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    * (noflash)
+"""
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E1)
+        flash_rodata_default.add_exclusion(dram0_data_E1)
+
+        # Add to the placement rules list
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_2(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    timers (rtc)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(rtc_text_E1)
+        flash_rodata_default.add_exclusion(rtc_data_E1)
+        dram0_data_default.add_exclusion(rtc_data_E1)
+        dram0_bss_default.add_exclusion(rtc_bss_E1)
+
+        # Add the rules
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_3(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    timers (rtc)
+    * (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E2)
+        flash_rodata_default.add_exclusion(dram0_data_E2)
+
+        dram0_data_default.add_exclusion(rtc_data_E1)
+        dram0_bss_default.add_exclusion(rtc_bss_E1)
+
+        iram0_text_E2.add_exclusion(rtc_text_E1)
+        dram0_data_E2.add_exclusion(rtc_data_E1)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_4(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine (rtc)
+    event_groups (noflash)
+    timers (rtc)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(rtc_text_E3)
+        flash_rodata_default.add_exclusion(rtc_data_E3)
+        dram0_data_default.add_exclusion(rtc_data_E3)
+        dram0_bss_default.add_exclusion(rtc_bss_E3)
+
+        flash_text_default.add_exclusion(iram0_text_E2)
+        flash_rodata_default.add_exclusion(dram0_data_E2)
+
+        flash_text_default.add_exclusion(rtc_text_E1)
+        flash_rodata_default.add_exclusion(rtc_data_E1)
+        dram0_data_default.add_exclusion(rtc_data_E1)
+        dram0_bss_default.add_exclusion(rtc_bss_E1)
+
+        # Add the rules
+        expected["rtc_text"].append(rtc_text_E3)
+        expected["rtc_data"].append(rtc_data_E3)
+        expected["rtc_bss"].append(rtc_bss_E3)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_5(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine (rtc)
+    event_groups (noflash)
+    timers (rtc)
+    * (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E4)
+        flash_rodata_default.add_exclusion(dram0_data_E4)
+
+        iram0_text_E4.add_exclusion(rtc_text_E3)
+        dram0_data_E4.add_exclusion(rtc_data_E3)
+        dram0_data_default.add_exclusion(rtc_data_E3)
+        dram0_bss_default.add_exclusion(rtc_bss_E3)
+
+        iram0_text_E4.add_exclusion(iram0_text_E2)
+        dram0_data_E4.add_exclusion(dram0_data_E2)
+
+        iram0_text_E4.add_exclusion(rtc_text_E1)
+        dram0_data_E4.add_exclusion(rtc_data_E1)
+        dram0_data_default.add_exclusion(rtc_data_E1)
+        dram0_bss_default.add_exclusion(rtc_bss_E1)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E4)
+        expected["dram0_data"].append(dram0_data_E4)
+
+        expected["rtc_text"].append(rtc_text_E3)
+        expected["rtc_data"].append(rtc_data_E3)
+        expected["rtc_bss"].append(rtc_bss_E3)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_6(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckPendingReadyList (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
+
+        iram0_text_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
+        dram0_data_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E1_extra, self.sections_info)
+        flash_rodata_default.add_exclusion(dram0_data_E1_extra, self.sections_info)
+
+        iram0_text_E1_extra.add_exclusion(iram0_text_E1, self.sections_info)
+        dram0_data_E1_extra.add_exclusion(dram0_data_E1, self.sections_info)
+
+        # Add the rules
+        expected["flash_text"].append(iram0_text_E1_extra)
+        expected["flash_rodata"].append(dram0_data_E1_extra)
+
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_7(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckPendingReadyList (noflash)
+    croutine:prvCheckDelayedList (noflash)
+    croutine:xCoRoutineCreate (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
+
+        iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
+
+        flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
+        flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
+        flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
+
+        flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
+        flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
+
+        flash_text_extra.add_exclusion(iram0_text_E2, self.sections_info)
+        flash_rodata_extra.add_exclusion(dram0_data_E2, self.sections_info)
+
+        flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
+        flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
+
+        # Add the rules
+        expected["flash_text"].append(flash_text_extra)
+        expected["flash_rodata"].append(flash_rodata_extra)
+
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["iram0_text"].append(iram0_text_E3)
+        expected["dram0_data"].append(dram0_data_E3)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_8(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckPendingReadyList (noflash)
+    croutine:prvCheckDelayedList (rtc)
+    croutine:xCoRoutineCreate (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                    self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                   self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
+
+        flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
+        flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
+        dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
+        dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
+        flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
+        dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
+        dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
+
+        flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
+        flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
+
+        flash_text_extra.add_exclusion(rtc_text_E2, self.sections_info)
+        dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
+        flash_rodata_extra.add_exclusion(rtc_data_E2, self.sections_info)
+        dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
+
+        flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
+        flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
+
+        # Add the rules
+        expected["flash_text"].append(flash_text_extra)
+        expected["flash_rodata"].append(flash_rodata_extra)
+        expected["dram0_data"].append(dram0_data_extra)
+        expected["dram0_bss"].append(dram0_bss_extra)
+
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        expected["rtc_text"].append(rtc_text_E2)
+        expected["rtc_data"].append(rtc_data_E2)
+        expected["rtc_bss"].append(rtc_bss_E2)
+
+        expected["iram0_text"].append(iram0_text_E3)
+        expected["dram0_data"].append(dram0_data_E3)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_9(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckDelayedList (rtc)
+    croutine (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                    self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                   self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
+        dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
+        flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
+
+        dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
+        dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
+
+        dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
+        dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
+
+        iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
+        dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
+
+        # Add the rules
+        expected["dram0_data"].append(dram0_data_extra)
+        expected["dram0_bss"].append(dram0_bss_extra)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_10(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckDelayedList (rtc)
+    * (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        iram0_text_default = self.get_default("iram0_text", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                    self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                   self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
+
+        iram0_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "iram0_text")
+        dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*", ".rodata.*"], "dram0_data")
+        dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
+        flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
+
+        iram0_text_default.add_exclusion(iram0_text_extra, self.sections_info)
+        dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
+        dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
+
+        iram0_text_E2.add_exclusion(iram0_text_extra, self.sections_info)
+        dram0_data_E2.add_exclusion(dram0_data_extra, self.sections_info)
+
+        iram0_text_extra.add_exclusion(rtc_text_E1, self.sections_info)
+        dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
+        dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_extra)
+        expected["dram0_data"].append(dram0_data_extra)
+        expected["dram0_bss"].append(dram0_bss_extra)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_11(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckDelayedList (noflash)
+    croutine (rtc)
+    * (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        iram0_text_default = self.get_default("iram0_text", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E3, self.sections_info)
+        flash_rodata_default.add_exclusion(dram0_data_E3, self.sections_info)
+        iram0_text_default.add_exclusion(rtc_text_E2, self.sections_info)
+        dram0_data_default.add_exclusion(rtc_data_E2, self.sections_info)
+        dram0_bss_default.add_exclusion(rtc_bss_E2, self.sections_info)
+
+        iram0_text_E3.add_exclusion(rtc_text_E2, self.sections_info)
+        dram0_data_E3.add_exclusion(rtc_data_E2, self.sections_info)
+
+        rtc_text_E2.add_exclusion(iram0_text_E1, self.sections_info)
+        rtc_data_E2.add_exclusion(dram0_data_E1, self.sections_info)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        expected["rtc_text"].append(rtc_text_E2)
+        expected["rtc_data"].append(rtc_data_E2)
+        expected["rtc_bss"].append(rtc_bss_E2)
+
+        expected["iram0_text"].append(iram0_text_E3)
+        expected["dram0_data"].append(dram0_data_E3)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_12(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckDelayedList (rtc)
+    croutine (noflash)
+    * (rtc)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                    self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
+                                   self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        rtc_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "rtc_data")
+        rtc_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "rtc_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
+        flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
+        dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
+        dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
+
+        rtc_text_E3.add_exclusion(iram0_text_E2, self.sections_info)
+        rtc_data_E3.add_exclusion(dram0_data_E2, self.sections_info)
+        rtc_data_E3.add_exclusion(rtc_data_extra, self.sections_info)
+        rtc_bss_E3.add_exclusion(rtc_bss_extra, self.sections_info)
+
+        rtc_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
+        rtc_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
+        iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
+        dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
+
+        # Add the rules
+        expected["rtc_data"].append(rtc_data_extra)
+        expected["rtc_bss"].append(rtc_bss_extra)
+
+        expected["rtc_text"].append(rtc_text_E1)
+        expected["rtc_data"].append(rtc_data_E1)
+        expected["rtc_bss"].append(rtc_bss_E1)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E3)
+        expected["rtc_data"].append(rtc_data_E3)
+        expected["rtc_bss"].append(rtc_bss_E3)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_13(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckDelayedList (noflash)
+    event_groups:xEventGroupCreate (noflash)
+    croutine (rtc)
+    event_groups (rtc)
+    * (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
+
+        iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        rtc_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E4 = PlacementRule("libfreertos.a", "event_groups", None,
+                                    self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E4 = PlacementRule("libfreertos.a", "event_groups", None,
+                                   self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E5, self.sections_info)
+        flash_rodata_default.add_exclusion(dram0_data_E5, self.sections_info)
+        dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
+        dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
+        dram0_bss_default.add_exclusion(rtc_bss_E4, self.sections_info)
+        dram0_data_default.add_exclusion(rtc_data_E4, self.sections_info)
+
+        iram0_text_E5.add_exclusion(rtc_text_E3, self.sections_info)
+        dram0_data_E5.add_exclusion(rtc_data_E3, self.sections_info)
+        iram0_text_E5.add_exclusion(rtc_text_E4, self.sections_info)
+        dram0_data_E5.add_exclusion(rtc_data_E4, self.sections_info)
+
+        rtc_text_E4.add_exclusion(iram0_text_E2, self.sections_info)
+        rtc_data_E4.add_exclusion(dram0_data_E2, self.sections_info)
+
+        rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
+        rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        expected["iram0_text"].append(iram0_text_E2)
+        expected["dram0_data"].append(dram0_data_E2)
+
+        expected["rtc_text"].append(rtc_text_E3)
+        expected["rtc_data"].append(rtc_data_E3)
+        expected["rtc_bss"].append(rtc_bss_E3)
+
+        expected["rtc_text"].append(rtc_text_E4)
+        expected["rtc_data"].append(rtc_data_E4)
+        expected["rtc_bss"].append(rtc_bss_E4)
+
+        expected["iram0_text"].append(iram0_text_E5)
+        expected["dram0_data"].append(dram0_data_E5)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_14(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine:prvCheckDelayedList (noflash)
+    event_groups:xEventGroupCreate (rtc)
+    croutine (rtc)
+    event_groups (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+        dram0_data_default = self.get_default("dram0_data", expected)
+        dram0_bss_default = self.get_default("dram0_bss", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
+
+        rtc_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
+                                    self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
+                                   self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
+        rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
+        rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
+
+        iram0_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        dram0_data_extra = PlacementRule("libfreertos.a", "event_groups", None, [".data.*"], "dram0_data")
+        dram0_bss_extra = PlacementRule("libfreertos.a", "event_groups", None, [".bss.*"], "dram0_bss")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E4, self.sections_info)
+        flash_rodata_default.add_exclusion(dram0_data_E4, self.sections_info)
+        dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
+        dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
+
+        flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
+        flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
+        dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
+        dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
+
+        iram0_text_E4.add_exclusion(rtc_text_E2, self.sections_info)
+        dram0_data_E4.add_exclusion(rtc_data_E2, self.sections_info)
+        dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
+        dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
+
+        rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
+        rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        expected["rtc_text"].append(rtc_text_E2)
+        expected["rtc_data"].append(rtc_data_E2)
+        expected["rtc_bss"].append(rtc_bss_E2)
+
+        expected["rtc_text"].append(rtc_text_E3)
+        expected["rtc_data"].append(rtc_data_E3)
+        expected["rtc_bss"].append(rtc_bss_E3)
+
+        expected["iram0_text"].append(iram0_text_E4)
+        expected["dram0_data"].append(dram0_data_E4)
+
+        expected["dram0_data"].append(dram0_data_extra)
+        expected["dram0_bss"].append(dram0_bss_extra)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_15(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine (noflash_data)
+    croutine (noflash_text)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E1)
+        flash_rodata_default.add_exclusion(dram0_data_E1)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_nominal_16(self):
+        normal = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine (noflash_data)
+    croutine (noflash)
+"""
+
+        self.add_fragments(normal)
+
+        actual = self.model.generate_rules(self.sections_info)
+
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+
+        iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
+        dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E1)
+        flash_rodata_default.add_exclusion(dram0_data_E1)
+
+        # Add the rules
+        expected["iram0_text"].append(iram0_text_E1)
+        expected["dram0_data"].append(dram0_data_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_conflict(self):
+        conflict_mapping = u"""
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine (conflict)
+    croutine (noflash)
+
+[scheme:conflict]
+entries:
+    rodata -> dram0_data
+    bss -> dram0_data
+"""
+        self.add_fragments(conflict_mapping)
+
+        with self.assertRaises(GenerationException):
+            self.model.generate_rules(self.sections_info)
+
+    def test_rule_generation_condition(self):
+        generation_with_condition = u"""
+[mapping:test]
+archive: lib.a
+entries:
+    if PERFORMANCE_LEVEL = 1:
+        obj1 (noflash)
+    elif PERFORMANCE_LEVEL = 2:
+        obj1 (noflash)
+        obj2 (noflash)
+    elif PERFORMANCE_LEVEL = 3:
+        obj1 (noflash)
+        obj2 (noflash)
+        obj3 (noflash)
+    else: # PERFORMANCE_LEVEL = 0
+        * (default)
+"""
+
+        for perf_level in range(0, 4):
+            self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
+
+            self.model.mappings = {}
+            self.add_fragments(generation_with_condition)
+
+            actual = self.model.generate_rules(self.sections_info)
+            expected = self.generate_default_rules()
+
+            if perf_level < 4:
+                for append_no in range(1, perf_level + 1):
+                    flash_text_default = self.get_default("flash_text", expected)
+                    flash_rodata_default = self.get_default("flash_rodata", expected)
+
+                    iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
+                    dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
+
+                    flash_text_default.add_exclusion(iram_rule)
+                    flash_rodata_default.add_exclusion(dram_rule)
+
+                    expected["iram0_text"].append(iram_rule)
+                    expected["dram0_data"].append(dram_rule)
+
+            self.compare_rules(expected, actual)
+
+    def test_rule_generation_empty_entries(self):
+        normal = u"""
+[mapping:test]
+archive: lib.a
+entries:
+    if PERFORMANCE_LEVEL >= 1: # is false, generate no special rules
+        obj.a (noflash)
+"""
+
+        self.add_fragments(normal)
+        actual = self.model.generate_rules(self.sections_info)
+        expected = self.generate_default_rules()  # only default rules
+        self.compare_rules(expected, actual)
+
+    def test_conditional_sections_1(self):
+        generation_with_condition = u"""
+[sections:cond_text_data]
+entries:
+    if PERFORMANCE_LEVEL >= 1:
+        .text+
+        .literal+
+    else:
+        .data+
+
+[scheme:cond_noflash]
+entries:
+    if PERFORMANCE_LEVEL >= 1:
+        cond_text_data -> iram0_text
+    else:
+        cond_text_data -> dram0_data
+
+[mapping:test]
+archive: lib.a
+entries:
+    * (cond_noflash)
+"""
+
+        self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value("1")
+        self.add_fragments(generation_with_condition)
+
+        actual = self.model.generate_rules(self.sections_info)
+        expected = self.generate_default_rules()
+
+        flash_text_default = self.get_default("flash_text", expected)
+
+        iram0_text_E1 = PlacementRule("lib.a", "*", None, self.model.sections["text"].entries, "iram0_text")
+
+        # Add the exclusions
+        flash_text_default.add_exclusion(iram0_text_E1)
+
+        # Add to the placement rules list
+        expected["iram0_text"].append(iram0_text_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_conditional_sections_2(self):
+        generation_with_condition = u"""
+[sections:cond_text_data]
+entries:
+    if PERFORMANCE_LEVEL >= 1:
+        .text+
+        .literal+
+    else:
+        .rodata+
+
+[scheme:cond_noflash]
+entries:
+    if PERFORMANCE_LEVEL >= 1:
+        cond_text_data -> iram0_text
+    else:
+        cond_text_data -> dram0_data
+
+[mapping:test]
+archive: lib.a
+entries:
+    * (cond_noflash)
+"""
+
+        self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value("0")
+        self.add_fragments(generation_with_condition)
+
+        actual = self.model.generate_rules(self.sections_info)
+        expected = self.generate_default_rules()
+
+        flash_rodata_default = self.get_default("flash_rodata", expected)
+
+        dram0_data_E1 = PlacementRule("lib.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
+
+        # Add the exclusions
+        flash_rodata_default.add_exclusion(dram0_data_E1)
+
+        # Add to the placement rules list
+        expected["dram0_data"].append(dram0_data_E1)
+
+        self.compare_rules(expected, actual)
+
+    def test_rule_generation_condition_with_deprecated_mapping(self):
+        generation_with_condition = u"""
+[mapping]
+archive: lib.a
+entries:
+    : PERFORMANCE_LEVEL = 0
+    : PERFORMANCE_LEVEL = 1
+    obj1 (noflash)
+    : PERFORMANCE_LEVEL = 2
+    obj1 (noflash)
+    obj2 (noflash)
+    : PERFORMANCE_LEVEL = 3
+    obj1 (noflash)
+    obj2 (noflash)
+    obj3 (noflash)
+"""
+
+        for perf_level in range(0, 4):
+            self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
+
+            self.model.mappings = {}
+            self.add_fragments(generation_with_condition)
+
+            actual = self.model.generate_rules(self.sections_info)
+            expected = self.generate_default_rules()
+
+            if perf_level < 4:
+                for append_no in range(1, perf_level + 1):
+                    flash_text_default = self.get_default("flash_text", expected)
+                    flash_rodata_default = self.get_default("flash_rodata", expected)
+
+                    iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
+                    dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
+
+                    flash_text_default.add_exclusion(iram_rule)
+                    flash_rodata_default.add_exclusion(dram_rule)
+
+                    expected["iram0_text"].append(iram_rule)
+                    expected["dram0_data"].append(dram_rule)
+
+            self.compare_rules(expected, actual)
+
+    def test_rule_generation_multiple_deprecated_mapping_definitions(self):
+        multiple_deprecated_definitions = u"""
+[mapping]
+archive: lib.a
+entries:
+    : PERFORMANCE_LEVEL = 0
+    : PERFORMANCE_LEVEL = 1
+    obj1 (noflash)
+    : PERFORMANCE_LEVEL = 2
+    obj1 (noflash)
+    : PERFORMANCE_LEVEL = 3
+    obj1 (noflash)
+
+[mapping]
+archive: lib.a
+entries:
+    : PERFORMANCE_LEVEL = 1
+    obj1 (noflash) # ignore duplicate definition
+    : PERFORMANCE_LEVEL = 2
+    obj2 (noflash)
+    : PERFORMANCE_LEVEL = 3
+    obj2 (noflash)
+    obj3 (noflash)
+"""
+
+        for perf_level in range(0, 4):
+            self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
+
+            self.model.mappings = {}
+            self.add_fragments(multiple_deprecated_definitions)
+
+            actual = self.model.generate_rules(self.sections_info)
+            expected = self.generate_default_rules()
+
+            if perf_level < 4:
+                for append_no in range(1, perf_level + 1):
+                    flash_text_default = self.get_default("flash_text", expected)
+                    flash_rodata_default = self.get_default("flash_rodata", expected)
+
+                    iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
+                    dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
+
+                    flash_text_default.add_exclusion(iram_rule)
+                    flash_rodata_default.add_exclusion(dram_rule)
+
+                    expected["iram0_text"].append(iram_rule)
+                    expected["dram0_data"].append(dram_rule)
+
+            self.compare_rules(expected, actual)
+
+    def test_rule_generation_multiple_mapping_definitions(self):
+        multiple_deprecated_definitions = u"""
+[mapping:base]
+archive: lib.a
+entries:
+    if PERFORMANCE_LEVEL = 1:
+        obj1 (noflash)
+    elif PERFORMANCE_LEVEL = 2:
+        obj1 (noflash)
+    elif PERFORMANCE_LEVEL = 3:
+        obj1 (noflash)
+    else:
+        * (default)
+
+[mapping:extra]
+archive: lib.a
+entries:
+    if PERFORMANCE_LEVEL = 1:
+        obj1 (noflash) # ignore duplicate definition
+    elif PERFORMANCE_LEVEL = 2:
+        obj2 (noflash)
+    elif PERFORMANCE_LEVEL = 3:
+        obj2 (noflash)
+        obj3 (noflash)
+    else:
+        * (default)
+"""
+
+        for perf_level in range(0, 4):
+            self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
+
+            self.model.mappings = {}
+            self.add_fragments(multiple_deprecated_definitions)
+
+            actual = self.model.generate_rules(self.sections_info)
+            expected = self.generate_default_rules()
+
+            if perf_level < 4:
+                for append_no in range(1, perf_level + 1):
+                    flash_text_default = self.get_default("flash_text", expected)
+                    flash_rodata_default = self.get_default("flash_rodata", expected)
+
+                    iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
+                    dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
+
+                    flash_text_default.add_exclusion(iram_rule)
+                    flash_rodata_default.add_exclusion(dram_rule)
+
+                    expected["iram0_text"].append(iram_rule)
+                    expected["dram0_data"].append(dram_rule)
+
+            self.compare_rules(expected, actual)
+
+
+if __name__ == "__main__":
+    unittest.main()