--- a/e32tools/elf2e32/group/release.txt Tue Nov 16 15:56:27 2010 +0800
+++ b/e32tools/elf2e32/group/release.txt Wed Nov 17 11:24:29 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 Tue Nov 16 15:56:27 2010 +0800
+++ b/e32tools/elf2e32/include/h_ver.h Wed Nov 17 11:24:29 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 Tue Nov 16 15:56:27 2010 +0800
+++ b/e32tools/elf2e32/source/pl_elfexecutable.cpp Wed Nov 17 11:24:29 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);
}