From: <mic...@us...> - 2007-05-09 11:23:15
|
Revision: 108 http://svn.sourceforge.net/pearcolator/?rev=108&view=rev Author: michael_baer Date: 2007-05-09 04:23:16 -0700 (Wed, 09 May 2007) Log Message: ----------- ELF Loader, version currently debugged Added Paths: ----------- src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java Added: src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java =================================================================== --- src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java (rev 0) +++ src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java 2007-05-09 11:23:16 UTC (rev 108) @@ -0,0 +1,110 @@ +package org.binarytranslator.generic.os.loader.elf; + +import java.io.IOException; + +import org.binarytranslator.arch.arm.os.process.ARM_ProcessSpace; +import org.binarytranslator.arch.arm.os.process.ARM_Registers; +import org.binarytranslator.arch.arm.os.process.linux.ARM_LinuxProcessSpace; +import org.binarytranslator.generic.decoder.Interpreter; +import org.binarytranslator.generic.os.loader.Loader; +import org.binarytranslator.generic.os.loader.elf.ELF_File.DynamicSection; +import org.binarytranslator.generic.os.process.ProcessSpace; + +public class ELF_Loader extends Loader { + + private ELF_File file; + private ELF_File loader; + + @Override + public ABI getABI() { + return file.getHeader().getABI(); + } + + @Override + public ISA getISA() { + return file.getHeader().getISA(); + } + + public int getProgramHeaderAddress() { + return file.getProgramHeaderAddress(); + } + + public int getNumberOfProgramSegmentHeaders() { + return file.getHeader().getNumberOfProgramSegmentHeaders(); + } + + public int getProgramSegmentHeaderSize() { + return file.getHeader().getProgramSegmentHeaderSize(); + } + + public static boolean conforms(String filename) { + return ELF_File.conforms(filename); + } + + @Override + public ProcessSpace readBinary(String filename) throws IOException { + + file = new ELF_File(filename); + ProcessSpace ps = ProcessSpace.createProcessSpaceFromBinary(this); + + ELF_File.SegmentHeader[] segments = file.getProgramSegmentHeaders(); + + System.out.println("ELF has segments:"); + for (ELF_File.SegmentHeader header : segments) { + System.out.println(header.toString()); + header.create(ps); + } + + int brk; + if (segments.length > 1) + brk = segments[1].getEnd(); + else + brk = segments[0].getEnd(); + + if (file.getDynamicSection() != null && file.getHeader().getABI() == ABI.ARM) { + + ARM_ProcessSpace armps = (ARM_ProcessSpace)ps; + + //invoke the runtime linker + RuntimeLinker ld = new RuntimeLinker(file, ps); + ld.link(); + + ps.initialise(this, file.getHeader().getEntryPoint(), brk); + int startInstruction = ps.getCurrentInstructionAddress(); + + //call the INITs + Interpreter interpreter = ps.createInstructionInterpreter(); + for (Integer init : ld.initMethods) { + int pc = init; + + ps.setCurrentInstructionAddress(init); + armps.registers.set(ARM_Registers.LR, init); + + while (!ps.finished) { + + Interpreter.Instruction instruction = interpreter.decode(pc); + System.out.println(String.format("[0x%x] %s", pc, instruction.toString())); + + instruction.execute(); + pc = instruction.getSuccessor(pc); + + if (pc == -1) + pc = ps.getCurrentInstructionAddress(); + else + ps.setCurrentInstructionAddress(pc); + + //we're done running the init method + if (pc == init) + break; + } + } + + ld._tmpRestore(); + ps.setCurrentInstructionAddress(startInstruction); + } + else + ps.initialise(this, file.getHeader().getEntryPoint(), brk); + + return ps; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |