elf2e32 treatment of ARM$$INIT_ARRAY$$Base can break GCCE builds
authorlorewang
Wed, 17 Nov 2010 11:21:28 +0800
changeset 684 2defe8c85348
parent 681 240a07ea3a13
child 685 39f7ecf8fbc7
elf2e32 treatment of ARM$$INIT_ARRAY$$Base can break GCCE builds
e32tools/elf2e32/group/release.txt
e32tools/elf2e32/include/h_ver.h
e32tools/elf2e32/source/pl_elfexecutable.cpp
--- a/e32tools/elf2e32/group/release.txt	Fri Nov 12 17:02:24 2010 +0800
+++ b/e32tools/elf2e32/group/release.txt	Wed Nov 17 11:21:28 2010 +0800
@@ -4,6 +4,11 @@
 NOTESRC_RELEASE_REASON
 Postlinker(elf2e32) Release
 
+version 2.2 build(7)
+===============
+Released by Marvin Shi, 26/10/2010
+	1) Bug3494 elf2e32 treatment of ARM$$INIT_ARRAY$$Base can break GCCE builds
+
 version 2.2 build(6)
 ===============
 Released by Marvin Shi, 26/10/2010
--- a/e32tools/elf2e32/include/h_ver.h	Fri Nov 12 17:02:24 2010 +0800
+++ b/e32tools/elf2e32/include/h_ver.h	Wed Nov 17 11:21:28 2010 +0800
@@ -18,7 +18,7 @@
 
 const TInt MajorVersion=2;
 const TInt MinorVersion=2;
-const TInt Build=6;
+const TInt Build=7;
 
 #endif
 
--- a/e32tools/elf2e32/source/pl_elfexecutable.cpp	Fri Nov 12 17:02:24 2010 +0800
+++ b/e32tools/elf2e32/source/pl_elfexecutable.cpp	Wed Nov 17 11:21:28 2010 +0800
@@ -1438,7 +1438,7 @@
 
 	try {
 
-		bool limitSymbolFound = false;
+		bool specialSymbolFound = false;
 
 		// If Symbol is absolute then assume it came from linker and is a
 		// limit symbol.
@@ -1448,19 +1448,21 @@
 		}
 		else
 		{
+			// does the symbol point to the address after the end of the code or data segments?
 			if( (iCodeSegmentHdr && aSym->st_value == (iCodeSegmentHdr->p_vaddr + iCodeSegmentHdr->p_memsz)) ||
 				(iDataSegmentHdr && aSym->st_value == (iDataSegmentHdr->p_vaddr + iDataSegmentHdr->p_memsz)) )
 			{
-				//If Symbol is a $$Limit symbol, then consider the open boundary.
-				String limitstr = iStringTable + aSym->st_name;
-				if (limitstr.rfind("$$Limit",limitstr.length()) != String::npos)
+				//If Symbol contains $$, it is linker generated so consider the open boundary.
+ 				//e.g. SHT$$INIT_ARRAY$$Limit and sometimes SHT$$INIT_ARRAY$$Base 
+ 				String aSymstr = iStringTable + aSym->st_name;
+ 				if (aSymstr.rfind("$$",aSymstr.length()) != String::npos)
 				{
 					aHdr = SegmentFromAbs(aSym->st_value);
-					limitSymbolFound = true;
+					specialSymbolFound = true;
 				}
 			}
 
-			if(!limitSymbolFound )
+			if(!specialSymbolFound )
 			{
 				aHdr = Segment(aSym->st_value);
 			}