src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File hotspot Cdiff src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java

src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java

Print this page

        

*** 22,89 **** */ package jdk.tools.jaotc.binformat.macho; import java.nio.ByteBuffer; - import java.nio.ByteOrder; import java.util.ArrayList; - import jdk.tools.jaotc.binformat.macho.MachO; import jdk.tools.jaotc.binformat.macho.MachO.symtab_command; import jdk.tools.jaotc.binformat.macho.MachO.nlist_64; import jdk.tools.jaotc.binformat.macho.MachOSymbol; import jdk.tools.jaotc.binformat.macho.MachOByteBuffer; ! public class MachOSymtab { /** * ByteBuffer holding the LC_SYMTAB command contents */ ! ByteBuffer symtabCmd; ! /** ! * ByteBuffer holding the symbol table entries and strings ! */ ! ByteBuffer symtabData; ! ! int symtabDataSize; ! ArrayList<MachOSymbol>localSymbols = new ArrayList<MachOSymbol>(); ! ArrayList<MachOSymbol>globalSymbols = new ArrayList<MachOSymbol>(); ! ArrayList<MachOSymbol>undefSymbols = new ArrayList<MachOSymbol>(); /** * number of symbols added */ ! int symbolCount; /** * String holding symbol table strings */ ! private StringBuilder strTabContent = new StringBuilder(); /** ! * Keeps track of bytes in string table since strTabContent.length() ! * is number of chars, not bytes. */ private int strTabNrOfBytes = 0; ! public MachOSymtab() { symtabCmd = MachOByteBuffer.allocate(symtab_command.totalsize); symtabCmd.putInt(symtab_command.cmd.off, symtab_command.LC_SYMTAB); symtabCmd.putInt(symtab_command.cmdsize.off, symtab_command.totalsize); symbolCount = 0; } ! public int getAlign() { return (4); } ! public MachOSymbol addSymbolEntry(String name, byte type, byte secHdrIndex, long offset) { // Get the current symbol index and append symbol name to string table. int index; MachOSymbol sym; if (name.isEmpty()) { --- 22,81 ---- */ package jdk.tools.jaotc.binformat.macho; import java.nio.ByteBuffer; import java.util.ArrayList; import jdk.tools.jaotc.binformat.macho.MachO.symtab_command; import jdk.tools.jaotc.binformat.macho.MachO.nlist_64; import jdk.tools.jaotc.binformat.macho.MachOSymbol; import jdk.tools.jaotc.binformat.macho.MachOByteBuffer; ! final class MachOSymtab { /** * ByteBuffer holding the LC_SYMTAB command contents */ ! private final ByteBuffer symtabCmd; ! private int symtabDataSize; ! private final ArrayList<MachOSymbol> localSymbols = new ArrayList<>(); ! private final ArrayList<MachOSymbol> globalSymbols = new ArrayList<>(); ! private final ArrayList<MachOSymbol> undefSymbols = new ArrayList<>(); /** * number of symbols added */ ! private int symbolCount; /** * String holding symbol table strings */ ! private final StringBuilder strTabContent = new StringBuilder(); /** ! * Keeps track of bytes in string table since strTabContent.length() is number of chars, not bytes. */ private int strTabNrOfBytes = 0; ! MachOSymtab() { symtabCmd = MachOByteBuffer.allocate(symtab_command.totalsize); symtabCmd.putInt(symtab_command.cmd.off, symtab_command.LC_SYMTAB); symtabCmd.putInt(symtab_command.cmdsize.off, symtab_command.totalsize); symbolCount = 0; } ! static int getAlign() { return (4); } ! MachOSymbol addSymbolEntry(String name, byte type, byte secHdrIndex, long offset) { // Get the current symbol index and append symbol name to string table. int index; MachOSymbol sym; if (name.isEmpty()) {
*** 107,117 **** break; case nlist_64.N_SECT: case nlist_64.N_UNDF: // null symbol localSymbols.add(sym); break; ! case nlist_64.N_SECT|nlist_64.N_EXT: globalSymbols.add(sym); break; default: System.out.println("Unsupported Symbol type " + type); break; --- 99,109 ---- break; case nlist_64.N_SECT: case nlist_64.N_UNDF: // null symbol localSymbols.add(sym); break; ! case nlist_64.N_SECT | nlist_64.N_EXT: globalSymbols.add(sym); break; default: System.out.println("Unsupported Symbol type " + type); break;
*** 119,160 **** } symbolCount++; return (sym); } ! public void setOffset(int symoff) { symtabCmd.putInt(symtab_command.symoff.off, symoff); } // Update the symbol indexes once all symbols have been added. // This is required since we'll be reordering the symbols in the // file to be in the order of Local, global and Undefined. ! public void updateIndexes() { int index = 0; // Update the local symbol indexes ! for (int i = 0; i < localSymbols.size(); i++ ) { MachOSymbol sym = localSymbols.get(i); sym.setIndex(index++); } // Update the global symbol indexes ! for (int i = 0; i < globalSymbols.size(); i++ ) { MachOSymbol sym = globalSymbols.get(i); sym.setIndex(index++); } // Update the undefined symbol indexes ! for (int i = index; i < undefSymbols.size(); i++ ) { MachOSymbol sym = undefSymbols.get(i); sym.setIndex(index++); } } // Update LC_SYMTAB command fields based on the number of symbols added // return the file size taken up by symbol table entries and strings ! public int calcSizes() { int stroff; stroff = symtabCmd.getInt(symtab_command.symoff.off) + (nlist_64.totalsize * symbolCount); symtabCmd.putInt(symtab_command.nsyms.off, symbolCount); symtabCmd.putInt(symtab_command.stroff.off, stroff); --- 111,152 ---- } symbolCount++; return (sym); } ! void setOffset(int symoff) { symtabCmd.putInt(symtab_command.symoff.off, symoff); } // Update the symbol indexes once all symbols have been added. // This is required since we'll be reordering the symbols in the // file to be in the order of Local, global and Undefined. ! void updateIndexes() { int index = 0; // Update the local symbol indexes ! for (int i = 0; i < localSymbols.size(); i++) { MachOSymbol sym = localSymbols.get(i); sym.setIndex(index++); } // Update the global symbol indexes ! for (int i = 0; i < globalSymbols.size(); i++) { MachOSymbol sym = globalSymbols.get(i); sym.setIndex(index++); } // Update the undefined symbol indexes ! for (int i = index; i < undefSymbols.size(); i++) { MachOSymbol sym = undefSymbols.get(i); sym.setIndex(index++); } } // Update LC_SYMTAB command fields based on the number of symbols added // return the file size taken up by symbol table entries and strings ! int calcSizes() { int stroff; stroff = symtabCmd.getInt(symtab_command.symoff.off) + (nlist_64.totalsize * symbolCount); symtabCmd.putInt(symtab_command.nsyms.off, symbolCount); symtabCmd.putInt(symtab_command.stroff.off, stroff);
*** 162,211 **** symtabDataSize = (nlist_64.totalsize * symbolCount) + strTabNrOfBytes; return (symtabDataSize); } ! public int getNumLocalSyms() { return localSymbols.size(); } ! public int getNumGlobalSyms() { return globalSymbols.size(); } ! public int getNumUndefSyms() { return undefSymbols.size(); } ! public byte[] getCmdArray() { return symtabCmd.array(); } // Create a single byte array that contains the symbol table entries // and string table ! public byte[] getDataArray() { ! int index = 0; ! symtabData = MachOByteBuffer.allocate(symtabDataSize); ! byte [] retarray; // Add the local symbols ! for (int i = 0; i < localSymbols.size(); i++ ) { MachOSymbol sym = localSymbols.get(i); ! byte [] arr = sym.getArray(); symtabData.put(arr); } // Add the global symbols ! for (int i = 0; i < globalSymbols.size(); i++ ) { MachOSymbol sym = globalSymbols.get(i); ! byte [] arr = sym.getArray(); symtabData.put(arr); } // Add the undefined symbols ! for (int i = 0; i < undefSymbols.size(); i++ ) { MachOSymbol sym = undefSymbols.get(i); ! byte [] arr = sym.getArray(); symtabData.put(arr); } // Add the stringtable ! byte [] strs = strTabContent.toString().getBytes(); symtabData.put(strs); retarray = symtabData.array(); return (retarray); } } - - --- 154,208 ---- symtabDataSize = (nlist_64.totalsize * symbolCount) + strTabNrOfBytes; return (symtabDataSize); } ! int getNumLocalSyms() { ! return localSymbols.size(); ! } ! ! int getNumGlobalSyms() { ! return globalSymbols.size(); ! } ! int getNumUndefSyms() { ! return undefSymbols.size(); ! } ! ! byte[] getCmdArray() { return symtabCmd.array(); } // Create a single byte array that contains the symbol table entries // and string table ! byte[] getDataArray() { ! ByteBuffer symtabData = MachOByteBuffer.allocate(symtabDataSize); ! byte[] retarray; // Add the local symbols ! for (int i = 0; i < localSymbols.size(); i++) { MachOSymbol sym = localSymbols.get(i); ! byte[] arr = sym.getArray(); symtabData.put(arr); } // Add the global symbols ! for (int i = 0; i < globalSymbols.size(); i++) { MachOSymbol sym = globalSymbols.get(i); ! byte[] arr = sym.getArray(); symtabData.put(arr); } // Add the undefined symbols ! for (int i = 0; i < undefSymbols.size(); i++) { MachOSymbol sym = undefSymbols.get(i); ! byte[] arr = sym.getArray(); symtabData.put(arr); } // Add the stringtable ! byte[] strs = strTabContent.toString().getBytes(); symtabData.put(strs); retarray = symtabData.array(); return (retarray); } }
src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File