/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.format; import static jpcsp.util.Utilities.formatString; import static jpcsp.util.Utilities.readUByte; import static jpcsp.util.Utilities.readUHalf; import static jpcsp.util.Utilities.readUWord; import java.io.IOException; import java.nio.ByteBuffer; import jpcsp.Memory; public class Elf32StubHeader { // Resolved version of s_modulename in a Java String private String s_modulenamez; private int s_modulename; private int s_version; private int s_flags; private int s_size; private int s_vstub_size; private int s_imports; private int s_nid; private int s_text; private int s_vstub; public static int sizeof() { return 20; } public Elf32StubHeader(ByteBuffer f) throws IOException { s_modulenamez = ""; s_modulename = readUWord(f); s_version = readUHalf(f); s_flags = readUHalf(f); s_size = readUByte(f); s_vstub_size = readUByte(f); s_imports = readUHalf(f); s_nid = readUWord(f); s_text = readUWord(f); if (hasVStub()) { s_vstub = readUWord(f); } } public Elf32StubHeader(Memory mem, int address) { s_modulenamez = ""; s_modulename = mem.read32(address); s_version = mem.read16(address + 4); s_flags = mem.read16(address + 6); s_size = mem.read8(address + 8); s_vstub_size = mem.read8(address + 9); s_imports = mem.read16(address + 10); s_nid = mem.read32(address + 12); s_text = mem.read32(address + 16); if (hasVStub()) { s_vstub = mem.read32(address + 20); } } @Override public String toString() { StringBuilder str = new StringBuilder(); if (s_modulenamez != null && s_modulenamez.length() > 0) str.append(s_modulenamez + "\n"); str.append("s_modulename" + "\t" + formatString("long", Long.toHexString(s_modulename & 0xFFFFFFFFL).toUpperCase()) + "\n"); str.append("s_version" + "\t\t" + formatString("short", Long.toHexString(s_version & 0xFFFF).toUpperCase()) + "\n"); str.append("s_flags" + "\t\t\t" + formatString("short", Long.toHexString(s_flags & 0xFFFF).toUpperCase()) + "\n"); str.append("s_size" + "\t\t\t" + formatString("short", Long.toHexString(s_size & 0xFFFF).toUpperCase()) + "\n"); str.append("s_imports" + "\t\t" + formatString("short", Long.toHexString(s_imports & 0xFFFF).toUpperCase()) + "\n"); str.append("s_nid" + "\t\t\t" + formatString("long", Long.toHexString(s_nid & 0xFFFFFFFFL).toUpperCase()) + "\n"); str.append("s_text" + "\t\t\t" + formatString("long", Long.toHexString(s_text & 0xFFFFFFFFL).toUpperCase()) + "\n"); if (hasVStub()) { str.append("s_vstub" + "\t\t\t" + formatString("long", Long.toHexString(s_vstub & 0xFFFFFFFFL).toUpperCase()) + "\n"); } return str.toString(); } public String getModuleNamez() { return s_modulenamez; } public void setModuleNamez(String moduleName) { s_modulenamez = moduleName; } public int getOffsetModuleName() { return s_modulename; } public int getVersion() { return s_version; } public int getFlags() { return s_flags; } public int getSize() { return s_size; } public int getVStubSize() { return s_vstub_size; } /** The number of imports from this module */ public int getImports() { return s_imports; } public int getOffsetNid() { return s_nid; } public int getOffsetText() { return s_text; } public int getVStub() { return s_vstub; } public boolean hasVStub() { return s_size >= 6; } }