From e31fa57da728fa1c76760af23e62bd312a50e4df Mon Sep 17 00:00:00 2001 From: brian Date: Wed, 4 Aug 2004 04:51:58 -0700 Subject: [PATCH] cleanup elf stuff darcs-hash:20040804115158-24bed-0f05f0d6da5572f3b160883b143ea33fe72d0248.gz --- src/org/ibex/nestedvm/Compiler.java | 8 ++-- src/org/ibex/nestedvm/Interpreter.java | 8 ++-- src/org/ibex/nestedvm/Runtime.java | 3 +- src/org/ibex/nestedvm/util/ELF.java | 64 +++++++++++++++++--------------- 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/org/ibex/nestedvm/Compiler.java b/src/org/ibex/nestedvm/Compiler.java index 23e25c2..03515ad 100644 --- a/src/org/ibex/nestedvm/Compiler.java +++ b/src/org/ibex/nestedvm/Compiler.java @@ -194,9 +194,9 @@ public abstract class Compiler implements Registers { this.fullClassName = fullClassName; elf = new ELF(binary); - if(elf.header.type != ELF.ELFHeader.ET_EXEC) throw new IOException("Binary is not an executable"); - if(elf.header.machine != ELF.ELFHeader.EM_MIPS) throw new IOException("Binary is not for the MIPS I Architecture"); - if(elf.ident.data != ELF.ELFIdent.ELFDATA2MSB) throw new IOException("Binary is not big endian"); + if(elf.header.type != ELF.ET_EXEC) throw new IOException("Binary is not an executable"); + if(elf.header.machine != ELF.EM_MIPS) throw new IOException("Binary is not for the MIPS I Architecture"); + if(elf.ident.data != ELF.ELFDATA2MSB) throw new IOException("Binary is not big endian"); } abstract void _go() throws Exn, IOException; @@ -251,7 +251,7 @@ public abstract class Compiler implements Registers { for(int i=0;i> 2; for(int i=0;isyscall should be the contents of V0 and a, b, c, and d should be diff --git a/src/org/ibex/nestedvm/util/ELF.java b/src/org/ibex/nestedvm/util/ELF.java index db990bb..2f97071 100644 --- a/src/org/ibex/nestedvm/util/ELF.java +++ b/src/org/ibex/nestedvm/util/ELF.java @@ -7,6 +7,34 @@ package org.ibex.nestedvm.util; import java.io.*; public class ELF { + private static final int ELF_MAGIC = 0x7f454c46; // '\177', 'E', 'L', 'F' + + public static final int ELFCLASSNONE = 0; + public static final int ELFCLASS32 = 1; + public static final int ELFCLASS64 = 2; + + public static final int ELFDATANONE = 0; + public static final int ELFDATA2LSB = 1; + public static final int ELFDATA2MSB = 2; + + public static final int SHT_SYMTAB = 2; + public static final int SHT_STRTAB = 3; + public static final int SHT_NOBITS = 8; + + public static final int SHF_WRITE = 1; + public static final int SHF_ALLOC = 2; + public static final int SHF_EXECINSTR = 4; + + public static final int PF_X = 0x1; + public static final int PF_W = 0x2; + public static final int PF_R = 0x4; + + public static final int PT_LOAD = 1; + + public static final short ET_EXEC = 2; + public static final short EM_MIPS = 8; + + private Seekable data; public ELFIdent ident; @@ -37,7 +65,7 @@ public class ELF { } private int readInt() throws IOException { int x = readIntBE(); - if(ident!=null && ident.data == ELFIdent.ELFDATA2LSB) + if(ident!=null && ident.data == ELFDATA2LSB) x = ((x<<24)&0xff000000) | ((x<<8)&0xff0000) | ((x>>>8)&0xff00) | ((x>>24)&0xff); return x; } @@ -49,7 +77,7 @@ public class ELF { } private short readShort() throws IOException { short x = readShortBE(); - if(ident!=null && ident.data == ELFIdent.ELFDATA2LSB) + if(ident!=null && ident.data == ELFDATA2LSB) x = (short)((((x<<8)&0xff00) | ((x>>8)&0xff))&0xffff); return x; } @@ -61,17 +89,7 @@ public class ELF { } public class ELFIdent { - private static final int ELF_MAGIC = 0x7f454c46; // '\177', 'E', 'L', 'F' - - public static final int ELFCLASSNONE = 0; - public static final int ELFCLASS32 = 1; - public static final int ELFCLASS64 = 2; - public byte klass; - - - public static final int ELFDATANONE = 0; - public static final int ELFDATA2LSB = 1; - public static final int ELFDATA2MSB = 2; + public byte klass; public byte data; public byte osabi; public byte abiversion; @@ -93,12 +111,8 @@ public class ELF { } public class ELFHeader { - public static final short ET_EXEC = 2; - public short type; - - public static final short EM_MIPS = 8; + public short type; public short machine; - public int version; public int entry; public int phoff; @@ -139,12 +153,6 @@ public class ELF { public int flags; public int align; - public static final int PF_X = 0x1; - public static final int PF_W = 0x2; - public static final int PF_R = 0x4; - - public static final int PT_LOAD = 1; - PHeader() throws IOException { type = readInt(); offset = readInt(); @@ -178,10 +186,6 @@ public class ELF { public int addralign; public int entsize; - public static final int SHT_SYMTAB = 2; - public static final int SHT_STRTAB = 3; - public static final int SHT_NOBITS = 8; - SHeader() throws IOException { nameidx = readInt(); type = readInt(); @@ -278,10 +282,10 @@ public class ELF { if(sectionReaderActive) throw new ELFException("Can't read the symtab while a section reader is active"); SHeader sh = sectionWithName(".symtab"); - if(sh == null || sh.type != SHeader.SHT_SYMTAB) return null; + if(sh == null || sh.type != SHT_SYMTAB) return null; SHeader sth = sectionWithName(".strtab"); - if(sth == null || sth.type != SHeader.SHT_STRTAB) return null; + if(sth == null || sth.type != SHT_STRTAB) return null; byte[] strtab = new byte[sth.size]; DataInputStream dis = new DataInputStream(sth.getInputStream()); -- 1.7.10.4