1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 06:02:11 +02:00

Bug 465976 aarch64 support in Elf reader

Change-Id: I226efbe1013cb254686979fd4cd48a05f9800c01
This commit is contained in:
Alena Laskavaia 2015-10-21 13:14:28 -04:00 committed by Gerrit Code Review @ Eclipse.org
parent 9f03bd1ee2
commit 95c65f0a9c

View file

@ -116,12 +116,12 @@ public class Elf {
public final static int EM_IA_64 = 50; public final static int EM_IA_64 = 50;
public final static int EM_COLDFIRE = 52; public final static int EM_COLDFIRE = 52;
public final static int EM_STARCORE = 58; public final static int EM_STARCORE = 58;
public final static int EM_X86_64 = 62; public final static int EM_X86_64 = 62;
public final static int EM_ST100 = 60; public final static int EM_ST100 = 60;
/** @since 5.2 */ /** @since 5.2 */
public final static int EM_68HC08 = 71; /* Freescale MC68HC08 Microcontroller */ public final static int EM_68HC08 = 71; /* Freescale MC68HC08 Microcontroller */
public final static int EM_AVR = 83; public final static int EM_AVR = 83;
public final static int EM_FR30 = 84; /* Fujitsu FR30 */ public final static int EM_FR30 = 84; /* Fujitsu FR30 */
public final static int EM_V850 = 87; public final static int EM_V850 = 87;
@ -137,18 +137,20 @@ public class Elf {
public final static int EM_NIOSII = 113; public final static int EM_NIOSII = 113;
public final static int EM_C166 = 116; public final static int EM_C166 = 116;
public final static int EM_M16C = 117; public final static int EM_M16C = 117;
/** @since 5.2 */ /** @since 5.2 */
public final static int EM_RS08 = 132; /* Freescale RS08 embedded processor */ public final static int EM_RS08 = 132; /* Freescale RS08 embedded processor */
public final static int EM_MMDSP = 160; public final static int EM_MMDSP = 160;
/** @since 5.4 */ /** @since 5.4 */
public final static int EM_RX = 173; /* Renesas RX Microcontroller */ public final static int EM_RX = 173; /* Renesas RX Microcontroller */
/** @since 5.4 */ /** @since 5.4 */
public final static int EM_RL78 = 197; /* Renesas RL78 Microcontroller */ public final static int EM_RL78 = 197; /* Renesas RL78 Microcontroller */
/** @since 5.12 */
public final static int EM_AARCH64 = 183;
public final static int EM_NIOS = 0xFEBB; public final static int EM_NIOS = 0xFEBB;
public final static int EM_CYGNUS_POWERPC = 0x9025; public final static int EM_CYGNUS_POWERPC = 0x9025;
public final static int EM_CYGNUS_M32R = 0x9041; public final static int EM_CYGNUS_M32R = 0x9041;
@ -161,8 +163,8 @@ public class Elf {
public final static int EM_IQ2000 = 0xFEBA; public final static int EM_IQ2000 = 0xFEBA;
public static final int EM_XILINX_MICROBLAZE = 0xbaab; public static final int EM_XILINX_MICROBLAZE = 0xbaab;
public static final int EM_SDMA = 0xcafe; public static final int EM_SDMA = 0xcafe;
public static final int EM_CRADLE = 0x4d55; public static final int EM_CRADLE = 0x4d55;
public byte e_ident[] = new byte[EI_NDENT]; public byte e_ident[] = new byte[EI_NDENT];
public int e_type; /* file type (Elf32_Half) */ public int e_type; /* file type (Elf32_Half) */
public int e_machine; /* machine type (Elf32_Half) */ public int e_machine; /* machine type (Elf32_Half) */
@ -300,7 +302,7 @@ public class Elf {
public final static int SHF_WRITE = 1; public final static int SHF_WRITE = 1;
public final static int SHF_ALLOC = 2; public final static int SHF_ALLOC = 2;
public final static int SHF_EXECINTR = 4; public final static int SHF_EXECINTR = 4;
/* note_types */ /* note_types */
/** /**
* @since 5.7 * @since 5.7
@ -364,11 +366,11 @@ public class Elf {
if (index > section.sh_size) { if (index > section.sh_size) {
return EMPTY_STRING; return EMPTY_STRING;
} }
StringBuffer str = new StringBuffer(); StringBuffer str = new StringBuffer();
//Most string symbols will be less than 50 bytes in size //Most string symbols will be less than 50 bytes in size
byte [] tmp = new byte[50]; byte [] tmp = new byte[50];
efile.seek(section.sh_offset + index); efile.seek(section.sh_offset + index);
while(true) { while(true) {
int len = efile.read(tmp); int len = efile.read(tmp);
@ -378,7 +380,7 @@ public class Elf {
break; break;
} }
str.append((char)tmp[i]); str.append((char)tmp[i]);
} }
if(len <= 0) { if(len <= 0) {
break; break;
} }
@ -769,6 +771,9 @@ public class Elf {
case Elf.ELFhdr.EM_ARM : case Elf.ELFhdr.EM_ARM :
attrib.cpu = "arm"; //$NON-NLS-1$ attrib.cpu = "arm"; //$NON-NLS-1$
break; break;
case Elf.ELFhdr.EM_AARCH64 :
attrib.cpu = "aarch64"; //$NON-NLS-1$
break;
case Elf.ELFhdr.EM_MIPS_RS3_LE : case Elf.ELFhdr.EM_MIPS_RS3_LE :
case Elf.ELFhdr.EM_MIPS : case Elf.ELFhdr.EM_MIPS :
attrib.cpu = "mips"; //$NON-NLS-1$ attrib.cpu = "mips"; //$NON-NLS-1$
@ -950,7 +955,7 @@ public class Elf {
if (efile != null) { if (efile != null) {
efile.close(); efile.close();
efile = null; efile = null;
// ensure the mappings get cleaned up // ensure the mappings get cleaned up
if (sections_mapped) if (sections_mapped)
System.gc(); System.gc();
@ -1170,7 +1175,7 @@ public class Elf {
* 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); tmp[2] = (short)((val >> * 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); tmp[2] = (short)((val >>
* 16) & 0x00ff); tmp[3] = (short)((val >> 24) & 0x00ff); return ((tmp[0] < < * 16) & 0x00ff); tmp[3] = (short)((val >> 24) & 0x00ff); return ((tmp[0] < <
* 24) + (tmp[1] < < 16) + (tmp[2] < < 8) + tmp[3]); } return val; } * 24) + (tmp[1] < < 16) + (tmp[2] < < 8) + tmp[3]); } return val; }
* *
* public int swapShort( short val ) { if ( ehdr.e_ident[ELFhdr.EI_DATA] == * public int swapShort( short val ) { if ( ehdr.e_ident[ELFhdr.EI_DATA] ==
* ELFhdr.ELFDATA2LSB ) { short tmp[] = new short[2]; tmp[0] = (short)(val & * ELFhdr.ELFDATA2LSB ) { short tmp[] = new short[2]; tmp[0] = (short)(val &
* 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); return (short)((tmp[0] < < * 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); return (short)((tmp[0] < <