[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/MemoryUtility/LinkerOutputParser.pm b/mcu/tools/MemoryUtility/LinkerOutputParser.pm
new file mode 100644
index 0000000..3a0a07b
--- /dev/null
+++ b/mcu/tools/MemoryUtility/LinkerOutputParser.pm
@@ -0,0 +1,1495 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   BasicMemInfoQuery.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This perl module is used to collect information from map file
+#*       
+#*
+#* History:
+#* --------
+#*   2015/10/28, Carl, Support LinkerSymPostfix::ZILength
+#*
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+package LinkerOutputParser;
+BEGIN { push @INC, './tools/', './tools/MemoryUtility/', '../' }
+use Storable;
+use MapFileParser;
+use SymFileParser;
+
+my $strFilePath;
+my $strFileType;
+
+my $check_parse = undef;
+
+my $VERNO     = " u0.01";
+                # u0.01 , 2015/01/19,  Initial revision
+    
+
+return 1;
+
+#****************************************************************************
+# subroutine:  FileParse
+#              Must be called first if you want to call other sub functions
+# input:  MAP Path string     
+# output: x  
+#****************************************************************************
+sub FileParse
+{
+	$check_parse = 1;
+	($strFilePath) = @_;
+	if ($strFilePath =~ /map$/)
+	{
+		&MapFileParser::ParseMAP($strFilePath);
+		$strFileType =~ s/map//ig;
+		$strFileType .= "MAP";
+	}
+	elsif ($strFilePath =~ /sym$/)
+	{
+		&SymFileParser::ParseSYM($strFilePath);
+		$strFileType =~ s/sym//ig;
+		$strFileType .= "SYM";
+	}
+}
+
+#****************************************************************************
+# subroutine:  StoreIntoTempFile
+# input:       N/A
+# output:      temp files which contain perl data structure
+#              MapParser_Temp.dat
+#              SymParser_Temp.dat
+#              data is stored into hash in xxxParser_Temp.dat
+#****************************************************************************
+sub StoreIntoTempFile
+{
+	die "Must run &FileParse subroutine before run &StoreIntoTempFile\n" if (!defined $check_parse);
+	my ($strPath) = @_; 
+	if ($strFileType =~ /MAP/i)
+	{
+		&MapFileParser::StoreIntoTempFile($strPath);
+	}
+	elsif ($strFileType =~ /SYM/i)
+	{
+		&SymFileParser::StoreIntoTempFile($strPath);
+	}
+}
+
+#****************************************************************************
+# subroutine:  GetParentOfSymbol
+# input:       Symbol Name, $strOption (Case sensitive)
+#                                     $strOption = "all" or "lib" or "obj"
+# output:      For map file, output is array reference,
+#                  $strOption = "all", array content:[array1,array2,...]
+#                                    array1:[obj1,lib1]
+#                  $strOption = "obj", array content:[obj1,obj2,...]
+#                  $strOption = "lib", array content:[lib1,lib2,...]
+#****************************************************************************
+sub GetParentOfSymbol
+{
+	die "Must run &FileParse subroutine before run &GetParentOfSymbol\n" if (!defined $check_parse);
+	my ($strSymbolName, $strOption) = @_;
+	my $parent_aref;
+if($strFileType =~ /MAP/i)
+	{
+		die "Option should be all/obj/lib\n" if (($strOption ne "all") && ($strOption ne "obj") && ($strOption ne "lib"));
+		$parent_aref = &MapFileParser::GetParentOfSymbol($strSymbolName, $strOption);
+	}
+	return $parent_aref;
+}
+
+#****************************************************************************
+# subroutine:  GetChildOfSymbol
+# input:       Symbol Name (Case sensitive)
+# output:  For map file,  output is array reference,
+#              array content:[sym1,sym2,...]
+#****************************************************************************
+sub GetChildOfSymbol
+{
+	die "Must run &FileParse subroutine before run &GetChildOfSymbol\n" if (!defined $check_parse);
+	my ($strSymbolName) = @_;
+	my $child_aref;
+    if($strFileType =~ /MAP/i)
+	{
+		$child_aref = &MapFileParser::GetChildOfSymbol($strSymbolName);
+	}
+	return $child_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListAllExeRegion
+# input:       $bTrimDebugRegion: only useful for GCC. 
+#              1= NeedtoTrimDebugRegion, 0 or undef=NoNeedToTrimDebugRegion
+# output:  For map file,  output is array reference,
+#              array content:[ExeRegionName1,ExeRegionName2,...] 
+#****************************************************************************
+sub ListAllExeRegion
+{
+	die "Must run &FileParse subroutine before run &ListAllExeRegion\n" if (!defined $check_parse);
+	my ($bTrimDebugRegion) = @_;
+	my $ExeRegion_aref;
+	
+	if($strFileType =~ /SYM/i)
+	{
+		$ExeRegion_aref = &SymFileParser::ListAllExeRegion($bTrimDebugRegion);
+	}
+	return $ExeRegion_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListAllLoadRegion
+# input:       N/A
+# output:      for map file, output array reference
+#                  array content: [LoadRegionName1,LoadRegionName2,...]
+#****************************************************************************
+sub ListAllLoadRegion
+{
+	die "Must run &FileParse subroutine before run &ListAllLoadRegion\n" if (!defined $check_parse);
+	my $LoadRegion_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$LoadRegion_aref = &MapFileParser::ListAllLoadRegion;
+	}
+	return $LoadRegion_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListPadInfo
+# input:       N/A
+# output:      array reference
+#              for map file, array content:[pad_array1,pad_array2,...]
+#                            pad_array1:[strPadBaseAddress,[strPreObjName,strPreLibName],strPreObjAddress,[strPostObjName,strPostLibName],strPostObjAddress]
+#****************************************************************************
+sub ListPadInfo
+{
+	die "Must run &FileParse subroutine before run &ListPadInfo\n" if (!defined $check_parse);
+	my $pad_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$pad_aref = &MapFileParser::ListPadInfo;
+	}
+	return $pad_aref;
+}
+
+#****************************************************************************
+# subroutine:  GetVeneerInfo
+# input:       N/A
+# output:      array reference, array content:[veneer_array1,veneer_arry2,...]
+#              for map file, 
+#              veneer_array1 content:[strExeRegionName,strBaseAddress,strSize]
+#****************************************************************************
+sub GetVeneerInfo
+{
+	die "Must run &FileParse subroutine before run &GetVeneerInfo\n" if (!defined $check_parse);
+	my $veneer_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$veneer_aref = &MapFileParser::GetVeneerInfo;
+	}
+	return $veneer_aref;
+}
+
+#****************************************************************************
+# subroutine:  GetObjSizeByExeRegion
+# input:       ExeRegion Name, Object Name, Library Name(Case sensitive)
+#                              Object Name should contain ".obj"
+#                              Library Name should contain ".lib"
+# output:      size of object in given execution region
+#****************************************************************************
+sub GetObjSizeByExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetObjSizeByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName, $strObjName, $strLibName) = @_;
+	die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
+	die "Library name must contain .lib/.a postfix\n" if ($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/);
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetObjSizeByExeRegion($strExeRegionName, $strObjName, $strLibName);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetObjSizeByCatExeRegion
+# input:       ExeRegion Name, Object Name, $strCategory(Case sensitive)
+#                              Object Name should contain ".obj"
+#                              $strCategory: RO Data/RW Data/ZI Data/Code for lis
+#                                            RO/RW/ZI for map
+# output:      RO/RW/ZI/RWZI size of object in given execution region
+#****************************************************************************
+sub GetObjSizeByCatExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetObjSizeByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName, $strObjName, $strCategory) = @_;
+	my $n_size = 0;
+	die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
+	if($strFileType =~ /MAP/i)
+	{
+	    die "Category should be RO/RW/ZI\n"
+	        if (($strCategory ne "RO") && ($strCategory ne "RW") && ($strCategory ne "ZI"));
+		my $nObjCateSize_ref = &MapFileParser::GetObjSizeByCatExeRegion($strExeRegionName, $strCategory);
+		$n_size = $$nObjCateSize_ref{$strObjName};
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetLibSizeByExeRegion
+# input:       Execution Region Name, Library Name (Case sensitive)
+#                                     Library Name should contain ".lib"
+# output:      size of given library in givin execution region
+#****************************************************************************
+sub GetLibSizeByExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetLibSizeByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName, $strLibName) = @_;
+	die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetLibSizeByExeRegion($strExeRegionName, $strLibName);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetObjByExeRegion
+# input:       Execution Region Name (Case sensitive)
+# output:      array reference which given execution region contains
+#              array content:[strObjName1,strObjName2,...]
+#****************************************************************************
+sub GetObjByExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetObjByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName) = @_;
+	my $obj_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$obj_aref = &MapFileParser::GetObjByExeRegion($strExeRegionName);
+	}
+	return $obj_aref;
+}
+
+#****************************************************************************
+# subroutine:  GetLibByExeRegion
+# input:       Execution Region Name (Case sensitive)
+# output:      array reference which given execution region contains
+#              array content:[strLibName1,strLibName2,...]
+#****************************************************************************
+sub GetLibByExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetLibByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName) = @_;
+	my $lib_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$lib_aref = &MapFileParser::GetLibByExeRegion($strExeRegionName);
+	}
+	return $lib_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListObjSummaryInfo
+# input:       obj name, strOption represents which column to show(Case sensitive)
+#              OBJ name should contain ".obj"
+#                        strOption = "Code"
+#                                  = "inc.data"
+#                                  = "RO Data"
+#                                  = "RW Data"
+#                                  = "ZI Data"
+#                                  = "Debug"
+# output:  for map file, output undef
+#****************************************************************************
+sub ListObjSummaryInfo
+{
+	die "Must run &FileParse subroutine before run &ListObjSummaryInfo\n" if (!defined $check_parse);
+	my ($strObjName, $strOption) = @_;
+	die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+	    die "Input should be RO/RW/ZI/Debug\n" if (($strOption ne "RO") && ($strOption ne "RW") && ($strOption ne "ZI") && ($strOption ne "Debug"));
+		$n_size = &MapFileParser::ListObjSummaryInfo($strObjName, $strOption);
+	}
+	$n_size = 0 if(!defined $n_size or $n_size eq "");
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  ListLibSummaryInfo
+# input:       lib name, strOption represents which column to show(Case sensitive)
+#              Lib name should contain ".lib"
+#                        strOption = "Code"
+#                                = "inc.data"
+#                                = "RO Data"
+#                                = "RW Data"
+#                                = "ZI Data"
+#                                = "Debug"
+# output:  for map file, output undef
+#****************************************************************************
+sub ListLibSummaryInfo
+{
+	die "Must run &FileParse subroutine before run &ListLibSummaryInfo\n" if (!defined $check_parse);
+	my ($strLibName, $strOption) = @_;
+	die "Library name must contain .lib/.a postfix\n" if ($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/);
+	my $n_size = 0;
+	if($strFileType =~ /MAP/i)
+	{
+	    die "Input should be RO/RW/ZI/Debug\n" if (($strOption ne "RO") && ($strOption ne "RW") && ($strOption ne "ZI") && ($strOption ne "Debug"));
+		$n_size = &MapFileParser::ListLibSummaryInfo($strLibName, $strOption);
+	}
+	$n_size = 0 if(!defined $n_size or $n_size eq "");
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetVMAByExeRegion
+# input:       $strRegionName: Execution Region Name (Case sensitive)
+# output:      VMA for given execution region
+#****************************************************************************
+sub GetVMAByExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetBaseAddrByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName) = @_;
+	my $n_size;
+	if($strFileType =~ /SYM/i)
+	{
+		$n_size = hex(&SymFileParser::GetExeRegionInfo($strExeRegionName, Region::VMA));
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetTotalSizeByExeRegion
+# input:       $strRegionName: Execution Region Name (Case sensitive)
+# output:      total size for given execution region
+#****************************************************************************
+sub GetTotalSizeByExeRegion
+{
+	die "Must run &FileParse subroutine before run &GetTotalSizeByExeRegion\n" if (!defined $check_parse);
+	my ($strExeRegionName) = @_;
+	my $n_size;
+	if($strFileType =~ /SYM/i)
+	{
+		$n_size = hex(&SymFileParser::GetExeRegionInfo($strExeRegionName, Region::Size));
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetTotalSizeByLib
+# input:       $strLibName: Library Name (Case sensitive)
+#                           Library Name should contain ".lib"
+# output:      total size for given library
+#****************************************************************************
+sub GetTotalSizeByLib
+{
+	die "Must run &FileParse subroutine before run &GetTotalSizeByLib\n" if (!defined $check_parse);
+	my ($strLibName) = @_;
+	die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetTotalSizeByLib($strLibName);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetTotalSizeByObj
+# input:       $strObjName: Obj Name, $strLibName: Library Name (Case sensitive)
+#                           Object Name should contain ".obj"
+#                           Library Name should contain ".lib"
+# output:      total size for given (obj, library)
+#****************************************************************************
+sub GetTotalSizeByObj
+{
+	die "Must run &FileParse subroutine before run &GetTotalSizeByObj\n" if (!defined $check_parse);
+	my ($strObjName, $strLibName) = @_;
+	die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
+	die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetTotalSizeByObj($strObjName, $strLibName);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  ListObjLibBySymbol
+# input:       $strSymName: Symbol Name (Case sensitive)
+# output:      for map file, output array reference
+#                            array content:[[strObjName1,strLibName1],[strObjName2,strLibName2],...]
+#****************************************************************************
+sub ListObjLibBySymbol
+{
+	die "Must run &FileParse subroutine before run &ListObjLibBySymbol\n" if (!defined $check_parse);
+	my ($strSymName) = @_;
+	my $obj_lib_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$obj_lib_aref = &MapFileParser::ListObjLibBySymbol($strSymName);
+	}
+	return $obj_lib_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListObjByLib
+# input:       $strLibName: Library Name (Case sensitive)
+#                           Library Name should contain ".lib"
+# output:      obj array reference associated with given library
+#              array content:[strObjName1,strObjName2,...]
+#****************************************************************************
+sub ListObjByLib
+{
+	die "Must run &FileParse subroutine before run &ListObjByLib\n" if (!defined $check_parse);
+	my ($strLibName) = @_;
+	die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
+	my $obj_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$obj_aref = &MapFileParser::ListObjByLib($strLibName);
+	}
+	return $obj_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListLibByObj
+# input:       $ObjName: Object Name (Case sensitive)
+#                        Object Name should contain ".obj"
+# output:      Library array reference associated with given object
+#              array content:[strLibName1,strLibName2,...]
+#****************************************************************************
+sub ListLibByObj
+{
+	die "Must run &FileParse subroutine before run &ListLibByObj\n" if (!defined $check_parse);
+	my ($strObjName) = @_;
+	die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);	
+	my $lib_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$lib_aref = &MapFileParser::ListLibByObj($strObjName);
+	}	
+	return $lib_aref;
+}
+
+#****************************************************************************
+# subroutine:  ListObjLibByAddr
+# input:       symbol address
+# output:      objeck and lib info
+#****************************************************************************
+sub ListObjLibByAddr
+{
+    die "Must run &FileParse subroutine before run &ListObjLibByAddr\n" if (!defined $check_parse);
+
+    my ($strAddress) = @_;
+    my $obj_lib_by_addr;
+    
+    if($strFileType =~ /MAP/i)
+	{
+		$obj_lib_by_addr = &MapFileParser::ListObjLibByAddr($strAddress);
+	}	
+    return $obj_lib_by_addr;
+}
+
+#****************************************************************************
+# subroutine:  GetObjDebugInfoSize
+# input:       $strObjName: Obj Name (Case sensitive)
+#                           Object Name should contain ".obj"
+# output:      debug info size for given obj
+#****************************************************************************
+sub GetObjDebugInfoSize
+{
+	die "Must run &FileParse subroutine before run &GetObjDebugInfoSize\n" if (!defined $check_parse);
+	my ($strObjName) = @_;
+	die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
+	my $n_debugsize;
+    if($strFileType =~ /MAP/i)
+	{
+		$n_debugsize = &MapFileParser::GetObjDebugInfoSize($strObjName);
+	}
+	return $n_debugsize;
+}
+
+#****************************************************************************
+# subroutine:  FootprintAnalyzeBySymbol
+# input:       $strSymName: Symbol Name, $strObjName: Obj Name (Case sensitive)
+#                           Object Name should contain ".obj" (Not necessary input for GCC SYM file)
+# output:      symbol info array reference
+#              for non Ven/Pad symbol in lis file,[strExeRegionName,strAttr,strBaseAddress,strSize]
+#              for Ven symbol in lis file,[strExeRegionName,strAttr,strBaseAddress,strSize,strDestinationSymbol]
+#              for symbol in sym file,[strExeRegionName,strAttr,strBaseAddress,strSize]
+#****************************************************************************
+sub FootprintAnalyzeBySymbol
+{
+	die "Must run &FileParse subroutine before run &FootprintAnalyzeBySymbol\n" if (!defined $check_parse);
+	my ($strSymName, $strObjName) = @_;
+	my $SymbolInfo_ref;
+	if($strFileType =~ /SYM/i)
+	{
+		$SymbolInfo_ref = &SymFileParser::FootprintAnalyzeBySymbol($strSymName);
+	}
+	return $SymbolInfo_ref;
+}
+#****************************************************************************
+# subroutine:  GetSymbolTable
+# input:       N/A
+# output:      symbol info hash reference in the following format:
+#              $strAddress.$strSymbolName => [strSymbol, $strAddress, strGroup, strRegion, nSize]
+#****************************************************************************
+sub GetSymbolTable
+{
+	die "Must run &FileParse subroutine before run &GetSymbolTable\n" if (!defined $check_parse);
+	my $SymbolInfo_aref;
+	if($strFileType =~ /SYM/i)
+	{
+		$SymbolInfo_aref = &SymFileParser::GetSymbolTable();
+	}
+	return $SymbolInfo_aref;
+}
+
+#****************************************************************************
+# subroutine:  GrepSymbolBySection
+# input:       $strSectionName
+# output:      symbol info array reference in order of address in the following format:
+#              [[strSymbol, $strAddress, strGroup, strRegion, nSize], ...]
+#****************************************************************************
+sub GrepSymbolBySection
+{
+	die "Must run &FileParse subroutine before run &GrepSymbolBySection\n" if (!defined $check_parse);
+	my ($strSectionName) = @_;
+	my $SymbolInfo_aref;
+	if($strFileType =~ /SYM/i)
+	{
+		$SymbolInfo_aref = &SymFileParser::GrepSymbolBySection($strSectionName);
+	}
+    return $SymbolInfo_aref;
+}
+
+#****************************************************************************
+# subroutine:  GetSymbolInfo
+# input:       $strAddress.".".$SymbolName
+# output:     [$SymbolName, $strAddress, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize]
+#                            
+#****************************************************************************
+sub GetSymbolInfo{
+
+	die "Must run &FileParse subroutine before run &GetSymbolInfo\n" if (!defined $check_parse);
+	my ($symbol_key) = @_;
+	my @symbol_info;
+	
+	if($strFileType =~ /MAP/i)
+	{
+		@symbol_info = &MapFileParser::GetSymbolInfo($symbol_key);
+	}
+	return @symbol_info;
+}
+
+sub GetSymbol
+{
+	my $SymbolInfo_aref;
+	if($strFileType =~ /SYM/i)
+	{
+		$SymbolInfo_aref = &SymFileParser::GetSymbol();
+	}
+    return $SymbolInfo_aref;
+}
+
+sub GetFillInfo
+{
+	my $FillInfo_href;
+	if($strFileType =~ /MAP/i)
+	{
+		$FillInfo_href = &MapFileParser::GetFillInfo();
+	}
+    return $FillInfo_href;
+}
+
+#****************************************************************************
+# subroutine:  GetLinkerSymbolAddress
+# input:       nRegionType = 0: Execution Region
+#              nRegionType = 1: Load Region
+#              nRegionType = 2: Input Section
+#              nLocation: Base       => LinkerSymPostfix::Base;
+#                         Limit      => LinkerSymPostfix::Limit;
+#                         ZIBase     => LinkerSymPostfix::ZIBase;
+#                         ZILimit    => LinkerSymPostfix::ZILimit;
+#                         Length     => LinkerSymPostfix::Length;
+#                         ZILength   => LinkerSymPostfix::ZILength;
+# output:      address in string
+#****************************************************************************
+sub GetLinkerSymbolAddress
+{
+	die "Must run &FileParse subroutine before run &GetLinkerSymbolAddress\n" if (!defined $check_parse);
+	my ($strRegionName, $nLocation, $nRegionType) = @_;
+	my $strAddr;
+	if($strFileType =~ /SYM/i)
+	{
+		$strAddr = &SymFileParser::GetLinkerSymbolAddress($strRegionName, $nLocation, $nRegionType);
+	}
+    return $strAddr;
+}
+
+#****************************************************************************
+# subroutine:  Get_DUMMY_END_Size
+# input:       N/A
+# output:      size of DUMMY_END region
+#****************************************************************************
+sub Get_DUMMY_END_Size
+{
+	my $DUMMY_END_size;
+	if($strFileType =~ /SYM/i)
+	{
+		$DUMMY_END_size = &SymFileParser::Get_DUMMY_END_Size;
+	}
+	return $DUMMY_END_size;
+}
+
+#****************************************************************************
+# subroutine:  Get_DUMMY_END_Base
+# input:       N/A
+# output:      base address of DUMMY_END region
+#****************************************************************************
+sub Get_DUMMY_END_Base
+{
+	my $DUMMY_END_base;
+	if($strFileType =~ /SYM/i)
+	{
+		$DUMMY_END_base = &SymFileParser::Get_DUMMY_END_Base;
+	}
+	return $DUMMY_END_base;
+}
+
+#****************************************************************************
+# subroutine:  GetExeRegionInfo - Get Execution Region information
+# input:       $strRegionName: Execution Name (Case sensitive)
+#              $nOption for MAP file: Region::VMA
+#                                    Region::LMA
+#                                    Region::Size 
+#                                    Region::Offsets
+#                                    Region::Align
+#                                    Region::Attr
+# output:      required ExeRegion Base address, Used Size, Region MaxSize, Attribute info...
+#****************************************************************************
+sub GetExeRegionInfo
+{
+	die "Must run &FileParse subroutine before run &GetExeRegionInfo\n" if (!defined $check_parse);
+	my ($strRegionName, $nOption) = @_;
+	my $strInfo;
+	if($strFileType =~ /SYM/i)
+	{
+		die "Option should be Region::VMA/Region::LMA/Region::Size/Region::Offsets/Region::Align/Region::Attr\n" if (($nOption ne Region::VMA) && ($nOption ne Region::LMA) && ($nOption ne Region::Size) && ($nOption ne Region::Offsets) && ($nOption ne Region::Align) && ($nOption ne Region::Attr));
+		$strInfo = &SymFileParser::GetExeRegionInfo($strRegionName, $nOption);
+	}
+	return $strInfo;
+}
+
+#****************************************************************************
+# subroutine:  GetLoadRegionInfo - Get Load Region information
+#              $nOption for map file: LoadRegion::Base
+#                                     LoadRegion::Size
+#                                     LoadRegion::MaxSize
+#                                     LoadRegion::Attr
+# output:      required LoadRegion Base address, Used Size, Region MaxSize, Attribute info
+#****************************************************************************
+sub GetLoadRegionInfo
+{
+	die "Must run &FileParse subroutine before run &GetLoadRegionInfo\n" if (!defined $check_parse);
+	my ($strRegionName, $nOption) = @_;
+	my $strInfo;
+    if($strFileType =~ /MAP/i)
+	{
+		$strInfo = &MapFileParser::GetLoadRegionInfo;
+	}
+	return $strInfo;
+}
+
+#****************************************************************************
+# subroutine:  GetExeRegionAttr - Get Region attribution
+# output:        region attribution =>[RO RW ZI]
+#****************************************************************************
+sub GetExeRegionAttr
+{
+	die "Must run &FileParse subroutine before run &GetExeRegionAttr\n" if (!defined $check_parse);
+	my $region_attr;
+    if($strFileType =~ /MAP/i)
+	{
+		$region_attr = &MapFileParser::GetExeRegionAttr;
+	}
+	return $region_attr;
+}
+
+#****************************************************************************
+# subroutine:  GetTotalROSize - Get total RO size
+# input:       $bNeedString: 1=Return string, 0/default/no input=Return int
+# output:      $bNeedString=0:nROSize/ $bNeedString=1:strROSize
+#****************************************************************************
+sub GetTotalROSize
+{
+	die "Must run &FileParse subroutine before run &GetTotalROSize\n" if (!defined $check_parse);
+	my ($bNeedString) = @_;
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetTotalROSize($bNeedString);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetTotalRWZISize - Get total RWZI size
+# input:       $bNeedString: 1=Return string, 0/default/no input=Return int
+# output:      $bNeedString=0:nRWZISize/ $bNeedString=1:strRWZISize
+#****************************************************************************
+sub GetTotalRWZISize
+{
+	die "Must run &FileParse subroutine before run &GetTotalRWZISize\n" if (!defined $check_parse);
+	my ($bNeedString) = @_;
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetTotalRWZISize($bNeedString);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  GetTotalROMSize - Get total ROM size
+# input:       $bNeedString: 1=Return string, 0/default/no input=Return int
+# output:      $bNeedString=0:nROMSize/ $bNeedString=1:strROMSize
+#****************************************************************************
+sub GetTotalROMSize
+{
+	die "Must run &FileParse subroutine before run &GetTotalROMSize\n" if (!defined $check_parse);
+	my ($bNeedString) = @_;
+	my $n_size;
+	if($strFileType =~ /MAP/i)
+	{
+		$n_size = &MapFileParser::GetTotalROMSize($bNeedString);
+	}
+	return $n_size;
+}
+
+#****************************************************************************
+# subroutine:  PadFillExeregSize -- search *fill* padding info for RO and RWZI in INTSRAM region
+# input:       execution region name, memory type
+# output:      memory size
+#****************************************************************************
+sub PadFillExeregSize
+{
+	my ($exeregion, $type)= @_;
+	my $size;
+	$size = &MapFileParser::PadFillExeregSize($exeregion, $type);
+	return $size;
+}
+
+#****************************************************************************
+# subroutine:  GrepSymbolByInputSection
+# input:       input section name represent in regular expression
+#              ex: INTSRAM_ROCODE.*
+#                  INTSRAM_ROCODE_A
+#                  INTSRAM_ROCODE_B
+#
+# output:      symbol info array reference in order of address in the following format: 
+#              [[$strSymbolName, $strAddress, $strObjName, $strLibName, $strOutputSectionName, $strInputSectionName, $nSize], ...] 
+#****************************************************************************
+sub GrepSymbolByInputSection
+{
+	die "Must run &FileParse subroutine before run &GrepSymbolByInputSection\n" if (!defined $check_parse);
+	my ($strSectionNameInRegularExp) = @_;
+	my $syminfo_aref;
+	if($strFileType =~ /MAP/i)
+	{
+		$syminfo_aref = &MapFileParser::GrepSymbolByInputSection($strSectionNameInRegularExp);
+	}
+	return $syminfo_aref;
+}
+
+
+#****************************************************************************
+# subroutine:  GrepSymbolByOutputSection
+# input:       input section name represent in regular expression
+#              ex: CACHED_EXTSRAM_L2CACHE_LOCK_DATA
+#                  CACHED_EXTSRAM_L2CACHE_LOCK_DATA
+#                  CACHED_EXTSRAM_L2CACHE_LOCK_DATA_ZI
+#
+# output:      symbol info array reference in order of address in the following format: 
+#              [[$strObjName, $strLibName],  [$strObjName, $strLibName] ...] 
+#****************************************************************************
+sub GrepSymbolByOutputSection
+{
+	die "Must run &FileParse subroutine before run &GrepSymbolByInputSection\n" if (!defined $check_parse);
+	my ($strSectionNameInRegularExp) = @_;
+	my $syminfo_aref;
+	if($strFileType =~ /SYM/i)
+	{
+		$syminfo_aref = &SymFileParser::GrepSymbolByOutputSection($strSectionNameInRegularExp);
+	}
+	return $syminfo_aref;
+}
+
+
+__END__
+
+=head1 NAME
+
+LinkerOutputParser - Perl module to parse linker output files: .lis/.map/.sym
+
+=head1 SYNOPSIS
+
+    use LinkerOutputParser;
+
+=head2 Table of Contents
+
+LinkerOutputParser consists of a collection of modules whose details 
+are too big to fit in one document.  This POD itself explains the 
+top-level APIs and general topics at a glance.  For other topics and 
+more details, see the PODs below:
+
+  Name			        Description
+  --------------------------------------------------------
+  LisFileParser         Parser module for .lis file
+  MapFileParser         Parser module for .map file
+  SymFileParser         Parser module for .sym file
+  --------------------------------------------------------
+
+=head1 DESCRIPTION
+
+The module provides the interfaces to parse RVCT/GCC linker output files.
+
+=head1 EXAMPLES
+
+Here are some code samples showing a possible usage of LinkerOutputParser:
+
+1. How do I get all execution region list from .lis/.sym file?	
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $exeregion_aref = &LinkerOutputParser::ListAllExeRegion;
+	if (defined $exeregion_aref)
+	{
+		foreach my $temp(@$exeregion_aref)
+		{
+			print "$temp\n";
+		}
+	}
+
+which prints (on my machine):
+
+	BL_GFH_SECTION
+	READ_ONLY
+	READ_ONLY_HEAD
+	READ_ONLY_TAIL
+	READ_WRITE
+	READ_ONLY_INT
+	READ_WRITE_INT
+	EMIINIT_CODE
+	STACK_AREA
+	EXT_UN_INIT
+	SHARE_BUF
+	READ_WRITE_SYS_RAM
+	DUMMY_END
+	BL_SIGNATURE_SECTION
+
+2. How do I get al load region list from .lis file?
+
+    use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $loadregion_aref = &LinkerOutputParser::ListAllLoadRegion;
+	if (defined $loadregion_aref)
+	{
+		foreach my $temp(@$loadregion_aref)
+		{
+			print "$temp\n";
+		}
+	}
+
+which prints (on my machine):
+
+	READ_ONLY
+
+3. How do I get base address/size/maxsize/attribute of an execution region?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $base_address = &LinkerOutputParser::GetExeRegionInfo('BL_GFH_SECTION', ExecutionRegion::Base);
+	print "$base_address\n";
+
+	my $size = &LinkerOutputParser::GetExeRegionInfo('BL_GFH_SECTION', ExecutionRegion::Size);
+	print "$size\n";
+
+which prints (on my machine):
+
+	0x40000900
+	0x150
+	
+4. How do I get base address/size/maxsize/attribute of an load region?
+	
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $base_address = &LinkerOutputParser::GetLoadRegionInfo('READ_ONLY', LoadRegion::Base);
+	print "$base_address\n";
+
+	my $size = &LinkerOutputParser::GetLoadRegionInfo('READ_ONLY', LoadRegion::Size);
+	print "$size\n";
+
+which prints (on my machine):
+
+	0x40000900
+	0x4114
+	
+5. How do I get all objects in an execution region?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $obj_aref = &LinkerOutputParser::GetObjByExeRegion("BL_GFH_SECTION");
+	if (defined $obj_aref)
+	{
+		foreach my $temp(@$obj_aref)
+		{
+			print "$temp\n";
+		}
+	}
+
+which prints (on my machine):
+
+	bl_GFH_body.obj
+	custom_emi_MT6255.obj
+	bl_Secure_v5.obj
+
+6. How do I get all libraries in an execution region?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $lib_aref = &LinkerOutputParser::GetLibByExeRegion("READ_ONLY_TAIL");
+	if (defined $lib_aref)
+	{
+		foreach my $temp(@$lib_aref)
+		{
+			print "$temp\n";
+		}
+	}
+
+which prints (on my machine):
+
+	bootloader.lib
+	sss_rvct_sv5.lib
+	c_5.l
+	h_5.l
+	f_5s.l
+	sst_sec.lib
+	
+7. How do I get object, library associated with a symbol?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $objlib_aref = &LinkerOutputParser::ListObjLibBySymbol(".text");
+	foreach my $temp(@$objlib_aref)
+	{
+		print "$temp->[0], $temp->[1]\n";
+	}
+
+which prints (on my machine):
+
+	strcpy.o, c_5.l
+	_fptrap.o, c_5.l
+	defsig_fpe_outer.o, c_5.l
+	defsig_exit.o, c_5.l
+	defsig_fpe_inner.o, c_5.l
+	defsig_general.o, c_5.l
+	sys_wrch.o, c_5.l
+	rt_memcpy_w.o, c_5.l
+	rt_memclr_w.o, c_5.l
+	llmullu.o, h_5.l
+	rt_memmove_w.o, c_5.l
+	llmul.o, c_5.l
+	rt_fp_status_addr.o, c_5.l
+	sys_exit.o, c_5.l
+	use_no_semi.o, c_5.l
+	
+8. How do I get all objects in a library?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $obj_aref = &LinkerOutputParser::ListObjByLib("sst_sec.lib");
+	if(defined $obj_aref)
+	{
+		foreach my $temp(@$obj_aref)
+		{
+			print "$temp\n";
+		}
+	}
+
+which prints (on my machine):
+
+	SSS_interface.obj
+	br_crypto_platform.obj
+	
+9. How do I get all libraries associated with an object?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $lib_aref = &LinkerOutputParser::ListLibByObj("lpwr.obj");
+	if(defined $lib_aref)
+	{
+		foreach my $temp(@$lib_aref)
+		{
+			print "$temp\n";
+		}
+	}
+
+which prints (on my machine):
+
+	bootloader.lib
+	
+10. How do I get execution region total size?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $exeregion_size = &LinkerOutputParser::GetTotalSizeByExeRegion("BL_GFH_SECTION");  
+	print "$exeregion_size\n";
+
+which prints (on my machine):
+
+	336
+	
+11. How do I get total size of a library?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $lib_size = &LinkerOutputParser::GetTotalSizeByLib("f_5s.l");  
+	print "$lib_size\n";
+
+which prints (on my machine):
+
+	1320
+	
+12. How do I get total size of an object?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+
+	my $obj_size = &LinkerOutputParser::GetTotalSizeByObj("bl_BOOTARM.obj","bootloader.lib");  
+	print "$obj_size\n";
+	
+which prints (on my machine):
+
+	4304
+	
+13. How do I get size of an object in a certain execution region?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $obj_size = &LinkerOutputParser::GetObjSizeByExeRegion("READ_ONLY_TAIL", "bl_FTL.obj", "bootloader.lib"); 
+	print "$obj_size\n";
+	
+which prints (on my machine):
+
+	256
+
+14. How do I get size of a library in a certain execution region?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $lib_size = &LinkerOutputParser::GetLibSizeByExeRegion("BL_GFH_SECTION", "bootloader.lib");  ##300
+	print "$lib_size\n";
+	
+which prints (on my machine):
+
+	288
+
+15. How do I get total RO size for a .lis file?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $ROSize = &LinkerOutputParser::GetTotalROSize;
+	print "Total ROSize is $ROSize\n";
+	
+which prints (on my machine):
+
+	Total ROSize is 16452
+	
+16. How do I get total RWZI size for a .lis file?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $RWZISize = &LinkerOutputParser::GetTotalRWZISize;
+	print "Total RWZISize is $RWZISize\n";
+	
+which prints (on my machine):
+
+	Total RWZISize is 52864
+	
+17. How do I get total ROM size for a .lis file?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $ROMSize = &LinkerOutputParser::GetTotalROMSize;
+	print "Total ROMSize is $ROMSize\n";
+	
+which prints (on my machine):
+
+	Total ROMSize is 16660
+	
+18. How do I get debug info size for an object?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $debug_size = &LinkerOutputParser::GetObjDebugInfoSize('SSS_Secure_v5.obj');
+	print "$debug_size\n";
+	
+which prints (on my machine):
+
+	4683
+	
+19. How do I get footprint infomation of a symbol?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $footprint_info_ref = &LinkerOutputParser::FootprintAnalyzeBySymbol("i.CacheInitMini", "bl_Cache.obj");
+	foreach my $temp(@$footprint_info_ref)  ### array content: [ExecutionRegionName, Attribute, BaseAddress, Size] for common symbols
+	{                                       ### array content: [ExecutionRegionName, Attribute, BaseAddress, Size, DestinationSymbol] for veneers
+		print "$temp\n";
+	}
+	print "\n";
+	
+which prints (on my machine):
+
+	READ_ONLY_TAIL
+	RO-Code
+	0x40000b8c
+	0x0000000c
+	
+20. How do I get parent symbols which refer to certain symbol?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $parent_aref = &LinkerOutputParser::GetParentOfSymbol("NFIDriverInit");
+	if(defined $parent_aref)
+	{
+		foreach my $temp(@$parent_aref)
+		{
+			print "$temp\n";
+		}
+	}
+	
+which prints (on my machine):
+
+	Init
+	
+21. How do I get child symbols which certain symbol refers to?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $child_aref = &LinkerOutputParser::GetChildOfSymbol("itoa");
+	if(defined $child_aref)
+	{
+		foreach my $temp(@$child_aref)
+		{
+			print "$temp\n";
+		}
+	}
+	
+which prints (on my machine):
+
+	__aeabi_idivmod
+	.bss
+	
+22. How do I know pad infomation?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $pad_aref = &LinkerOutputParser::ListPadInfo;
+	if (defined $pad_aref)               
+	{
+		foreach my $temp(@$pad_aref)
+		{
+			print "$temp->[0], $temp->[1], $temp->[2], $temp->[3], $temp->[4]\n";
+			### array content: [pad_address, previous_symbol_name, previous_symbol_address, post_symbol_name, post_symbol_address]
+		}
+	}
+
+which prints (on my machine):
+
+	0x40004075, x$divrt, 0x40003e80, x$fpl$dcmpinfnan, 0x40004078
+	0x40004545, .constdata, 0x40004544, .constdata, 0x40004548
+	0x40004652, .constdata, 0x40004548, .constdata, 0x40004654
+	0x4000471a, .constdata, 0x40004654, .constdata, 0x4000471c
+	0x40004822, .constdata, 0x4000471c, .constdata, 0x40004824
+	0x40004b97, .bss, 0x4000496c, .bss, 0x40004b98
+	0x40004bed, .bss, 0x40004bec, .bss, 0x40004bf0
+	0x50000076, INTERNCODE, 0x50000068, INTERNCODE, 0x50000078
+	0x40000e9e, i.TimeStampInit, 0x40000e9c, i.VerifyExtBootloader, 0x40000ea0
+	0x40000ef2, EMIINITCODE, 0x40000eea, EMIINITCODE, 0x40000ef4
+	0x40001cbe, i.GFH_Find, 0x40001cac, i.GFH_Internal_Parser, 0x40001cc0
+	0x40003302, i.dbg_print, 0x400032ec, i.lpwr_default_callback, 0x40003304
+
+23. How do I know veneer infomation?	
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $veneer_aref = &LinkerOutputParser::GetVeneerInfo;
+	if(defined $veneer_aref)
+	{
+		foreach my $temp(@$veneer_aref)
+		{
+			print "$temp->[0], $temp->[1], $temp->[2], $temp->[3]\n";
+			### array content: [ExecutionRegionName, BaseAddress, Size, DestinationSymbolName]
+		}
+	}
+
+which prints (on my machine):
+
+	READ_ONLY_TAIL, 0x40000c84, 0x00000008, JumpToExtBootloader
+	READ_ONLY_TAIL, 0x40002808, 0x00000008, CP_Crypto_Init
+	READ_ONLY_TAIL, 0x40002810, 0x00000008, CP_Get_MTK_Cipher_Key_Len
+	READ_ONLY_TAIL, 0x40002818, 0x00000008, SaveAndSetIRQMask
+	READ_ONLY_TAIL, 0x40002820, 0x00000008, RestoreIRQMask
+	READ_ONLY_TAIL, 0x40002828, 0x00000008, JumpCmd
+	READ_ONLY_INT, 0x5000004c, 0x00000008, SSS_Crypto_Config_Init
+	READ_ONLY_INT, 0x50000054, 0x00000008, SSS_Crypto_Context_Validation
+	READ_ONLY_INT, 0x5000005c, 0x00000008, ASSERT
+
+24. What if I want to know Code/RO/RW/ZI/Debug size of an object?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $ZIData_size = &LinkerOutputParser::ListObjSummaryInfo("lpwr.obj", "ZI Data");
+	print "$ZIData_size\n";
+
+	my $Debug_size = &LinkerOutputParser::ListObjSummaryInfo("lpwr.obj", "Debug");
+	print "$Debug_size\n";
+
+which prints (on my machine):
+
+	1946
+	6344
+	
+25. What if I want to know Code/RO/RW/ZI/Debug size of a library?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);  # Must run this subroutine first for other activities
+	
+	my $ROData_size = &LinkerOutputParser::ListLibSummaryInfo("bootloader.lib", "RO Data");
+	print "$ROData_size\n";
+
+	my $RWData_size = &LinkerOutputParser::ListLibSummaryInfo("bootloader.lib", "RW Data");
+	print "$RWData_size\n";
+
+which prints (on my machine):
+
+	917
+	208
+
+26. How to retrieve data from temp files which reserved when parsing?
+
+	use LinkerOutputParser;
+
+	my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
+	
+	&LinkerOutputParser::FileParse($file);
+	&LinkerOutputParser::StoreIntoTempFile("E:\\mtk80506");   ## You can identify your preferred path to store temp files
+	
+	my $data_hash = retrieve 'E:\\mtk80506\\LisParser_Temp.dat';    ## temp file names: your_path\LisParser_Temp.dat or your_path\SymParser_Temp.dat or your_path\MapParser_Temp.dat
+	foreach my $key (keys %$data_hash)
+	{
+		print "$key\n";
+	}
+
+which prints (on my machine):
+	
+	debug_size
+	parent_reference
+	symbol_info
+	obj_summary
+	execution_region
+	child_reference
+	load_region
+	lib_summary
+	
+	Then you can retrieve more detailed data, for example, you want to retrieve "child_reference" data (usually are hash/array reference):
+	
+	my $child_value = $$data_hash{"child_reference"};
+
+	foreach my $key (keys %$child_value)
+	{
+		my $array_ref = $$child_value{$key};
+		foreach my $temp(@$array_ref)
+		{
+			print "$key->$temp\n";
+		}
+	}
+
+which prints (on my machine):
+	
+	lpwr_group_init->.bss
+	lpwr_group_init->.constdata
+	_3DES_KeyOptionHandler->__aeabi_memcpy
+	Init->uart_init
+	Init->set_debug_level
+	Init->bl_print
+	Init->DclF32K_Initialize
+	Init->WaitFor32KStable
+	Init->lpwr_init
+	Init->DRVPDN_ini
+	Init->NFIDriverInit
+	Init->bl_Is_Brom_Cmd_Mode_Disabled
+	Init->DummyReference
+	Init->SSS_Init_Share_Crypto_Drv
+	Init->SST_SWB_Init
+	Init->bootloader_debug_level
+	Init->g_randomSeed
+	Init->BL_RESV_REGION
+	Init->g_bromCmdModeDisabled
+	Init->EMI_INFO_2
+	Init->__user_initial_stackheap
+	kal_assert_fail_specific_ext->dbg_print
+	drv_get_duration_ms->drv_get_duration_tick
+	...
+	
+=cut