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