mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 06:02:11 +02:00
Bug 535911: Better error in the presence of compressed ELF section
This doesn't implement reading compressed ELF section, but at least it gives a more useful error instead of a simple "IllegalArgumentException" with no clue. Change-Id: Ib0ee1ab9e3aed7aeba184f13262b59ef21afcd32 Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
This commit is contained in:
parent
836db69fb8
commit
00df140228
3 changed files with 26 additions and 2 deletions
|
@ -68,4 +68,12 @@
|
|||
</message_arguments>
|
||||
</filter>
|
||||
</resource>
|
||||
<resource path="utils/org/eclipse/cdt/utils/elf/Elf.java" type="org.eclipse.cdt.utils.elf.Elf$Section">
|
||||
<filter comment="Unlikely API incompatibility" id="336658481">
|
||||
<message_arguments>
|
||||
<message_argument value="org.eclipse.cdt.utils.elf.Elf.Section"/>
|
||||
<message_argument value="SHF_COMPRESSED"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
</resource>
|
||||
</component>
|
||||
|
|
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
|||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: %pluginName
|
||||
Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true
|
||||
Bundle-Version: 6.5.0.qualifier
|
||||
Bundle-Version: 6.6.0.qualifier
|
||||
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
|
||||
Bundle-Vendor: %providerName
|
||||
Bundle-Localization: plugin
|
||||
|
|
|
@ -302,6 +302,10 @@ public class Elf {
|
|||
public final static int SHF_WRITE = 1;
|
||||
public final static int SHF_ALLOC = 2;
|
||||
public final static int SHF_EXECINTR = 4;
|
||||
/**
|
||||
* @since 6.6
|
||||
*/
|
||||
public final static int SHF_COMPRESSED = 2048;
|
||||
|
||||
/* note_types */
|
||||
/**
|
||||
|
@ -324,17 +328,26 @@ public class Elf {
|
|||
* @since 5.1
|
||||
*/
|
||||
public ByteBuffer mapSectionData() throws IOException {
|
||||
makeSureNotCompressed();
|
||||
sections_mapped = true;
|
||||
return efile.getChannel().map(MapMode.READ_ONLY, sh_offset, sh_size).load().asReadOnlyBuffer();
|
||||
}
|
||||
|
||||
public byte[] loadSectionData() throws IOException {
|
||||
makeSureNotCompressed();
|
||||
byte[] data = new byte[(int)sh_size];
|
||||
efile.seek(sh_offset);
|
||||
efile.read(data);
|
||||
return data;
|
||||
}
|
||||
|
||||
private void makeSureNotCompressed() throws IOException {
|
||||
if ((sh_flags & SHF_COMPRESSED) != 0) {
|
||||
// No point in continuing, any seek() or map() will be wrong.
|
||||
throw new IOException("Compressed sections are unsupported (SHF_COMPRESSED): " + toString()); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
try {
|
||||
|
@ -342,6 +355,7 @@ public class Elf {
|
|||
final int shstrndx= ehdr.e_shstrndx & 0xffff; // unsigned short
|
||||
if (shstrndx > sections.length || shstrndx < 0)
|
||||
return EMPTY_STRING;
|
||||
sections[shstrndx].makeSureNotCompressed();
|
||||
int size = (int)sections[shstrndx].sh_size;
|
||||
if (size <= 0 || size > efile.length())
|
||||
return EMPTY_STRING;
|
||||
|
@ -367,10 +381,10 @@ public class Elf {
|
|||
return EMPTY_STRING;
|
||||
}
|
||||
|
||||
section.makeSureNotCompressed();
|
||||
StringBuilder str = new StringBuilder();
|
||||
//Most string symbols will be less than 50 bytes in size
|
||||
byte [] tmp = new byte[50];
|
||||
|
||||
efile.seek(section.sh_offset + index);
|
||||
while(true) {
|
||||
int len = efile.read(tmp);
|
||||
|
@ -627,6 +641,7 @@ public class Elf {
|
|||
if (section.sh_type != Section.SHT_DYNAMIC) {
|
||||
return new Dynamic[0];
|
||||
}
|
||||
section.makeSureNotCompressed();
|
||||
ArrayList<Dynamic> dynList = new ArrayList<Dynamic>();
|
||||
efile.seek(section.sh_offset);
|
||||
int off = 0;
|
||||
|
@ -1066,6 +1081,7 @@ public class Elf {
|
|||
if (section.sh_entsize != 0) {
|
||||
numSyms = (int)section.sh_size / (int)section.sh_entsize;
|
||||
}
|
||||
section.makeSureNotCompressed();
|
||||
ArrayList<Symbol> symList = new ArrayList<Symbol>(numSyms);
|
||||
long offset = section.sh_offset;
|
||||
for (int c = 0; c < numSyms; offset += section.sh_entsize, c++) {
|
||||
|
|
Loading…
Add table
Reference in a new issue