/* 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.integerToHex; import static jpcsp.util.Utilities.readUWord; import static jpcsp.util.Utilities.readWord; import java.io.IOException; import java.nio.ByteBuffer; import jpcsp.Memory; public class Elf32SectionHeader { // Flags public static final int SHF_NONE = 0x00000000; public static final int SHF_WRITE = 0x00000001; public static final int SHF_ALLOCATE = 0x00000002; public static final int SHF_EXECUTE = 0x00000004; // Types public static final int SHT_NULL = 0x00000000; public static final int SHT_PROGBITS = 0x00000001; public static final int SHT_SYMTAB = 0x00000002; public static final int SHT_STRTAB = 0x00000003; public static final int SHT_RELA = 0x00000004; public static final int SHT_HASH = 0x00000005; public static final int SHT_DYNAMIC = 0x00000006; public static final int SHT_NOTE = 0x00000007; public static final int SHT_NOBITS = 0x00000008; public static final int SHT_REL = 0x00000009; public static final int SHT_SHLIB = 0x0000000A; public static final int SHT_DYNSYM = 0x0000000B; public static final int SHT_PRXREL = 0x700000A0; private String sh_namez = ""; private int sh_name; private int sh_type; private int sh_flags; private int sh_addr; private int sh_offset; private int sh_size; private int sh_link; private int sh_info; private int sh_addralign; private int sh_entsize; public static int sizeof() { return 40; } public Elf32SectionHeader(ByteBuffer f) throws IOException { sh_name = readUWord(f); sh_type = readWord(f); sh_flags = readWord(f); sh_addr = readUWord(f); sh_offset = readUWord(f); sh_size = readUWord(f); sh_link = readWord(f); sh_info = readWord(f); sh_addralign = readWord(f); sh_entsize = readWord(f); } public Elf32SectionHeader(Memory mem, int address) { sh_name = mem.read32(address); sh_type = mem.read32(address + 4); sh_flags = mem.read32(address + 8); sh_addr = mem.read32(address + 12); sh_offset = mem.read32(address + 16); sh_size = mem.read32(address + 20); sh_link = mem.read32(address + 24); sh_info = mem.read32(address + 28); sh_addralign = mem.read32(address + 32); sh_entsize = mem.read32(address + 36); } @Override public String toString() { StringBuilder str = new StringBuilder(); str.append("sh_name " + "\t " + formatString("long", Long.toHexString(getSh_name() & 0xFFFFFFFFL).toUpperCase()) + "\n"); if (sh_namez != null && sh_namez.length() > 0) { str.append("sh_namez \t '" + sh_namez + "'\n"); } str.append("sh_type " + "\t " + formatString("long", Long.toHexString(getSh_type() & 0xFFFFFFFFL).toUpperCase()) + "\n"); str.append("sh_flags " + "\t " + integerToHex(getSh_flags() & 0xFF) + "\n"); str.append("sh_addr " + "\t " + formatString("long", Long.toHexString(getSh_addr() & 0xFFFFFFFFL).toUpperCase()) + "\n"); str.append("sh_offset " + "\t " + formatString("long", Long.toHexString(getSh_offset() & 0xFFFFFFFFL).toUpperCase()) + "\n"); str.append("sh_size " + "\t " + formatString("long", Long.toHexString(getSh_size() & 0xFFFFFFFFL).toUpperCase()) + "\n"); str.append("sh_link " + "\t " + integerToHex(getSh_link() & 0xFF) + "\n"); str.append("sh_info " + "\t " + integerToHex(getSh_info() & 0xFF) + "\n"); str.append("sh_addralign " + "\t " + integerToHex(getSh_addralign() & 0xFF) + "\n"); str.append("sh_entsize " + "\t " + formatString("long", Long.toHexString(getSh_entsize() & 0xFFFFFFFFL).toUpperCase()) + "\n"); return str.toString(); } public String getSh_namez() { return sh_namez; } public void setSh_namez(String sh_namez) { this.sh_namez = sh_namez; } public int getSh_name() { return sh_name; } public int getSh_type() { return sh_type; } public int getSh_flags() { return sh_flags; } public int getSh_addr() { return sh_addr; } public int getSh_addr(int baseAddress) { if (Memory.isAddressGood(getSh_addr()) && getSh_addr() >= baseAddress) { return getSh_addr(); } return baseAddress + getSh_addr(); } public int getSh_offset() { return sh_offset; } public int getSh_size() { return sh_size; } public int getSh_link() { return sh_link; } public int getSh_info() { return sh_info; } public int getSh_addralign() { return sh_addralign; } public int getSh_entsize() { return sh_entsize; } }