summaryrefslogtreecommitdiffstats
path: root/src/java/jogamp/common
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2015-02-01 05:21:39 +0100
committerSven Gothel <[email protected]>2015-02-01 05:21:39 +0100
commita3f2d08801c5a54048faca52f422bcededf81b2a (patch)
tree96e83956b62ae3e25043ccc67f4cb1c2c1f232a1 /src/java/jogamp/common
parent0deceee37d943faa7c34971388863a27f395d6a5 (diff)
Bug 1125 - Make ELF Reader 'jogamp.common.os.elf' Stateless
ELF Reader 'jogamp.common.os.elf' currently uses Platform's pre-determined OS_TYPE and CPUType. It also uses the host platforms MachineDescription, hence can not read ELF files from other machines. This also forbids Platform to determine CPUType etc w/o having a valid 'os.arch' property. +++ ElfHeader should be split in - ElfHeaderPart1 (CPUType independent) - ElfHeaderPart2 (CPUType dependent) Fix shall make the ELF Reader self containing by only using ELF CPUType data, etc. This requires customization of struct parsing, where MachineDescription.Static index shall be - defined in ElfHeaderPart1 using e_Ident's CPUType. - used in ElfHeaderPart2 and all its struct types.
Diffstat (limited to 'src/java/jogamp/common')
-rw-r--r--src/java/jogamp/common/os/MachineDescriptionRuntime.java33
-rw-r--r--src/java/jogamp/common/os/PlatformPropsImpl.java405
-rw-r--r--src/java/jogamp/common/os/elf/Ehdr.java246
-rw-r--r--src/java/jogamp/common/os/elf/Ehdr_p1.java118
-rw-r--r--src/java/jogamp/common/os/elf/Ehdr_p2.java176
-rw-r--r--src/java/jogamp/common/os/elf/ElfHeaderPart1.java (renamed from src/java/jogamp/common/os/elf/ElfHeader.java)396
-rw-r--r--src/java/jogamp/common/os/elf/ElfHeaderPart2.java374
-rw-r--r--src/java/jogamp/common/os/elf/IOUtils.java10
-rw-r--r--src/java/jogamp/common/os/elf/SectionArmAttributes.java45
-rw-r--r--src/java/jogamp/common/os/elf/SectionHeader.java40
-rw-r--r--src/java/jogamp/common/os/elf/Shdr.java109
11 files changed, 1127 insertions, 825 deletions
diff --git a/src/java/jogamp/common/os/MachineDescriptionRuntime.java b/src/java/jogamp/common/os/MachineDescriptionRuntime.java
index 8df29f6..9becd21 100644
--- a/src/java/jogamp/common/os/MachineDescriptionRuntime.java
+++ b/src/java/jogamp/common/os/MachineDescriptionRuntime.java
@@ -43,37 +43,24 @@ public class MachineDescriptionRuntime {
static volatile boolean smdSoftQueried = false;
static MachineDescription.StaticConfig smdSoft = null;
- static volatile boolean smdHardEnabled = false;
-
- /* pp */ static void notifyPropsInitialized() { smdHardEnabled = true; }
-
public static MachineDescription.StaticConfig getStatic() {
- if(!smdHardEnabled) {
- if(!smdSoftQueried) {
- synchronized(MachineDescription.class) { // volatile dbl-checked-locking OK
- if(!smdSoftQueried) {
- smdSoft = get(PlatformPropsImpl.OS_TYPE, PlatformPropsImpl.sCpuType, PlatformPropsImpl.LITTLE_ENDIAN);
- smdSoftQueried=true;
- }
- }
- }
- return smdSoft;
- } else {
- if(!smdHardQueried) {
- synchronized(MachineDescription.class) { // volatile dbl-checked-locking OK
- if(!smdHardQueried) {
- smdHard = get(PlatformPropsImpl.OS_TYPE, PlatformPropsImpl.CPU_ARCH, PlatformPropsImpl.LITTLE_ENDIAN);
- smdHardQueried=true;
+ if(!smdHardQueried) {
+ synchronized(MachineDescription.class) { // volatile dbl-checked-locking OK
+ if(!smdHardQueried) {
+ smdHard = get(PlatformPropsImpl.OS_TYPE, PlatformPropsImpl.CPU_ARCH, PlatformPropsImpl.LITTLE_ENDIAN);
+ smdHardQueried=true;
+ if( PlatformPropsImpl.DEBUG ) {
+ System.err.println("MachineDescription.StaticConfig.getStatic_Hard(os "+PlatformPropsImpl.OS_TYPE+", CpuType "+PlatformPropsImpl.CPU_ARCH+", little "+PlatformPropsImpl.LITTLE_ENDIAN+"): "+smdHard.toShortString());
}
}
}
- return smdHard;
}
+ return smdHard;
}
- private static MachineDescription.StaticConfig get(final Platform.OSType osType, final Platform.CPUType cpuType, final boolean littleEndian) {
+ public static MachineDescription.StaticConfig get(final Platform.OSType osType, final Platform.CPUType cpuType, final boolean littleEndian) {
if( cpuType.is32Bit ) {
- if( cpuType.getFamily() == Platform.CPUFamily.ARM && littleEndian) {
+ if( cpuType.family == Platform.CPUFamily.ARM && littleEndian) {
return StaticConfig.ARMle_EABI;
} else if( osType == Platform.OSType.WINDOWS ) {
return StaticConfig.X86_32_WINDOWS;
diff --git a/src/java/jogamp/common/os/PlatformPropsImpl.java b/src/java/jogamp/common/os/PlatformPropsImpl.java
index b12ab6f..b35533f 100644
--- a/src/java/jogamp/common/os/PlatformPropsImpl.java
+++ b/src/java/jogamp/common/os/PlatformPropsImpl.java
@@ -11,9 +11,9 @@ import java.security.PrivilegedAction;
import java.util.List;
import jogamp.common.Debug;
-import jogamp.common.os.elf.ElfHeader;
+import jogamp.common.os.elf.ElfHeaderPart1;
+import jogamp.common.os.elf.ElfHeaderPart2;
import jogamp.common.os.elf.SectionArmAttributes;
-import jogamp.common.os.elf.SectionHeader;
import com.jogamp.common.nio.Buffers;
import com.jogamp.common.os.AndroidVersion;
@@ -48,6 +48,13 @@ public abstract class PlatformPropsImpl {
public static final VersionNumber Mavericks = new VersionNumber(10,9,0);
}
+ /**
+ * Returns {@code true} if the given {@link CPUType}s and {@link ABIType}s are compatible.
+ */
+ public static final boolean isCompatible(final CPUType cpu1, final ABIType abi1, final CPUType cpu2, final ABIType abi2) {
+ return cpu1.isCompatible(cpu2) && abi1.isCompatible(abi2);
+ }
+
//
// static initialization order:
//
@@ -72,14 +79,20 @@ public abstract class PlatformPropsImpl {
public static final String JAVA_RUNTIME_NAME;
/** True if having {@link java.nio.LongBuffer} and {@link java.nio.DoubleBuffer} available. */
public static final boolean JAVA_SE;
- /** True if being compatible w/ language level 6, e.g. JRE 1.6. Implies {@link #JAVA_SE}. <i>Note</i>: We claim Android is compatible. */
+ /**
+ * True only if being compatible w/ language level 6, e.g. JRE 1.6.
+ * <p>
+ * Implies {@link #isJavaSE()}.
+ * </p>
+ * <p>
+ * <i>Note</i>: We claim Android is compatible.
+ * </p>
+ */
public static final boolean JAVA_6;
public static final String NEWLINE;
public static final boolean LITTLE_ENDIAN;
- /* pp */ static final CPUType sCpuType;
-
public static final CPUType CPU_ARCH;
public static final ABIType ABI_TYPE;
public static final OSType OS_TYPE;
@@ -126,111 +139,191 @@ public abstract class PlatformPropsImpl {
OS_VERSION_NUMBER = new VersionNumber(OS_VERSION);
OS_TYPE = getOSTypeImpl(OS_lower, isAndroid);
- LITTLE_ENDIAN = queryIsLittleEndianImpl();
-
- // Soft values, i.e. w/o probing binaries
- final String sARCH = System.getProperty("os.arch");
- final String sARCH_lower = sARCH.toLowerCase();
- sCpuType = getCPUTypeImpl(sARCH_lower);
- if( DEBUG ) {
- System.err.println("Platform.Soft: sARCH "+sARCH+", sCpuType "+sCpuType);
- if( isAndroid ) {
- System.err.println("Android: CPU_ABI1 str "+AndroidVersion.CPU_ABI+", CPU_TYPE "+AndroidVersion.CPU_TYPE+", ABI_TYPE "+AndroidVersion.ABI_TYPE);
- System.err.println("Android: CPU_ABI2 str "+AndroidVersion.CPU_ABI2+", CPU_TYPE2 "+AndroidVersion.CPU_TYPE2+", ABI_TYPE2 "+AndroidVersion.ABI_TYPE2);
- }
- }
-
// Hard values, i.e. w/ probing binaries
//
// FIXME / HACK:
- // We use sCPUType for MachineDescriptionRuntime.getStatic()
+ // We use preCpuType for MachineDescriptionRuntime.getStatic()
// until we have determined the final CPU_TYPE, etc.
// MachineDescriptionRuntime gets notified via MachineDescriptionRuntime.notifyPropsInitialized() below.
//
// We could use Elf Ehdr's machine value to determine the bit-size
// used for it's offset table!
// However, 'os.arch' should be a good guess for this task.
+ final String elfCpuName;
final CPUType elfCpuType;
- final ABIType elfAbiType;
+ final ABIType elfABIType;
+ final int elfLittleEndian;
final boolean elfValid;
{
- final CPUType[] _ehCpuType = { null };
- final ABIType[] _ehAbiType = { null };
- final ElfHeader eh = queryABITypeImpl(OS_TYPE, _ehCpuType, _ehAbiType);
- if( null != eh && null != _ehCpuType[0] && null != _ehAbiType[0] ) {
- elfCpuType = _ehCpuType[0];
- elfAbiType = _ehAbiType[0];
- if( isAndroid ) {
- final CPUFamily aCpuFamily1 = null != AndroidVersion.CPU_TYPE ? AndroidVersion.CPU_TYPE.family : null;
- final CPUFamily aCpuFamily2 = null != AndroidVersion.CPU_TYPE2 ? AndroidVersion.CPU_TYPE2.family : null;
- if( elfCpuType.family != aCpuFamily1 && elfCpuType.family != aCpuFamily2 ) {
- // Ooops !
- elfValid = false;
- } else {
- elfValid = true;
- }
- } else {
- if( elfCpuType.family != sCpuType.family ) {
- // Ooops !
- elfValid = false;
- } else {
- elfValid = true;
+ final String[] _elfCpuName = { null };
+ final CPUType[] _elfCpuType = { null };
+ final ABIType[] _elfAbiType = { null };
+ final int[] _elfLittleEndian = { 0 }; // 1 - little, 2 - big
+ final boolean[] _elfValid = { false };
+ AccessController.doPrivileged(new PrivilegedAction<Object>() {
+ @Override
+ public Object run() {
+ RandomAccessFile in = null;
+ try {
+ final File file = queryElfFile(OS_TYPE);
+ if(DEBUG) {
+ System.err.println("ELF-1: Using "+file);
+ }
+ in = new RandomAccessFile(file, "r");
+ final ElfHeaderPart1 eh1 = readElfHeaderPart1(OS_TYPE, in);
+ if(DEBUG) {
+ System.err.println("ELF-1: Got "+eh1);
+ }
+ if( null != eh1 ) {
+ final ElfHeaderPart2 eh2 = readElfHeaderPart2(eh1, in);
+ if(DEBUG) {
+ System.err.println("ELF-2: Got "+eh2);
+ }
+ if( null != eh2 ) {
+ _elfCpuName[0] = eh2.cpuName;
+ _elfCpuType[0] = eh2.cpuType;
+ _elfAbiType[0] = eh2.abiType;
+ if( eh1.isLittleEndian() ) {
+ _elfLittleEndian[0] = 1;
+ } else if( eh1.isBigEndian() ) {
+ _elfLittleEndian[0] = 2;
+ }
+ _elfValid[0] = true;
+ }
+ }
+ } catch (final Throwable t) {
+ if(DEBUG) {
+ t.printStackTrace();
+ }
+ } finally {
+ if(null != in) {
+ try {
+ in.close();
+ } catch (final IOException e) { }
+ }
}
- }
- if( DEBUG ) {
- System.err.println("Platform.Elf: cpuType "+elfCpuType+", abiType "+elfAbiType+", valid "+elfValid);
- }
- } else {
- elfCpuType = null;
- elfAbiType = null;
- elfValid = false;
- if( DEBUG ) {
- System.err.println("Platform.Elf: n/a");
- }
+ return null;
+ } });
+ elfCpuName = _elfCpuName[0];
+ elfCpuType = _elfCpuType[0];
+ elfABIType = _elfAbiType[0];
+ elfLittleEndian = _elfLittleEndian[0];
+ elfValid = _elfValid[0];
+ if( DEBUG ) {
+ System.err.println("Platform.Elf: valid "+elfValid+", elfCpuName "+elfCpuName+", cpuType "+elfCpuType+", abiType "+elfABIType+", elfLittleEndian "+elfLittleEndian);
+ }
+ }
+
+ // Determine endianess, favor ELF value
+ final boolean littleEndian = queryIsLittleEndianImpl();
+ if( elfValid ) {
+ switch( elfLittleEndian ) {
+ case 1:
+ LITTLE_ENDIAN = true;
+ break;
+ case 2:
+ LITTLE_ENDIAN = false;
+ break;
+ default:
+ LITTLE_ENDIAN = littleEndian;
+ break;
}
+ } else {
+ LITTLE_ENDIAN = littleEndian;
+ }
+ if( DEBUG ) {
+ System.err.println("Platform.Endian: test-little "+littleEndian+", elf[valid "+elfValid+", val "+elfLittleEndian+"] -> LITTLE_ENDIAN "+LITTLE_ENDIAN);
}
+
+ // Property values for comparison
+ // We might take the property values even if ELF values are available,
+ // since the latter only reflect the CPU/ABI version of the binary files!
+ final String propARCH = System.getProperty("os.arch");
+ final String propARCH_lower = propARCH.toLowerCase();
+ final CPUType propCpuType = CPUType.query(propARCH_lower);
+ final ABIType propABIType = ABIType.query(propCpuType, propARCH_lower);
+ if( DEBUG ) {
+ System.err.println("Platform.Property: ARCH "+propARCH+", CpuType "+propCpuType+", ABIType "+propABIType);
+ }
+
+ final int strategy;
if( isAndroid ) {
+ if( DEBUG ) {
+ System.err.println("Android: CPU_ABI1 str "+AndroidVersion.CPU_ABI+", CPU_TYPE "+AndroidVersion.CPU_TYPE+", ABI_TYPE "+AndroidVersion.ABI_TYPE);
+ System.err.println("Android: CPU_ABI2 str "+AndroidVersion.CPU_ABI2+", CPU_TYPE2 "+AndroidVersion.CPU_TYPE2+", ABI_TYPE2 "+AndroidVersion.ABI_TYPE2);
+ }
if( elfValid ) {
- if( elfCpuType.family == AndroidVersion.CPU_TYPE.family &&
- elfAbiType == AndroidVersion.ABI_TYPE )
+ if( null != AndroidVersion.CPU_TYPE &&
+ isCompatible(elfCpuType, elfABIType, AndroidVersion.CPU_TYPE, AndroidVersion.ABI_TYPE) )
{
+ // ELF matches Android-1
ARCH = AndroidVersion.CPU_ABI;
+ ARCH_lower = ARCH;
CPU_ARCH = AndroidVersion.CPU_TYPE;
- } else {
+ strategy = 110;
+ } else if( null != AndroidVersion.CPU_TYPE2 &&
+ isCompatible(elfCpuType, elfABIType, AndroidVersion.CPU_TYPE2, AndroidVersion.ABI_TYPE2) )
+ {
+ // ELF matches Android-2
ARCH = AndroidVersion.CPU_ABI2;
+ ARCH_lower = ARCH;
CPU_ARCH = AndroidVersion.CPU_TYPE2;
+ strategy = 111;
+ } else {
+ // We assume our ELF data beats AndroidVersion info (correctness)
+ ARCH = elfCpuType.toString();
+ ARCH_lower = ARCH.toLowerCase();
+ CPU_ARCH = elfCpuType;
+ strategy = 112;
}
- ABI_TYPE = elfAbiType;
+ ABI_TYPE = elfABIType;
} else {
- // default
- if( AndroidVersion.CPU_TYPE.family == CPUFamily.ARM || null == AndroidVersion.CPU_TYPE2 ) {
+ if( AndroidVersion.CPU_TYPE.family == CPUFamily.ARM ||
+ null == AndroidVersion.CPU_TYPE2 ) {
+ // Favor Android-1: Either b/c ARM Family, or no Android-2
ARCH = AndroidVersion.CPU_ABI;
+ ARCH_lower = ARCH;
CPU_ARCH = AndroidVersion.CPU_TYPE;
ABI_TYPE = AndroidVersion.ABI_TYPE;
+ strategy = 120;
} else {
+ // Last resort Android-2
ARCH = AndroidVersion.CPU_ABI2;
+ ARCH_lower = ARCH;
CPU_ARCH = AndroidVersion.CPU_TYPE2;
ABI_TYPE = AndroidVersion.ABI_TYPE2;
+ strategy = 121;
}
}
- ARCH_lower = ARCH;
} else {
- ARCH = sARCH;
- ARCH_lower = sARCH_lower;
- if( elfValid && CPUFamily.ARM == elfCpuType.family ) {
- // Use Elf for ARM
- CPU_ARCH = elfCpuType;
- ABI_TYPE = elfAbiType;
+ if( elfValid ) {
+ if( isCompatible(elfCpuType, elfABIType, propCpuType, propABIType) ) {
+ // Use property ARCH, compatible w/ ELF
+ ARCH = propARCH;
+ ARCH_lower = propARCH_lower;
+ CPU_ARCH = propCpuType;
+ ABI_TYPE = propABIType;
+ strategy = 210;
+ } else {
+ // use ELF ARCH
+ ARCH = elfCpuName;
+ ARCH_lower = elfCpuName;
+ CPU_ARCH = elfCpuType;
+ ABI_TYPE = elfABIType;
+ strategy = 211;
+ }
} else {
- // Otherwise trust detailed os.arch (?)
- CPU_ARCH = sCpuType;
- ABI_TYPE = ABIType.GENERIC_ABI;
+ // Last resort: properties
+ ARCH = propARCH;
+ ARCH_lower = propARCH_lower;
+ CPU_ARCH = propCpuType;
+ ABI_TYPE = propABIType;
+ strategy = 220;
}
}
if( DEBUG ) {
- System.err.println("Platform.Hard: ARCH "+ARCH+", CPU_ARCH "+CPU_ARCH+", ABI_TYPE "+ABI_TYPE+" - isAndroid "+isAndroid+", elfValid "+elfValid);
+ System.err.println("Platform.Hard: ARCH "+ARCH+", CPU_ARCH "+CPU_ARCH+", ABI_TYPE "+ABI_TYPE+" - strategy "+strategy+"(isAndroid "+isAndroid+", elfValid "+elfValid+")");
}
- MachineDescriptionRuntime.notifyPropsInitialized();
os_and_arch = getOSAndArch(OS_TYPE, CPU_ARCH, ABI_TYPE);
}
@@ -271,49 +364,6 @@ public abstract class PlatformPropsImpl {
return 0x0C0D == tst_s.get(0);
}
- private static final CPUType getCPUTypeImpl(final String archLower) {
- if( archLower.equals("x86") || // jvm + android
- archLower.equals("i386") ||
- archLower.equals("i486") ||
- archLower.equals("i586") ||
- archLower.equals("i686") ) {
- return CPUType.X86_32;
- } else if( archLower.equals("x86_64") ||
- archLower.equals("amd64") ) {
- return CPUType.X86_64;
- } else if( archLower.equals("ia64") ) {
- return CPUType.IA64;
- } else if( archLower.equals("arm") ) {
- return CPUType.ARM;
- } else if( archLower.equals("armv5l") ) {
- return CPUType.ARMv5;
- } else if( archLower.equals("armv6l") ) {
- return CPUType.ARMv6;
- } else if( archLower.equals("armv7l") ||
- archLower.equals("armeabi") || // android
- archLower.equals("armeabi-v7a") ) { // android
- return CPUType.ARMv7;
- } else if( archLower.equals("aarch64") ||
- archLower.equals("arm64") ) {
- return CPUType.ARM64;
- } else if( archLower.equals("armv8-a") ||
- archLower.equals("arm64-v8a") ) {
- return CPUType.ARMv8_A;
- } else if( archLower.equals("sparc") ) {
- return CPUType.SPARC_32;
- } else if( archLower.equals("sparcv9") ) {
- return CPUType.SPARCV9_64;
- } else if( archLower.equals("pa_risc2.0") ) {
- return CPUType.PA_RISC2_0;
- } else if( archLower.equals("ppc") ) {
- return CPUType.PPC;
- } else if( archLower.equals("mips") ) { // android
- return CPUType.MIPS_32;
- } else {
- throw new RuntimeException("Please port CPU detection to your platform (" + OS_lower + "/" + archLower + ")");
- }
- }
-
@SuppressWarnings("unused")
private static final boolean contains(final String data, final String[] search) {
if(null != data && null != search) {
@@ -341,101 +391,53 @@ public abstract class PlatformPropsImpl {
* Elf ARM Tags are read using {@link ElfHeader}, .. and {@link SectionArmAttributes#abiVFPArgsAcceptsVFPVariant(byte)}.
* </p>
*/
- private static final ElfHeader queryABITypeImpl(final OSType osType, final CPUType[] cpuType, final ABIType[] abiType) {
- return AccessController.doPrivileged(new PrivilegedAction<ElfHeader>() {
- @Override
- public ElfHeader run() {
- ElfHeader res = null;
- try {
- File file = null;
- if( OSType.ANDROID == osType ) {
- file = new File(NativeLibrary.findLibrary("gluegen-rt", PlatformPropsImpl.class.getClassLoader()));
- } else {
- if( OSType.LINUX == osType ) {
- file = new File("/proc/self/exe");
- if( !checkFileReadAccess(file) ) {
- file = null;
- }
- }
- if( null == file ) {
- file = findSysLib("java");
- }
- if( null == file ) {
- file = findSysLib("jvm");
- }
- }
- if( null != file ) {
- res = queryABITypeImpl(file, cpuType, abiType);
- }
- } catch(final Throwable t) {
- if(DEBUG) {
- t.printStackTrace();
- }
- }
- return res;
- } } );
- }
- private static final ElfHeader queryABITypeImpl(final File file, final CPUType[] cpuType, final ABIType[] abiType) {
- ElfHeader res = null;
- RandomAccessFile in = null;
+ private static final File queryElfFile(final OSType osType) {
+ File file = null;
try {
- in = new RandomAccessFile(file, "r");
- final ElfHeader eh = ElfHeader.read(in);
- if(DEBUG) {
- System.err.println("ELF: Got HDR "+file+": "+eh);
- }
- if( eh.isArm() ) {
- boolean abiVFPArgsAcceptsVFPVariant = false;
- final SectionHeader sh = eh.getSectionHeader(SectionHeader.SHT_ARM_ATTRIBUTES);
- if( null != sh ) {
- if(DEBUG) {
- System.err.println("ELF: Got ARM Attribs Section Header: "+sh);
- }
- final SectionArmAttributes sArmAttrs = (SectionArmAttributes) sh.readSection(in);
- if(DEBUG) {
- System.err.println("ELF: Got ARM Attribs Section Block : "+sArmAttrs);
- }
- final SectionArmAttributes.Attribute abiVFPArgsAttr = sArmAttrs.get(SectionArmAttributes.Tag.ABI_VFP_args);
- if( null != abiVFPArgsAttr ) {
- abiVFPArgsAcceptsVFPVariant = SectionArmAttributes.abiVFPArgsAcceptsVFPVariant(abiVFPArgsAttr.getULEB128());
+ if( OSType.ANDROID == osType ) {
+ file = new File(NativeLibrary.findLibrary("gluegen-rt", PlatformPropsImpl.class.getClassLoader()));
+ } else {
+ if( OSType.LINUX == osType ) {
+ file = new File("/proc/self/exe");
+ if( !checkFileReadAccess(file) ) {
+ file = null;
}
}
- cpuType[0] = CPUType.ARM; // lowest 32bit denominator, ok for us
- abiType[0] = abiVFPArgsAcceptsVFPVariant ? ABIType.EABI_GNU_ARMHF : ABIType.EABI_GNU_ARMEL;
- if(DEBUG) {
- System.err.println("ELF: abiARM, abiVFPArgsAcceptsVFPVariant "+abiVFPArgsAcceptsVFPVariant);
+ if( null == file ) {
+ file = findSysLib("java");
+ }
+ if( null == file ) {
+ file = findSysLib("jvm");
}
- } else if ( eh.isAARCH64() ) {
- cpuType[0] = CPUType.ARM64;
- abiType[0] = ABIType.EABI_AARCH64;
- } else if ( eh.isX86_64() ) {
- cpuType[0] = CPUType.X86_64;
- abiType[0] = ABIType.GENERIC_ABI;
- } else if ( eh.isX86_32() ) {
- cpuType[0] = CPUType.X86_32;
- abiType[0] = ABIType.GENERIC_ABI;
- } else if ( eh.isIA64() ) {
- cpuType[0] = CPUType.IA64;
- abiType[0] = ABIType.GENERIC_ABI;
- } else if ( eh.isMips() ) {
- cpuType[0] = CPUType.MIPS_32; // FIXME
- abiType[0] = ABIType.GENERIC_ABI;
}
- res = eh;
} catch(final Throwable t) {
if(DEBUG) {
- System.err.println("Caught: "+t.getMessage());
t.printStackTrace();
}
- } finally {
- if(null != in) {
- try {
- in.close();
- } catch (final IOException e) { }
+ }
+ return file;
+ }
+ private static final ElfHeaderPart1 readElfHeaderPart1(final OSType osType, final RandomAccessFile in) {
+ ElfHeaderPart1 res = null;
+ try {
+ res = ElfHeaderPart1.read(osType, in);
+ } catch(final Throwable t) {
+ if(DEBUG) {
+ System.err.println("Caught: "+t.getMessage());
+ t.printStackTrace();
}
}
- if(DEBUG) {
- System.err.println("ELF: res "+res+", cpuType "+cpuType[0]+", abiType "+abiType[0]);
+ return res;
+ }
+ private static final ElfHeaderPart2 readElfHeaderPart2(final ElfHeaderPart1 eh1, final RandomAccessFile in) {
+ ElfHeaderPart2 res = null;
+ try {
+ res = ElfHeaderPart2.read(eh1, in);
+ } catch(final Throwable t) {
+ if(DEBUG) {
+ System.err.println("Caught: "+t.getMessage());
+ t.printStackTrace();
+ }
}
return res;
}
@@ -551,6 +553,9 @@ public abstract class PlatformPropsImpl {
case SPARC_32:
_and_arch_tmp = "sparc";
break;
+ case PPC64:
+ _and_arch_tmp = "ppc64"; // TODO: sync with gluegen-cpptasks-base.xml
+ break;
case PPC:
_and_arch_tmp = "ppc"; // TODO: sync with gluegen-cpptasks-base.xml
break;
@@ -567,7 +572,7 @@ public abstract class PlatformPropsImpl {
_and_arch_tmp = "risc2.0"; // TODO: sync with gluegen-cpptasks-base.xml
break;
default:
- throw new InternalError("Complete case block");
+ throw new InternalError("Unhandled CPUType: "+cpuType);
}
switch( osType ) {
@@ -604,7 +609,7 @@ public abstract class PlatformPropsImpl {
_and_arch_final = "hppa"; // TODO: really only hppa ?
break;
default:
- throw new InternalError("Complete case block");
+ throw new InternalError("Unhandled OSType: "+osType);
}
return os_ + "-" + _and_arch_final;
}
diff --git a/src/java/jogamp/common/os/elf/Ehdr.java b/src/java/jogamp/common/os/elf/Ehdr.java
deleted file mode 100644
index 1aac1c1..0000000
--- a/src/java/jogamp/common/os/elf/Ehdr.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/* !---- DO NOT EDIT: This file autogenerated by com/jogamp/gluegen/JavaEmitter.java on Fri Jan 30 06:44:16 CET 2015 ----! */
-
-
-package jogamp.common.os.elf;
-
-import java.nio.*;
-
-import com.jogamp.gluegen.runtime.*;
-import com.jogamp.common.os.*;
-import com.jogamp.common.nio.*;
-import jogamp.common.os.MachineDescriptionRuntime;
-
-
-public class Ehdr {
-
- StructAccessor accessor;
-
- private static final int mdIdx = MachineDescriptionRuntime.getStatic().ordinal();
-
- private static final int[] Ehdr_size = new int[] { 52 /* ARMle_EABI */, 52 /* X86_32_UNIX */, 64 /* X86_64_UNIX */, 52 /* X86_32_MACOS */, 52 /* X86_32_WINDOWS */, 64 /* X86_64_WINDOWS */, 52 /* SPARC_32_SUNOS */ };
- private static final int[] e_ident_offset = new int[] { 0 /* ARMle_EABI */, 0 /* X86_32_UNIX */, 0 /* X86_64_UNIX */, 0 /* X86_32_MACOS */, 0 /* X86_32_WINDOWS */, 0 /* X86_64_WINDOWS */, 0 /* SPARC_32_SUNOS */ };
- private static final int[] e_ident_size = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 16 /* X86_64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
- private static final int[] e_type_offset = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 16 /* X86_64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
-//private static final int[] e_type_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_machine_offset = new int[] { 18 /* ARMle_EABI */, 18 /* X86_32_UNIX */, 18 /* X86_64_UNIX */, 18 /* X86_32_MACOS */, 18 /* X86_32_WINDOWS */, 18 /* X86_64_WINDOWS */, 18 /* SPARC_32_SUNOS */ };
-//private static final int[] e_machine_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_version_offset = new int[] { 20 /* ARMle_EABI */, 20 /* X86_32_UNIX */, 20 /* X86_64_UNIX */, 20 /* X86_32_MACOS */, 20 /* X86_32_WINDOWS */, 20 /* X86_64_WINDOWS */, 20 /* SPARC_32_SUNOS */ };
-//private static final int[] e_version_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] e_entry_offset = new int[] { 24 /* ARMle_EABI */, 24 /* X86_32_UNIX */, 24 /* X86_64_UNIX */, 24 /* X86_32_MACOS */, 24 /* X86_32_WINDOWS */, 24 /* X86_64_WINDOWS */, 24 /* SPARC_32_SUNOS */ };
-//private static final int[] e_entry_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] e_phoff_offset = new int[] { 28 /* ARMle_EABI */, 28 /* X86_32_UNIX */, 32 /* X86_64_UNIX */, 28 /* X86_32_MACOS */, 28 /* X86_32_WINDOWS */, 32 /* X86_64_WINDOWS */, 28 /* SPARC_32_SUNOS */ };
-//private static final int[] e_phoff_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] e_shoff_offset = new int[] { 32 /* ARMle_EABI */, 32 /* X86_32_UNIX */, 40 /* X86_64_UNIX */, 32 /* X86_32_MACOS */, 32 /* X86_32_WINDOWS */, 40 /* X86_64_WINDOWS */, 32 /* SPARC_32_SUNOS */ };
-//private static final int[] e_shoff_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] e_flags_offset = new int[] { 36 /* ARMle_EABI */, 36 /* X86_32_UNIX */, 48 /* X86_64_UNIX */, 36 /* X86_32_MACOS */, 36 /* X86_32_WINDOWS */, 48 /* X86_64_WINDOWS */, 36 /* SPARC_32_SUNOS */ };
-//private static final int[] e_flags_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] e_ehsize_offset = new int[] { 40 /* ARMle_EABI */, 40 /* X86_32_UNIX */, 52 /* X86_64_UNIX */, 40 /* X86_32_MACOS */, 40 /* X86_32_WINDOWS */, 52 /* X86_64_WINDOWS */, 40 /* SPARC_32_SUNOS */ };
-//private static final int[] e_ehsize_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_phentsize_offset = new int[] { 42 /* ARMle_EABI */, 42 /* X86_32_UNIX */, 54 /* X86_64_UNIX */, 42 /* X86_32_MACOS */, 42 /* X86_32_WINDOWS */, 54 /* X86_64_WINDOWS */, 42 /* SPARC_32_SUNOS */ };
-//private static final int[] e_phentsize_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_phnum_offset = new int[] { 44 /* ARMle_EABI */, 44 /* X86_32_UNIX */, 56 /* X86_64_UNIX */, 44 /* X86_32_MACOS */, 44 /* X86_32_WINDOWS */, 56 /* X86_64_WINDOWS */, 44 /* SPARC_32_SUNOS */ };
-//private static final int[] e_phnum_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_shentsize_offset = new int[] { 46 /* ARMle_EABI */, 46 /* X86_32_UNIX */, 58 /* X86_64_UNIX */, 46 /* X86_32_MACOS */, 46 /* X86_32_WINDOWS */, 58 /* X86_64_WINDOWS */, 46 /* SPARC_32_SUNOS */ };
-//private static final int[] e_shentsize_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_shnum_offset = new int[] { 48 /* ARMle_EABI */, 48 /* X86_32_UNIX */, 60 /* X86_64_UNIX */, 48 /* X86_32_MACOS */, 48 /* X86_32_WINDOWS */, 60 /* X86_64_WINDOWS */, 48 /* SPARC_32_SUNOS */ };
-//private static final int[] e_shnum_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
- private static final int[] e_shstrndx_offset = new int[] { 50 /* ARMle_EABI */, 50 /* X86_32_UNIX */, 62 /* X86_64_UNIX */, 50 /* X86_32_MACOS */, 50 /* X86_32_WINDOWS */, 62 /* X86_64_WINDOWS */, 50 /* SPARC_32_SUNOS */ };
-//private static final int[] e_shstrndx_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* X86_64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
-
- public static int size() {
- return Ehdr_size[mdIdx];
- }
-
- public static Ehdr create() {
- return create(Buffers.newDirectByteBuffer(size()));
- }
-
- public static Ehdr create(java.nio.ByteBuffer buf) {
- return new Ehdr(buf);
- }
-
- Ehdr(java.nio.ByteBuffer buf) {
- accessor = new StructAccessor(buf);
- }
-
- public java.nio.ByteBuffer getBuffer() {
- return accessor.getBuffer();
- }
-
- /** Getter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
- public static final int getE_identArrayLength() {
- return 16;
- }
-
- /** Setter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
- public Ehdr setE_ident(final int offset, byte[] val) {
- final int arrayLength = 16;
- if( offset + val.length > arrayLength ) { throw new IndexOutOfBoundsException("offset "+offset+" + val.length "+val.length+" > array-length "+arrayLength); };
- final int elemSize = Buffers.SIZEOF_BYTE;
- final ByteBuffer destB = getBuffer();
- final int bTotal = arrayLength * elemSize;
- if( bTotal > e_ident_size[mdIdx] ) { throw new IndexOutOfBoundsException("bTotal "+bTotal+" > size "+e_ident_size[mdIdx]+", elemSize "+elemSize+" * "+arrayLength); };
- int bOffset = e_ident_offset[mdIdx];
- final int bLimes = bOffset + bTotal;
- if( bLimes > destB.limit() ) { throw new IndexOutOfBoundsException("bLimes "+bLimes+" > buffer.limit "+destB.limit()+", elemOff "+bOffset+", elemSize "+elemSize+" * "+arrayLength); };
- bOffset += elemSize * offset;
- accessor.setBytesAt(bOffset, val);
- return this;
- }
-
- /** Getter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
- public ByteBuffer getE_ident() {
- return accessor.slice(e_ident_offset[mdIdx], Buffers.SIZEOF_BYTE * 16);
- }
-
- /** Getter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
- public byte[] getE_ident(final int offset, byte result[]) {
- final int arrayLength = 16;
- if( offset + result.length > arrayLength ) { throw new IndexOutOfBoundsException("offset "+offset+" + result.length "+result.length+" > array-length "+arrayLength); };
- return accessor.getBytesAt(e_ident_offset[mdIdx] + (Buffers.SIZEOF_BYTE * offset), result);
- }
-
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_type(short val) {
- accessor.setShortAt(e_type_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_type() {
- return accessor.getShortAt(e_type_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_machine(short val) {
- accessor.setShortAt(e_machine_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_machine() {
- return accessor.getShortAt(e_machine_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
- public Ehdr setE_version(int val) {
- accessor.setIntAt(e_version_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
- public int getE_version() {
- return accessor.getIntAt(e_version_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['ElfN_Addr' (typedef), size [fixed false, lnx64 8], [int]] */
- public Ehdr setE_entry(long val) {
- accessor.setLongAt(e_entry_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
- return this;
- }
-
- /** Getter for native field: CType['ElfN_Addr' (typedef), size [fixed false, lnx64 8], [int]] */
- public long getE_entry() {
- return accessor.getLongAt(e_entry_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
- }
-
- /** Setter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
- public Ehdr setE_phoff(long val) {
- accessor.setLongAt(e_phoff_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
- return this;
- }
-
- /** Getter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
- public long getE_phoff() {
- return accessor.getLongAt(e_phoff_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
- }
-
- /** Setter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
- public Ehdr setE_shoff(long val) {
- accessor.setLongAt(e_shoff_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
- return this;
- }
-
- /** Getter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
- public long getE_shoff() {
- return accessor.getLongAt(e_shoff_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
- }
-
- /** Setter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
- public Ehdr setE_flags(int val) {
- accessor.setIntAt(e_flags_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
- public int getE_flags() {
- return accessor.getIntAt(e_flags_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_ehsize(short val) {
- accessor.setShortAt(e_ehsize_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_ehsize() {
- return accessor.getShortAt(e_ehsize_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_phentsize(short val) {
- accessor.setShortAt(e_phentsize_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_phentsize() {
- return accessor.getShortAt(e_phentsize_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_phnum(short val) {
- accessor.setShortAt(e_phnum_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_phnum() {
- return accessor.getShortAt(e_phnum_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_shentsize(short val) {
- accessor.setShortAt(e_shentsize_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_shentsize() {
- return accessor.getShortAt(e_shentsize_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_shnum(short val) {
- accessor.setShortAt(e_shnum_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_shnum() {
- return accessor.getShortAt(e_shnum_offset[mdIdx]);
- }
-
- /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public Ehdr setE_shstrndx(short val) {
- accessor.setShortAt(e_shstrndx_offset[mdIdx], val);
- return this;
- }
-
- /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
- public short getE_shstrndx() {
- return accessor.getShortAt(e_shstrndx_offset[mdIdx]);
- }
-}
diff --git a/src/java/jogamp/common/os/elf/Ehdr_p1.java b/src/java/jogamp/common/os/elf/Ehdr_p1.java
new file mode 100644
index 0000000..0d23a0a
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/Ehdr_p1.java
@@ -0,0 +1,118 @@
+/* !---- DO NOT EDIT: This file autogenerated by com/jogamp/gluegen/JavaEmitter.java on Sun Feb 01 03:27:25 CET 2015 ----! */
+
+
+package jogamp.common.os.elf;
+
+import java.nio.*;
+
+import com.jogamp.gluegen.runtime.*;
+import com.jogamp.common.os.*;
+import com.jogamp.common.nio.*;
+import jogamp.common.os.MachineDescriptionRuntime;
+
+
+public class Ehdr_p1 {
+
+ StructAccessor accessor;
+
+ private static final int mdIdx = 0;
+ private final MachineDescription md;
+
+ private static final int[] Ehdr_p1_size = new int[] { 24 /* ARMle_EABI */, 24 /* X86_32_UNIX */, 24 /* LP64_UNIX */, 24 /* X86_32_MACOS */, 24 /* X86_32_WINDOWS */, 24 /* X86_64_WINDOWS */, 24 /* SPARC_32_SUNOS */ };
+ private static final int[] e_ident_offset = new int[] { 0 /* ARMle_EABI */, 0 /* X86_32_UNIX */, 0 /* LP64_UNIX */, 0 /* X86_32_MACOS */, 0 /* X86_32_WINDOWS */, 0 /* X86_64_WINDOWS */, 0 /* SPARC_32_SUNOS */ };
+ private static final int[] e_ident_size = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 16 /* LP64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
+ private static final int[] e_type_offset = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 16 /* LP64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
+//private static final int[] e_type_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_machine_offset = new int[] { 18 /* ARMle_EABI */, 18 /* X86_32_UNIX */, 18 /* LP64_UNIX */, 18 /* X86_32_MACOS */, 18 /* X86_32_WINDOWS */, 18 /* X86_64_WINDOWS */, 18 /* SPARC_32_SUNOS */ };
+//private static final int[] e_machine_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_version_offset = new int[] { 20 /* ARMle_EABI */, 20 /* X86_32_UNIX */, 20 /* LP64_UNIX */, 20 /* X86_32_MACOS */, 20 /* X86_32_WINDOWS */, 20 /* X86_64_WINDOWS */, 20 /* SPARC_32_SUNOS */ };
+//private static final int[] e_version_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+
+ public static int size() {
+ return Ehdr_p1_size[mdIdx];
+ }
+
+ public static Ehdr_p1 create() {
+ return create(Buffers.newDirectByteBuffer(size()));
+ }
+
+ public static Ehdr_p1 create(java.nio.ByteBuffer buf) {
+ return new Ehdr_p1(buf);
+ }
+
+ Ehdr_p1(java.nio.ByteBuffer buf) {
+ md = MachineDescription.StaticConfig.values()[mdIdx].md;
+ accessor = new StructAccessor(buf);
+ }
+
+ public java.nio.ByteBuffer getBuffer() {
+ return accessor.getBuffer();
+ }
+
+ /** Getter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
+ public static final int getE_identArrayLength() {
+ return 16;
+ }
+
+ /** Setter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
+ public Ehdr_p1 setE_ident(final int offset, byte[] val) {
+ final int arrayLength = 16;
+ if( offset + val.length > arrayLength ) { throw new IndexOutOfBoundsException("offset "+offset+" + val.length "+val.length+" > array-length "+arrayLength); };
+ final int elemSize = Buffers.SIZEOF_BYTE;
+ final ByteBuffer destB = getBuffer();
+ final int bTotal = arrayLength * elemSize;
+ if( bTotal > e_ident_size[mdIdx] ) { throw new IndexOutOfBoundsException("bTotal "+bTotal+" > size "+e_ident_size[mdIdx]+", elemSize "+elemSize+" * "+arrayLength); };
+ int bOffset = e_ident_offset[mdIdx];
+ final int bLimes = bOffset + bTotal;
+ if( bLimes > destB.limit() ) { throw new IndexOutOfBoundsException("bLimes "+bLimes+" > buffer.limit "+destB.limit()+", elemOff "+bOffset+", elemSize "+elemSize+" * "+arrayLength); };
+ bOffset += elemSize * offset;
+ accessor.setBytesAt(bOffset, val);
+ return this;
+ }
+
+ /** Getter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
+ public ByteBuffer getE_ident() {
+ return accessor.slice(e_ident_offset[mdIdx], Buffers.SIZEOF_BYTE * 16);
+ }
+
+ /** Getter for native field: CType['char *', size [fixed false, lnx64 16], [array*1]], with array length of <code>16</code> */
+ public byte[] getE_ident(final int offset, byte result[]) {
+ final int arrayLength = 16;
+ if( offset + result.length > arrayLength ) { throw new IndexOutOfBoundsException("offset "+offset+" + result.length "+result.length+" > array-length "+arrayLength); };
+ return accessor.getBytesAt(e_ident_offset[mdIdx] + (Buffers.SIZEOF_BYTE * offset), result);
+ }
+
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p1 setE_type(short val) {
+ accessor.setShortAt(e_type_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_type() {
+ return accessor.getShortAt(e_type_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p1 setE_machine(short val) {
+ accessor.setShortAt(e_machine_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_machine() {
+ return accessor.getShortAt(e_machine_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
+ public Ehdr_p1 setE_version(int val) {
+ accessor.setIntAt(e_version_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
+ public int getE_version() {
+ return accessor.getIntAt(e_version_offset[mdIdx]);
+ }
+}
diff --git a/src/java/jogamp/common/os/elf/Ehdr_p2.java b/src/java/jogamp/common/os/elf/Ehdr_p2.java
new file mode 100644
index 0000000..9dc561a
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/Ehdr_p2.java
@@ -0,0 +1,176 @@
+/* !---- DO NOT EDIT: This file autogenerated by com/jogamp/gluegen/JavaEmitter.java on Sun Feb 01 03:27:25 CET 2015 ----! */
+
+
+package jogamp.common.os.elf;
+
+import java.nio.*;
+
+import com.jogamp.gluegen.runtime.*;
+import com.jogamp.common.os.*;
+import com.jogamp.common.nio.*;
+import jogamp.common.os.MachineDescriptionRuntime;
+
+
+public class Ehdr_p2 {
+
+ StructAccessor accessor;
+
+ private final int mdIdx;
+ private final MachineDescription md;
+
+ private static final int[] Ehdr_p2_size = new int[] { 28 /* ARMle_EABI */, 28 /* X86_32_UNIX */, 40 /* LP64_UNIX */, 28 /* X86_32_MACOS */, 28 /* X86_32_WINDOWS */, 40 /* X86_64_WINDOWS */, 28 /* SPARC_32_SUNOS */ };
+ private static final int[] e_entry_offset = new int[] { 0 /* ARMle_EABI */, 0 /* X86_32_UNIX */, 0 /* LP64_UNIX */, 0 /* X86_32_MACOS */, 0 /* X86_32_WINDOWS */, 0 /* X86_64_WINDOWS */, 0 /* SPARC_32_SUNOS */ };
+//private static final int[] e_entry_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] e_phoff_offset = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+//private static final int[] e_phoff_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] e_shoff_offset = new int[] { 8 /* ARMle_EABI */, 8 /* X86_32_UNIX */, 16 /* LP64_UNIX */, 8 /* X86_32_MACOS */, 8 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 8 /* SPARC_32_SUNOS */ };
+//private static final int[] e_shoff_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] e_flags_offset = new int[] { 12 /* ARMle_EABI */, 12 /* X86_32_UNIX */, 24 /* LP64_UNIX */, 12 /* X86_32_MACOS */, 12 /* X86_32_WINDOWS */, 24 /* X86_64_WINDOWS */, 12 /* SPARC_32_SUNOS */ };
+//private static final int[] e_flags_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] e_ehsize_offset = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 28 /* LP64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 28 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
+//private static final int[] e_ehsize_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_phentsize_offset = new int[] { 18 /* ARMle_EABI */, 18 /* X86_32_UNIX */, 30 /* LP64_UNIX */, 18 /* X86_32_MACOS */, 18 /* X86_32_WINDOWS */, 30 /* X86_64_WINDOWS */, 18 /* SPARC_32_SUNOS */ };
+//private static final int[] e_phentsize_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_phnum_offset = new int[] { 20 /* ARMle_EABI */, 20 /* X86_32_UNIX */, 32 /* LP64_UNIX */, 20 /* X86_32_MACOS */, 20 /* X86_32_WINDOWS */, 32 /* X86_64_WINDOWS */, 20 /* SPARC_32_SUNOS */ };
+//private static final int[] e_phnum_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_shentsize_offset = new int[] { 22 /* ARMle_EABI */, 22 /* X86_32_UNIX */, 34 /* LP64_UNIX */, 22 /* X86_32_MACOS */, 22 /* X86_32_WINDOWS */, 34 /* X86_64_WINDOWS */, 22 /* SPARC_32_SUNOS */ };
+//private static final int[] e_shentsize_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_shnum_offset = new int[] { 24 /* ARMle_EABI */, 24 /* X86_32_UNIX */, 36 /* LP64_UNIX */, 24 /* X86_32_MACOS */, 24 /* X86_32_WINDOWS */, 36 /* X86_64_WINDOWS */, 24 /* SPARC_32_SUNOS */ };
+//private static final int[] e_shnum_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+ private static final int[] e_shstrndx_offset = new int[] { 26 /* ARMle_EABI */, 26 /* X86_32_UNIX */, 38 /* LP64_UNIX */, 26 /* X86_32_MACOS */, 26 /* X86_32_WINDOWS */, 38 /* X86_64_WINDOWS */, 26 /* SPARC_32_SUNOS */ };
+//private static final int[] e_shstrndx_size = new int[] { 2 /* ARMle_EABI */, 2 /* X86_32_UNIX */, 2 /* LP64_UNIX */, 2 /* X86_32_MACOS */, 2 /* X86_32_WINDOWS */, 2 /* X86_64_WINDOWS */, 2 /* SPARC_32_SUNOS */ };
+
+ public java.nio.ByteBuffer getBuffer() {
+ return accessor.getBuffer();
+ }
+
+ /** Setter for native field: CType['ElfN_Addr' (typedef), size [fixed false, lnx64 8], [int]] */
+ public Ehdr_p2 setE_entry(long val) {
+ accessor.setLongAt(e_entry_offset[mdIdx], val, md.longSizeInBytes());
+ return this;
+ }
+
+ /** Getter for native field: CType['ElfN_Addr' (typedef), size [fixed false, lnx64 8], [int]] */
+ public long getE_entry() {
+ return accessor.getLongAt(e_entry_offset[mdIdx], md.longSizeInBytes());
+ }
+
+ /** Setter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
+ public Ehdr_p2 setE_phoff(long val) {
+ accessor.setLongAt(e_phoff_offset[mdIdx], val, md.longSizeInBytes());
+ return this;
+ }
+
+ /** Getter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
+ public long getE_phoff() {
+ return accessor.getLongAt(e_phoff_offset[mdIdx], md.longSizeInBytes());
+ }
+
+ /** Setter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
+ public Ehdr_p2 setE_shoff(long val) {
+ accessor.setLongAt(e_shoff_offset[mdIdx], val, md.longSizeInBytes());
+ return this;
+ }
+
+ /** Getter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
+ public long getE_shoff() {
+ return accessor.getLongAt(e_shoff_offset[mdIdx], md.longSizeInBytes());
+ }
+
+ /** Setter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
+ public Ehdr_p2 setE_flags(int val) {
+ accessor.setIntAt(e_flags_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
+ public int getE_flags() {
+ return accessor.getIntAt(e_flags_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p2 setE_ehsize(short val) {
+ accessor.setShortAt(e_ehsize_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_ehsize() {
+ return accessor.getShortAt(e_ehsize_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p2 setE_phentsize(short val) {
+ accessor.setShortAt(e_phentsize_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_phentsize() {
+ return accessor.getShortAt(e_phentsize_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p2 setE_phnum(short val) {
+ accessor.setShortAt(e_phnum_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_phnum() {
+ return accessor.getShortAt(e_phnum_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p2 setE_shentsize(short val) {
+ accessor.setShortAt(e_shentsize_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_shentsize() {
+ return accessor.getShortAt(e_shentsize_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p2 setE_shnum(short val) {
+ accessor.setShortAt(e_shnum_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_shnum() {
+ return accessor.getShortAt(e_shnum_offset[mdIdx]);
+ }
+
+ /** Setter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public Ehdr_p2 setE_shstrndx(short val) {
+ accessor.setShortAt(e_shstrndx_offset[mdIdx], val);
+ return this;
+ }
+
+ /** Getter for native field: CType['uint16_t', size [fixed true, lnx64 2], [int]] */
+ public short getE_shstrndx() {
+ return accessor.getShortAt(e_shstrndx_offset[mdIdx]);
+ }
+
+ // --- Begin CustomJavaCode .cfg declarations
+ public static int size(final int mdIdx) {
+ return Ehdr_p2_size[mdIdx];
+ }
+
+ public static Ehdr_p2 create(final int mdIdx) {
+ return create(mdIdx, Buffers.newDirectByteBuffer(size(mdIdx)));
+ }
+
+ public static Ehdr_p2 create(final int mdIdx, final java.nio.ByteBuffer buf) {
+ return new Ehdr_p2(mdIdx, buf);
+ }
+
+ Ehdr_p2(final int mdIdx, final java.nio.ByteBuffer buf) {
+ this.mdIdx = mdIdx;
+ this.md = MachineDescription.StaticConfig.values()[mdIdx].md;
+ this.accessor = new StructAccessor(buf);
+ }
+ // ---- End CustomJavaCode .cfg declarations
+}
diff --git a/src/java/jogamp/common/os/elf/ElfHeader.java b/src/java/jogamp/common/os/elf/ElfHeaderPart1.java
index 60b6d50..ec926e9 100644
--- a/src/java/jogamp/common/os/elf/ElfHeader.java
+++ b/src/java/jogamp/common/os/elf/ElfHeaderPart1.java
@@ -31,13 +31,21 @@ import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
+import jogamp.common.Debug;
+import jogamp.common.os.MachineDescriptionRuntime;
+
+import com.jogamp.common.os.MachineDescription;
+import com.jogamp.common.os.Platform.ABIType;
+import com.jogamp.common.os.Platform.CPUType;
+import com.jogamp.common.os.Platform.OSType;
+
import static jogamp.common.os.elf.IOUtils.readBytes;
-import static jogamp.common.os.elf.IOUtils.seek;
-import static jogamp.common.os.elf.IOUtils.shortToInt;
-import static jogamp.common.os.elf.IOUtils.toHexString;
/**
- * ELF ABI Header
+ * ELF ABI Header Part-1
+ * <p>
+ * Part-1 can be read w/o knowledge of CPUType!
+ * </p>
* <p>
* References:
* <ul>
@@ -46,11 +54,14 @@ import static jogamp.common.os.elf.IOUtils.toHexString;
* <li>http://infocenter.arm.com/
* <ul>
* <li>ARM IHI 0044E, current through ABI release 2.09</li>
+ * <li>ARM IHI 0056B: Elf for ARM 64-bit Architecture</li>
* </ul></li>
* </ul>
* </p>
*/
-public class ElfHeader {
+public class ElfHeaderPart1 {
+ static final boolean DEBUG = Debug.debug("Platform");
+
/** Size of e_ident array - {@value} */
public static int EI_NIDENT = 16;
@@ -137,64 +148,6 @@ public class ElfHeader {
*/
public static final int EI_PAD = 9;
- /**
- * This masks an 8-bit version number, the version of the ABI to which this
- * ELF file conforms. This ABI is version 5. A value of 0 denotes unknown conformance.
- * {@value}
- */
- public static final int EF_ARM_ABIMASK = 0xFF000000;
- public static final int EF_ARM_ABISHIFT = 24;
-
- /**
- * ARM ABI version 5.
- * {@value}
- */
- public static final int EF_ARM_ABI5 = 0x05000000;
-
- /**
- * The ELF file contains BE-8 code, suitable for execution on an ARM
- * Architecture v6 processor. This flag must only be set on an executable file.
- * {@value}
- */
- public static final int EF_ARM_BE8 = 0x00800000;
-
- /**
- * Legacy code (ABI version 4 and earlier) generated by gcc-arm-xxx might
- * use these bits.
- * {@value}
- */
- public static final int EF_ARM_GCCMASK = 0x00400FFF;
-
- /**
- * Set in executable file headers (e_type = ET_EXEC or ET_DYN) to note that
- * the executable file was built to conform to the hardware floating-point
- * procedure-call standard.
- * <p>
- * Compatible with legacy (pre version 5) gcc use as EF_ARM_VFP_FLOAT.
- * </p>
- * <p>
- * Note: This is not used (anymore)
- * </p>
- * {@value}
- */
- public static final int EF_ARM_ABI_FLOAT_HARD = 0x00000400;
-
- /**
- * Set in executable file headers (e_type = ET_EXEC or ET_DYN) to note
- * explicitly that the executable file was built to conform to the software
- * floating-point procedure-call standard (the base standard). If both
- * {@link #EF_ARM_ABI_FLOAT_HARD} and {@link #EF_ARM_ABI_FLOAT_SOFT} are clear,
- * conformance to the base procedure-call standard is implied.
- * <p>
- * Compatible with legacy (pre version 5) gcc use as EF_ARM_SOFT_FLOAT.
- * </p>
- * <p>
- * Note: This is not used (anymore)
- * </p>
- * {@value}
- */
- public static final int EF_ARM_ABI_FLOAT_SOFT = 0x00000200;
-
/** An unknown type - {@value} */
public static final short ET_NONE = 0;
/** A relocatable file - {@value} */
@@ -365,47 +318,104 @@ public class ElfHeader {
ELFMAG3 == ident[3] ;
}
- /** Public access to the raw elf header */
- public final Ehdr d;
+ /** Public access to the raw elf header part-1 (CPU/ABI independent read) */
+ public final Ehdr_p1 raw;
+ private final byte[] E_ident;
- /** Public access to the {@link SectionHeader} */
- public final SectionHeader[] sht;
+ /** Lower case CPUType name */
+ public final String cpuName;
+ public final CPUType cpuType;
+ public final ABIType abiType;
- private final String string;
- private final byte[] E_ident;
+ public final MachineDescription.StaticConfig machDesc;
/**
* Note: The input stream shall stay untouch to be able to read sections!
- *
+ * @param osType TODO
* @param in input stream of a binary file at position zero
+ *
* @return
* @throws IOException if reading from the given input stream fails or less then ELF Header size bytes
* @throws IllegalArgumentException if the given input stream does not represent an ELF Header
*/
- public static ElfHeader read(final RandomAccessFile in) throws IOException, IllegalArgumentException {
- final int eh_sz = Ehdr.size();
- final byte[] buf = new byte[eh_sz];
- readBytes (in, buf, 0, eh_sz);
- final ElfHeader eh = new ElfHeader(ByteBuffer.wrap(buf, 0, buf.length), in);
- return eh;
+ public static ElfHeaderPart1 read(final OSType osType, final RandomAccessFile in) throws IOException, IllegalArgumentException {
+ return new ElfHeaderPart1(osType, in);
}
/**
+ * @param osType TODO
* @param buf ELF Header bytes
* @throws IllegalArgumentException if the given buffer does not represent an ELF Header
* @throws IOException
*/
- ElfHeader(final java.nio.ByteBuffer buf, final RandomAccessFile in) throws IllegalArgumentException, IOException {
- d = Ehdr.create(buf);
- E_ident = d.getE_ident(0, new byte[Ehdr.getE_identArrayLength()]);
+ ElfHeaderPart1(final OSType osType, final RandomAccessFile in) throws IllegalArgumentException, IOException {
+ {
+ final byte[] buf = new byte[Ehdr_p1.size()];
+ readBytes (in, buf, 0, buf.length);
+ final ByteBuffer eh1Bytes = ByteBuffer.wrap(buf, 0, buf.length);
+ raw = Ehdr_p1.create(eh1Bytes);
+ }
+ E_ident = raw.getE_ident(0, new byte[Ehdr_p1.getE_identArrayLength()]);
if( !isIdentityValid(E_ident) ) {
throw new IllegalArgumentException("Buffer is not an ELF Header");
}
- sht = readSectionHeaderTable(in);
- string = toStringImpl();
- }
- public final short getSize() { return d.getE_ehsize(); }
+ final short machine = getMachine();
+ switch ( machine ) {
+ case EM_ARM:
+ cpuName = "arm"; // lowest 32bit denominator, ok for now
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_AARCH64:
+ cpuName = "aarch64";
+ abiType = ABIType.EABI_AARCH64;
+ break;
+ case EM_X86_64:
+ cpuName = "x86_64";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_386:
+ cpuName = "i386";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_486:
+ cpuName = "i486";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_IA_64:
+ cpuName = "ia64";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_MIPS:
+ cpuName = "mips";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_MIPS_X:
+ cpuName = "mips-x";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_MIPS_RS3_LE:
+ cpuName = "mips-rs3-le";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_PPC:
+ cpuName = "ppc";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_PPC64:
+ cpuName = "ppc64";
+ abiType = ABIType.GENERIC_ABI;
+ break;
+ case EM_SH: // Hitachi SuperH ?
+ default:
+ throw new IllegalArgumentException("CPUType and ABIType could not be determined");
+ }
+ cpuType = CPUType.query(cpuName.toLowerCase());
+ machDesc = MachineDescriptionRuntime.get(osType, cpuType, isLittleEndian());
+ if(DEBUG) {
+ System.err.println("ELF-1: cpuName "+cpuName+" -> "+cpuType+", "+abiType+", machDesc "+machDesc.toShortString());
+ }
+ }
/**
* Returns the architecture class in bits,
@@ -428,6 +438,19 @@ public class ElfHeader {
return E_ident[EI_DATA];
}
+ /**
+ * Returns whether the processor's {@link #getDataEncodingMode() data encoding} is {@link #ELFDATA2LSB}.
+ */
+ public final boolean isLittleEndian() { return ELFDATA2LSB == E_ident[EI_DATA]; }
+ /**
+ * Returns whether the processor's {@link #getDataEncodingMode() data encoding} is {@link #ELFDATA2MSB}.
+ */
+ public final boolean isBigEndian() { return ELFDATA2MSB == E_ident[EI_DATA]; }
+ /**
+ * Returns whether the processor's {@link #getDataEncodingMode() data encoding} is {@link #ELFDATANONE}.
+ */
+ public final boolean isNoneEndian() { return ELFDATANONE == E_ident[EI_DATA]; }
+
/** Returns the ELF file version, should be {@link #EV_CURRENT}. */
public final byte getVersion() {
return E_ident[EI_VERSION];
@@ -445,210 +468,33 @@ public class ElfHeader {
/** Returns the object file type, e.g. {@link #ET_EXEC}, .. */
public final short getType() {
- return d.getE_type();
+ return raw.getE_type();
}
/** Returns the required architecture for the file, e.g. {@link #EM_386}, .. */
public final short getMachine() {
- return d.getE_machine();
- }
-
- /**
- * Returns true if {@link #getMachine() machine} is a 32 bit ARM CPU
- * of type {@link #EM_ARM}. */
- public final boolean isArm() {
- return getMachine() == EM_ARM;
- }
-
- /**
- * Returns true if {@link #getMachine() machine} is a 64 bit AARCH64 ARM CPU
- * of type {@link #EM_AARCH64}. */
- public final boolean isAARCH64() {
- return getMachine() == EM_AARCH64;
- }
-
- /**
- * Returns true if {@link #getMachine() machine} is a 32 or 64 bit Intel CPU
- * of type {@link #EM_386}, {@link #EM_486} or {@link #EM_X86_64}. */
- public final boolean isX86_32() {
- final short m = getMachine();
- return EM_386 == m ||
- EM_486 == m ||
- EM_X86_64 == m;
- }
-
- /**
- * Returns true if {@link #getMachine() machine} is a 64 bit AMD/Intel x86_64 CPU
- * of type {@link #EM_X86_64}. */
- public final boolean isX86_64() {
- return getMachine() == EM_X86_64;
- }
-
- /**
- * Returns true if {@link #getMachine() machine} is a 64 bit Intel Itanium CPU
- * of type {@link #EM_IA_64}. */
- public final boolean isIA64() {
- return getMachine() == EM_IA_64;
- }
-
- /**
- * Returns true if {@link #getMachine() machine} is a 32 or 64 bit MIPS CPU
- * of type {@link #EM_MIPS}, {@link #EM_MIPS_X} or {@link #EM_MIPS_RS3_LE}. */
- public final boolean isMips() {
- final short m = getMachine();
- return EM_MIPS == m ||
- EM_MIPS_X == m ||
- EM_MIPS_RS3_LE == m;
- }
-
- /** Returns the processor-specific flags associated with the file. */
- public final int getFlags() {
- return d.getE_flags();
- }
-
- /** Returns the ARM EABI version from {@link #getFlags() flags}, maybe 0 if not an ARM EABI. */
- public byte getArmABI() {
- return (byte) ( ( ( EF_ARM_ABIMASK & d.getE_flags() ) >> EF_ARM_ABISHIFT ) & 0xff );
- }
-
- /** Returns the ARM EABI legacy GCC {@link #getFlags() flags}, maybe 0 if not an ARM EABI or not having legacy GCC flags. */
- public int getArmLegacyGCCFlags() {
- final int f = d.getE_flags();
- return 0 != ( EF_ARM_ABIMASK & f ) ? ( EF_ARM_GCCMASK & f ) : 0;
- }
-
- /**
- * Returns the ARM EABI float mode from {@link #getFlags() flags},
- * i.e. 1 for {@link #EF_ARM_ABI_FLOAT_SOFT}, 2 for {@link #EF_ARM_ABI_FLOAT_HARD}
- * or 0 for none.
- * <p>
- * Note: This is not used (anymore)
- * </p>
- */
- public byte getArmFloatMode() {
- final int f = d.getE_flags();
- if( 0 != ( EF_ARM_ABIMASK & f ) ) {
- if( ( EF_ARM_ABI_FLOAT_HARD & f ) != 0 ) {
- return 2;
- }
- if( ( EF_ARM_ABI_FLOAT_SOFT & f ) != 0 ) {
- return 1;
- }
- }
- return 0;
- }
-
- /** Returns the 1st occurence of matching SectionHeader {@link SectionHeader#getType() type}, or null if not exists. */
- public final SectionHeader getSectionHeader(final int type) {
- for(int i=0; i<sht.length; i++) {
- final SectionHeader sh = sht[i];
- if( sh.getType() == type ) {
- return sh;
- }
- }
- return null;
- }
-
- /** Returns the 1st occurence of matching SectionHeader {@link SectionHeader#getName() name}, or null if not exists. */
- public final SectionHeader getSectionHeader(final String name) {
- for(int i=0; i<sht.length; i++) {
- final SectionHeader sh = sht[i];
- if( sh.getName().equals(name) ) {
- return sh;
- }
- }
- return null;
+ return raw.getE_machine();
}
@Override
public final String toString() {
- return string;
- }
-
- private final String toStringImpl() {
- final String machineS;
- if( isArm() ) {
- machineS=", arm";
- } else if( isX86_64() ) {
- machineS=", x86_64";
- } else if( isX86_32() ) {
- machineS=", x86_32";
- } else if( isIA64() ) {
- machineS=", itanium";
- } else if( isMips() ) {
- machineS=", mips";
- } else {
- machineS="";
- }
final int enc = getDataEncodingMode();
final String encS;
switch(enc) {
- case 1: encS = "LSB"; break;
- case 2: encS = "MSB"; break;
- default: encS = "NON"; break;
- }
- final int armABI = getArmABI();
- final String armFlagsS;
- if( 0 != armABI ) {
- armFlagsS=", arm[abi "+armABI+", lGCC "+getArmLegacyGCCFlags()+", float "+getArmFloatMode()+"]";
- } else {
- armFlagsS="";
- }
- return "ElfHeader[vers "+getVersion()+", machine["+getMachine()+machineS+"], bits "+getArchClassBits()+", enc "+encS+
- ", abi[os "+getOSABI()+", vers "+getOSABIVersion()+"], flags["+toHexString(getFlags())+armFlagsS+"], type "+getType()+", sh-num "+sht.length+"]";
- }
-
- final SectionHeader[] readSectionHeaderTable(final RandomAccessFile in) throws IOException, IllegalArgumentException {
- // positioning
- {
- final long off = d.getE_shoff(); // absolute offset
- if( 0 == off ) {
- return new SectionHeader[0];
- }
- seek(in, off);
+ case ELFDATA2LSB: encS = "LSB"; break;
+ case ELFDATA2MSB: encS = "MSB"; break;
+ default: encS = "NON"; break; /* ELFDATANONE */
}
- final SectionHeader[] sht;
- final int strndx = d.getE_shstrndx();
- final int size = d.getE_shentsize();
- final int num;
- int i;
- if( 0 == d.getE_shnum() ) {
- // Read 1st table 1st and use it's sh_size
- final byte[] buf0 = new byte[size];
- readBytes(in, buf0, 0, size);
- final SectionHeader sh0 = new SectionHeader(buf0, 0, size, 0);
- num = (int) sh0.d.getSh_size();
- if( 0 >= num ) {
- throw new IllegalArgumentException("EHdr sh_num == 0 and 1st SHdr size == 0");
- }
- sht = new SectionHeader[num];
- sht[0] = sh0;
- i=1;
- } else {
- num = d.getE_shnum();
- sht = new SectionHeader[num];
- i=0;
+ final int type = getType();
+ final String typeS;
+ switch(type) {
+ case ET_REL: typeS = "reloc"; break;
+ case ET_EXEC: typeS = "exec"; break;
+ case ET_DYN: typeS = "shared"; break;
+ case ET_CORE: typeS = "core"; break;
+ default: typeS = "none"; break; /* ET_NONE */
}
- for(; i<num; i++) {
- final byte[] buf = new byte[size];
- readBytes(in, buf, 0, size);
- sht[i] = new SectionHeader(buf, 0, size, i);
- }
- if( SectionHeader.SHN_UNDEF != strndx ) {
- // has section name string table
- if( shortToInt(SectionHeader.SHN_LORESERVE) <= strndx ) {
- throw new InternalError("TODO strndx: "+SectionHeader.SHN_LORESERVE+" < "+strndx);
- }
- final SectionHeader strShdr = sht[strndx];
- if( SectionHeader.SHT_STRTAB != strShdr.getType() ) {
- throw new IllegalArgumentException("Ref. string Shdr["+strndx+"] is of type "+strShdr.d.getSh_type());
- }
- final Section strS = strShdr.readSection(in);
- for(i=0; i<num; i++) {
- sht[i].initName(strS, sht[i].d.getSh_name());
- }
- }
-
- return sht;
+ return "ELF-1[vers "+getVersion()+", machine["+getMachine()+", "+cpuType+", "+abiType+", machDesc "+machDesc.toShortString()+"], bits "+getArchClassBits()+", enc "+encS+
+ ", abi[os "+getOSABI()+", vers "+getOSABIVersion()+"], type "+typeS+"]";
}
}
diff --git a/src/java/jogamp/common/os/elf/ElfHeaderPart2.java b/src/java/jogamp/common/os/elf/ElfHeaderPart2.java
new file mode 100644
index 0000000..320b8b4
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/ElfHeaderPart2.java
@@ -0,0 +1,374 @@
+/**
+ * Copyright 2013 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.common.os.elf;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import com.jogamp.common.os.Platform.ABIType;
+import com.jogamp.common.os.Platform.CPUFamily;
+import com.jogamp.common.os.Platform.CPUType;
+
+import static jogamp.common.os.elf.IOUtils.readBytes;
+import static jogamp.common.os.elf.IOUtils.seek;
+import static jogamp.common.os.elf.IOUtils.shortToInt;
+import static jogamp.common.os.elf.IOUtils.toHexString;
+
+/**
+ * ELF ABI Header Part-2
+ * <p>
+ * Part-2 can only be read w/ knowledge of CPUType!
+ * </p>
+ * <p>
+ * References:
+ * <ul>
+ * <li>http://linux.die.net/man/5/elf</li>
+ * <li>http://www.sco.com/developers/gabi/latest/contents.html</li>
+ * <li>http://infocenter.arm.com/
+ * <ul>
+ * <li>ARM IHI 0044E, current through ABI release 2.09</li>
+ * <li>ARM IHI 0056B: Elf for ARM 64-bit Architecture</li>
+ * </ul></li>
+ * </ul>
+ * </p>
+ */
+public class ElfHeaderPart2 {
+ /**
+ * This masks an 8-bit version number, the version of the ABI to which this
+ * ELF file conforms. This ABI is version 5. A value of 0 denotes unknown conformance.
+ * {@value}
+ */
+ public static final int EF_ARM_ABIMASK = 0xFF000000;
+ public static final int EF_ARM_ABISHIFT = 24;
+
+ /**
+ * ARM ABI version 5.
+ * {@value}
+ */
+ public static final int EF_ARM_ABI5 = 0x05000000;
+
+ /**
+ * The ELF file contains BE-8 code, suitable for execution on an ARM
+ * Architecture v6 processor. This flag must only be set on an executable file.
+ * {@value}
+ */
+ public static final int EF_ARM_BE8 = 0x00800000;
+
+ /**
+ * Legacy code (ABI version 4 and earlier) generated by gcc-arm-xxx might
+ * use these bits.
+ * {@value}
+ */
+ public static final int EF_ARM_GCCMASK = 0x00400FFF;
+
+ /**
+ * Set in executable file headers (e_type = ET_EXEC or ET_DYN) to note that
+ * the executable file was built to conform to the hardware floating-point
+ * procedure-call standard.
+ * <p>
+ * Compatible with legacy (pre version 5) gcc use as EF_ARM_VFP_FLOAT.
+ * </p>
+ * <p>
+ * Note: This is not used (anymore)
+ * </p>
+ * {@value}
+ */
+ public static final int EF_ARM_ABI_FLOAT_HARD = 0x00000400;
+
+ /**
+ * Set in executable file headers (e_type = ET_EXEC or ET_DYN) to note
+ * explicitly that the executable file was built to conform to the software
+ * floating-point procedure-call standard (the base standard). If both
+ * {@link #EF_ARM_ABI_FLOAT_HARD} and {@link #EF_ARM_ABI_FLOAT_SOFT} are clear,
+ * conformance to the base procedure-call standard is implied.
+ * <p>
+ * Compatible with legacy (pre version 5) gcc use as EF_ARM_SOFT_FLOAT.
+ * </p>
+ * <p>
+ * Note: This is not used (anymore)
+ * </p>
+ * {@value}
+ */
+ public static final int EF_ARM_ABI_FLOAT_SOFT = 0x00000200;
+
+ /** Public access to the elf header part-1 (CPU/ABI independent read) */
+ public final ElfHeaderPart1 eh1;
+
+ /** Public access to the raw elf header part-2 (CPU/ABI dependent read) */
+ public final Ehdr_p2 raw;
+
+ /** Lower case CPUType name */
+ public final String cpuName;
+ public final CPUType cpuType;
+ public final ABIType abiType;
+
+ /** Public access to the {@link SectionHeader} */
+ public final SectionHeader[] sht;
+
+ /**
+ * Note: The input stream shall stay untouch to be able to read sections!
+ *
+ * @param in input stream of a binary file at position zero
+ * @return
+ * @throws IOException if reading from the given input stream fails or less then ELF Header size bytes
+ * @throws IllegalArgumentException if the given input stream does not represent an ELF Header
+ */
+ public static ElfHeaderPart2 read(final ElfHeaderPart1 eh1, final RandomAccessFile in) throws IOException, IllegalArgumentException {
+ return new ElfHeaderPart2(eh1, in);
+ }
+
+ /**
+ * @param buf ELF Header bytes
+ * @throws IllegalArgumentException if the given buffer does not represent an ELF Header
+ * @throws IOException
+ */
+ ElfHeaderPart2(final ElfHeaderPart1 eh1, final RandomAccessFile in) throws IllegalArgumentException, IOException {
+ this.eh1 = eh1;
+ //
+ // Part-2
+ //
+ {
+ final byte[] buf = new byte[Ehdr_p2.size(eh1.machDesc.ordinal())];
+ readBytes (in, buf, 0, buf.length);
+ final ByteBuffer eh2Bytes = ByteBuffer.wrap(buf, 0, buf.length);
+ raw = Ehdr_p2.create(eh1.machDesc.ordinal(), eh2Bytes);
+ }
+ sht = readSectionHeaderTable(in);
+
+ if( CPUFamily.ARM == eh1.cpuType.family && eh1.cpuType.is32Bit ) {
+ // AArch64, has no SHT_ARM_ATTRIBUTES or SHT_AARCH64_ATTRIBUTES SectionHeader defined in our builds!
+ String armCpuName = null;
+ String armCpuRawName = null;
+ boolean abiVFPArgsAcceptsVFPVariant = false;
+ final SectionHeader sh = getSectionHeader(SectionHeader.SHT_ARM_ATTRIBUTES);
+ if(ElfHeaderPart1.DEBUG) {
+ System.err.println("ELF-2: Got ARM Attribs Section Header: "+sh);
+ }
+ if( null != sh ) {
+ final SectionArmAttributes sArmAttrs = (SectionArmAttributes) sh.readSection(in);
+ if(ElfHeaderPart1.DEBUG) {
+ System.err.println("ELF-2: Got ARM Attribs Section Block : "+sArmAttrs);
+ }
+ final SectionArmAttributes.Attribute cpuNameArgsAttr = sArmAttrs.get(SectionArmAttributes.Tag.CPU_name);
+ if( null != cpuNameArgsAttr && cpuNameArgsAttr.isNTBS() ) {
+ armCpuName = cpuNameArgsAttr.getNTBS();
+ }
+ final SectionArmAttributes.Attribute cpuRawNameArgsAttr = sArmAttrs.get(SectionArmAttributes.Tag.CPU_raw_name);
+ if( null != cpuRawNameArgsAttr && cpuRawNameArgsAttr.isNTBS() ) {
+ armCpuRawName = cpuRawNameArgsAttr.getNTBS();
+ }
+ final SectionArmAttributes.Attribute abiVFPArgsAttr = sArmAttrs.get(SectionArmAttributes.Tag.ABI_VFP_args);
+ if( null != abiVFPArgsAttr ) {
+ abiVFPArgsAcceptsVFPVariant = SectionArmAttributes.abiVFPArgsAcceptsVFPVariant(abiVFPArgsAttr.getULEB128());
+ }
+ }
+ {
+ String _cpuName;
+ if( null != armCpuName && armCpuName.length() > 0 ) {
+ _cpuName = armCpuName.toLowerCase().replace(' ', '-');
+ } else if( null != armCpuRawName && armCpuRawName.length() > 0 ) {
+ _cpuName = armCpuRawName.toLowerCase().replace(' ', '-');
+ } else {
+ _cpuName = eh1.cpuName;
+ }
+
+ // 1st-try: native name
+ CPUType _cpuType = queryCPUTypeSafe(_cpuName);
+ if( null == _cpuType ) {
+ // 2nd-try: "arm-" + native name
+ _cpuName = "arm-"+_cpuName;
+ _cpuType = queryCPUTypeSafe(_cpuName);
+ if( null == _cpuType ) {
+ // finally: Use ELF-1
+ _cpuName = eh1.cpuName;
+ _cpuType = queryCPUTypeSafe(_cpuName);
+ if( null == _cpuType ) {
+ throw new InternalError("XXX: "+_cpuName+", "+eh1); // shall not happen
+ }
+ }
+ }
+ cpuName = _cpuName;
+ cpuType = _cpuType;
+ if(ElfHeaderPart1.DEBUG) {
+ System.err.println("ELF-2: abiARM cpuName "+_cpuName+"[armCpuName "+armCpuName+", armCpuRawName "+armCpuRawName+"] -> "+cpuName+" -> "+cpuType+", abiVFPArgsAcceptsVFPVariant "+abiVFPArgsAcceptsVFPVariant);
+ }
+ }
+ if( cpuType.is32Bit ) { // always true, see above!
+ abiType = abiVFPArgsAcceptsVFPVariant ? ABIType.EABI_GNU_ARMHF : ABIType.EABI_GNU_ARMEL;
+ } else {
+ abiType = eh1.abiType;
+ }
+ } else {
+ cpuName = eh1.cpuName;
+ cpuType = eh1.cpuType;
+ abiType = eh1.abiType;
+ }
+ if(ElfHeaderPart1.DEBUG) {
+ System.err.println("ELF-2: cpuName "+cpuName+" -> "+cpuType+", "+abiType);
+ }
+ }
+ private static CPUType queryCPUTypeSafe(final String cpuName) {
+ CPUType res = null;
+ try {
+ res = CPUType.query(cpuName);
+ } catch (final Throwable t) {
+ if(ElfHeaderPart1.DEBUG) {
+ System.err.println("ELF-2: queryCPUTypeSafe("+cpuName+"): "+t.getMessage());
+ }
+ }
+ return res;
+ }
+
+ public final short getSize() { return raw.getE_ehsize(); }
+
+ /** Returns the processor-specific flags associated with the file. */
+ public final int getFlags() {
+ return raw.getE_flags();
+ }
+
+ /** Returns the ARM EABI version from {@link #getFlags() flags}, maybe 0 if not an ARM EABI. */
+ public byte getArmABI() {
+ return (byte) ( ( ( EF_ARM_ABIMASK & raw.getE_flags() ) >> EF_ARM_ABISHIFT ) & 0xff );
+ }
+
+ /** Returns the ARM EABI legacy GCC {@link #getFlags() flags}, maybe 0 if not an ARM EABI or not having legacy GCC flags. */
+ public int getArmLegacyGCCFlags() {
+ final int f = raw.getE_flags();
+ return 0 != ( EF_ARM_ABIMASK & f ) ? ( EF_ARM_GCCMASK & f ) : 0;
+ }
+
+ /**
+ * Returns the ARM EABI float mode from {@link #getFlags() flags},
+ * i.e. 1 for {@link #EF_ARM_ABI_FLOAT_SOFT}, 2 for {@link #EF_ARM_ABI_FLOAT_HARD}
+ * or 0 for none.
+ * <p>
+ * Note: This is not used (anymore)
+ * </p>
+ */
+ public byte getArmFloatMode() {
+ final int f = raw.getE_flags();
+ if( 0 != ( EF_ARM_ABIMASK & f ) ) {
+ if( ( EF_ARM_ABI_FLOAT_HARD & f ) != 0 ) {
+ return 2;
+ }
+ if( ( EF_ARM_ABI_FLOAT_SOFT & f ) != 0 ) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ /** Returns the 1st occurence of matching SectionHeader {@link SectionHeader#getType() type}, or null if not exists. */
+ public final SectionHeader getSectionHeader(final int type) {
+ for(int i=0; i<sht.length; i++) {
+ final SectionHeader sh = sht[i];
+ if( sh.getType() == type ) {
+ return sh;
+ }
+ }
+ return null;
+ }
+
+ /** Returns the 1st occurence of matching SectionHeader {@link SectionHeader#getName() name}, or null if not exists. */
+ public final SectionHeader getSectionHeader(final String name) {
+ for(int i=0; i<sht.length; i++) {
+ final SectionHeader sh = sht[i];
+ if( sh.getName().equals(name) ) {
+ return sh;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public final String toString() {
+ final int armABI = getArmABI();
+ final String armFlagsS;
+ if( 0 != armABI ) {
+ armFlagsS=", arm[abi "+armABI+", lGCC "+getArmLegacyGCCFlags()+", float "+getArmFloatMode()+"]";
+ } else {
+ armFlagsS="";
+ }
+ return "ELF-2["+cpuType+", "+abiType+", flags["+toHexString(getFlags())+armFlagsS+"], sh-num "+sht.length+"]";
+ }
+
+ final SectionHeader[] readSectionHeaderTable(final RandomAccessFile in) throws IOException, IllegalArgumentException {
+ // positioning
+ {
+ final long off = raw.getE_shoff(); // absolute offset
+ if( 0 == off ) {
+ return new SectionHeader[0];
+ }
+ seek(in, off);
+ }
+ final SectionHeader[] sht;
+ final int strndx = raw.getE_shstrndx();
+ final int size = raw.getE_shentsize();
+ final int num;
+ int i;
+ if( 0 == raw.getE_shnum() ) {
+ // Read 1st table 1st and use it's sh_size
+ final byte[] buf0 = new byte[size];
+ readBytes(in, buf0, 0, size);
+ final SectionHeader sh0 = new SectionHeader(this, buf0, 0, size, 0);
+ num = (int) sh0.raw.getSh_size();
+ if( 0 >= num ) {
+ throw new IllegalArgumentException("EHdr sh_num == 0 and 1st SHdr size == 0");
+ }
+ sht = new SectionHeader[num];
+ sht[0] = sh0;
+ i=1;
+ } else {
+ num = raw.getE_shnum();
+ sht = new SectionHeader[num];
+ i=0;
+ }
+ for(; i<num; i++) {
+ final byte[] buf = new byte[size];
+ readBytes(in, buf, 0, size);
+ sht[i] = new SectionHeader(this, buf, 0, size, i);
+ }
+ if( SectionHeader.SHN_UNDEF != strndx ) {
+ // has section name string table
+ if( shortToInt(SectionHeader.SHN_LORESERVE) <= strndx ) {
+ throw new InternalError("TODO strndx: "+SectionHeader.SHN_LORESERVE+" < "+strndx);
+ }
+ final SectionHeader strShdr = sht[strndx];
+ if( SectionHeader.SHT_STRTAB != strShdr.getType() ) {
+ throw new IllegalArgumentException("Ref. string Shdr["+strndx+"] is of type "+strShdr.raw.getSh_type());
+ }
+ final Section strS = strShdr.readSection(in);
+ for(i=0; i<num; i++) {
+ sht[i].initName(strS, sht[i].raw.getSh_name());
+ }
+ }
+
+ return sht;
+ }
+}
diff --git a/src/java/jogamp/common/os/elf/IOUtils.java b/src/java/jogamp/common/os/elf/IOUtils.java
index 62b47db..454a325 100644
--- a/src/java/jogamp/common/os/elf/IOUtils.java
+++ b/src/java/jogamp/common/os/elf/IOUtils.java
@@ -30,7 +30,6 @@ package jogamp.common.os.elf;
import java.io.IOException;
import java.io.RandomAccessFile;
-import com.jogamp.common.os.Platform;
import com.jogamp.common.util.Bitstream;
class IOUtils {
@@ -61,17 +60,12 @@ class IOUtils {
in.seek(newPos);
}
- static int readUInt32(final byte[] in, final int offset) {
- final int v = Bitstream.uint32LongToInt(Bitstream.readUInt32(!Platform.isLittleEndian(), in, offset));
+ static int readUInt32(final boolean isBigEndian, final byte[] in, final int offset) {
+ final int v = Bitstream.uint32LongToInt(Bitstream.readUInt32(isBigEndian, in, offset));
if( 0 > v ) {
throw new IllegalArgumentException("Read uint32 value "+toHexString(v)+" > int32-max "+toHexString(MAX_INT_VALUE));
}
return v;
- /** Need to fix endian for below path ..
- checkBounds(in, offset, 4);
- final byte[] uint = new byte[] { 0, 0, 0, 0, in[offset+0], in[offset+1], in[offset+2], in[offset+3] };
- final ByteBuffer b = ByteBuffer.wrap(uint, 0, 8).order(ByteOrder.nativeOrder());
- return b.asLongBuffer().get(0); */
}
/**
diff --git a/src/java/jogamp/common/os/elf/SectionArmAttributes.java b/src/java/jogamp/common/os/elf/SectionArmAttributes.java
index 91e8c31..e6d9257 100644
--- a/src/java/jogamp/common/os/elf/SectionArmAttributes.java
+++ b/src/java/jogamp/common/os/elf/SectionArmAttributes.java
@@ -1,3 +1,30 @@
+/**
+ * Copyright 2013 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
package jogamp.common.os.elf;
import static jogamp.common.os.elf.IOUtils.toHexString;
@@ -172,7 +199,7 @@ public class SectionArmAttributes extends Section {
SectionArmAttributes(final SectionHeader sh, final byte[] data, final int offset, final int length) throws IndexOutOfBoundsException, IllegalArgumentException {
super(sh, data, offset, length);
- this.vendorAttributesList = parse(data, offset, length);
+ this.vendorAttributesList = parse(sh, data, offset, length);
}
@Override
@@ -208,6 +235,7 @@ public class SectionArmAttributes extends Section {
}
/**
+ * @param sh TODO
* @param in byte source buffer to parse
* @param offset offset within byte source buffer to start parsing
* @param remaining remaining numbers of bytes to parse beginning w/ <code>sb_off</code>,
@@ -215,7 +243,7 @@ public class SectionArmAttributes extends Section {
* @throws IndexOutOfBoundsException if <code>offset + remaining > sb.length</code>.
* @throws IllegalArgumentException if section parsing failed, i.e. incompatible version or data.
*/
- static List<VendorAttributes> parse(final byte[] in, final int offset, final int remaining) throws IndexOutOfBoundsException, IllegalArgumentException {
+ static List<VendorAttributes> parse(final SectionHeader sh, final byte[] in, final int offset, final int remaining) throws IndexOutOfBoundsException, IllegalArgumentException {
Bitstream.checkBounds(in, offset, remaining);
int i = offset;
if( FORMAT_VERSION_A != in[ i ] ) {
@@ -224,10 +252,11 @@ public class SectionArmAttributes extends Section {
i++;
final List<VendorAttributes> vendorAttributesList = new ArrayList<VendorAttributes>();
+ final boolean isBigEndian = sh.eh2.eh1.isBigEndian();
while(i < remaining) {
final int i_pre = i;
- final int secLen = readUInt32(in, i); /* total section size: 4 + string + content, i.e. offset to next section */
+ final int secLen = readUInt32(isBigEndian, in, i); /* total section size: 4 + string + content, i.e. offset to next section */
i+=4;
final String vendor;
@@ -241,7 +270,7 @@ public class SectionArmAttributes extends Section {
while(i < secLen) {
final int[] i_post = new int[] { 0 };
- parseSub(in, i, secLen - i, i_post, attributes);
+ parseSub(isBigEndian, in, i, secLen - i, i_post, attributes);
i = i_post[0];
}
@@ -261,6 +290,7 @@ public class SectionArmAttributes extends Section {
}
/**
+ * @param isBigEndian TODO
* @param in byte source buffer to parse
* @param offset offset within byte source buffer to start parsing
* @param remaining remaining numbers of bytes to parse beginning w/ <code>sb_off</code>,
@@ -268,7 +298,10 @@ public class SectionArmAttributes extends Section {
* @throws IndexOutOfBoundsException if <code>offset + remaining > sb.length</code>.
* @throws IllegalArgumentException if section parsing failed, i.e. incompatible version or data.
*/
- static void parseSub(final byte[] in, final int offset, final int remaining, final int[] offset_post, final List<Attribute> attributes) throws IndexOutOfBoundsException, IllegalArgumentException {
+ private static void parseSub(final boolean isBigEndian, final byte[] in, final int offset, final int remaining,
+ final int[] offset_post, final List<Attribute> attributes)
+ throws IndexOutOfBoundsException, IllegalArgumentException
+ {
Bitstream.checkBounds(in, offset, remaining);
// Starts w/ sub-section Tag
@@ -283,7 +316,7 @@ public class SectionArmAttributes extends Section {
case File:
case Section:
case Symbol:
- subSecLen = readUInt32(in, i);
+ subSecLen = readUInt32(isBigEndian, in, i);
i+=4;
break;
default:
diff --git a/src/java/jogamp/common/os/elf/SectionHeader.java b/src/java/jogamp/common/os/elf/SectionHeader.java
index 20a40a5..533c04b 100644
--- a/src/java/jogamp/common/os/elf/SectionHeader.java
+++ b/src/java/jogamp/common/os/elf/SectionHeader.java
@@ -133,6 +133,12 @@ public class SectionHeader {
* {@value}
*/
public static final int SHT_ARM_ATTRIBUTES = 0x70000003;
+
+ /**
+ * {@value}. FIXME: Same as {@link #SHT_ARM_ATTRIBUTES}, ok?
+ */
+ public static final int SHT_AARCH64_ATTRIBUTES = 0x70000003;
+
/**
* {@value}
*/
@@ -171,24 +177,28 @@ public class SectionHeader {
*/
public static final short SHN_HIRESERVE = (short)0xffff;
+ /** Public access to the elf header */
+ public final ElfHeaderPart2 eh2;
+
/** Public access to the raw elf section header */
- public final Shdr d;
+ public final Shdr raw;
private final int idx;
private String name;
- SectionHeader(final byte[] buf, final int offset, final int length, final int sectionIdx) {
- this( ByteBuffer.wrap(buf, 0, buf.length), sectionIdx );
+ SectionHeader(final ElfHeaderPart2 eh, final byte[] buf, final int offset, final int length, final int sectionIdx) {
+ this( eh, ByteBuffer.wrap(buf, 0, buf.length), sectionIdx );
}
- SectionHeader(final java.nio.ByteBuffer buf, final int idx) {
- d = Shdr.create(buf);
+ SectionHeader(final ElfHeaderPart2 eh, final java.nio.ByteBuffer buf, final int idx) {
+ this.eh2 = eh;
+ this.raw = Shdr.create(eh.eh1.machDesc.ordinal(), buf);
this.idx = idx;
- name = null;
+ this.name = null;
}
@Override
public String toString() {
- return "SectionHeader[idx "+idx+", name "+name+", type "+toHexString(getType())+", link "+d.getSh_link()+", info "+toHexString(d.getSh_info())+", flags "+toHexString(getFlags())+"]";
+ return "SectionHeader[idx "+idx+", name "+name+", type "+toHexString(getType())+", link "+raw.getSh_link()+", info "+toHexString(raw.getSh_info())+", flags "+toHexString(getFlags())+"]";
}
/**
@@ -206,17 +216,17 @@ public class SectionHeader {
/** Returns the type of this section. */
public int getType() {
- return d.getSh_type();
+ return raw.getSh_type();
}
/** Returns the flags of this section. */
public long getFlags() {
- return d.getSh_flags();
+ return raw.getSh_flags();
}
/** Returns the size of this section. */
public long getSize() {
- return d.getSh_size();
+ return raw.getSh_size();
}
/** Returns this section name, maybe <code>null</code> if not read. */
@@ -232,9 +242,9 @@ public class SectionHeader {
* @throws IllegalArgumentException if section offset or size mismatch including size &gt; {@link Integer#MAX_VALUE}
*/
public Section readSection(final RandomAccessFile in) throws IOException, IllegalArgumentException {
- final int s_size = long2Int(d.getSh_size());
+ final int s_size = long2Int(raw.getSh_size());
if( 0 == s_size || 0 > s_size ) {
- throw new IllegalArgumentException("Shdr["+idx+"] has invalid int size: "+d.getSh_size()+" -> "+s_size);
+ throw new IllegalArgumentException("Shdr["+idx+"] has invalid int size: "+raw.getSh_size()+" -> "+s_size);
}
final byte[] s_buf = new byte[s_size];
return readSectionImpl(in, s_buf, 0, s_size);
@@ -252,9 +262,9 @@ public class SectionHeader {
* @throws IllegalArgumentException if requested read length is &gt; section size
*/
public Section readSection(final RandomAccessFile in, final byte[] b, final int b_off, final int r_len) throws IOException, IllegalArgumentException {
- final int s_size = long2Int(d.getSh_size());
+ final int s_size = long2Int(raw.getSh_size());
if( 0 == s_size || 0 > s_size ) {
- throw new IllegalArgumentException("Shdr["+idx+"] has invalid int size: "+d.getSh_size()+" -> "+s_size);
+ throw new IllegalArgumentException("Shdr["+idx+"] has invalid int size: "+raw.getSh_size()+" -> "+s_size);
}
if( r_len > s_size ) {
throw new IllegalArgumentException("Shdr["+idx+"] has only "+s_size+" bytes, while read request is of "+r_len+" bytes");
@@ -263,7 +273,7 @@ public class SectionHeader {
}
Section readSectionImpl(final RandomAccessFile in, final byte[] b, final int b_off, final int r_len) throws IOException, IllegalArgumentException {
- final long s_off = d.getSh_offset();
+ final long s_off = raw.getSh_offset();
seek(in, s_off);
readBytes(in, b, b_off, r_len);
if( SectionHeader.SHT_ARM_ATTRIBUTES == getType() ) {
diff --git a/src/java/jogamp/common/os/elf/Shdr.java b/src/java/jogamp/common/os/elf/Shdr.java
index e5fe147..0b75fd6 100644
--- a/src/java/jogamp/common/os/elf/Shdr.java
+++ b/src/java/jogamp/common/os/elf/Shdr.java
@@ -1,4 +1,4 @@
-/* !---- DO NOT EDIT: This file autogenerated by com/jogamp/gluegen/JavaEmitter.java on Fri Jan 30 06:44:16 CET 2015 ----! */
+/* !---- DO NOT EDIT: This file autogenerated by com/jogamp/gluegen/JavaEmitter.java on Sun Feb 01 03:27:25 CET 2015 ----! */
package jogamp.common.os.elf;
@@ -15,45 +15,30 @@ public class Shdr {
StructAccessor accessor;
- private static final int mdIdx = MachineDescriptionRuntime.getStatic().ordinal();
-
- private static final int[] Shdr_size = new int[] { 40 /* ARMle_EABI */, 40 /* X86_32_UNIX */, 64 /* X86_64_UNIX */, 40 /* X86_32_MACOS */, 40 /* X86_32_WINDOWS */, 64 /* X86_64_WINDOWS */, 40 /* SPARC_32_SUNOS */ };
- private static final int[] sh_name_offset = new int[] { 0 /* ARMle_EABI */, 0 /* X86_32_UNIX */, 0 /* X86_64_UNIX */, 0 /* X86_32_MACOS */, 0 /* X86_32_WINDOWS */, 0 /* X86_64_WINDOWS */, 0 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_name_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_type_offset = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_type_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_flags_offset = new int[] { 8 /* ARMle_EABI */, 8 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 8 /* X86_32_MACOS */, 8 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 8 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_flags_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_addr_offset = new int[] { 12 /* ARMle_EABI */, 12 /* X86_32_UNIX */, 16 /* X86_64_UNIX */, 12 /* X86_32_MACOS */, 12 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 12 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_addr_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_offset_offset = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 24 /* X86_64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 24 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_offset_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_size_offset = new int[] { 20 /* ARMle_EABI */, 20 /* X86_32_UNIX */, 32 /* X86_64_UNIX */, 20 /* X86_32_MACOS */, 20 /* X86_32_WINDOWS */, 32 /* X86_64_WINDOWS */, 20 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_size_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_link_offset = new int[] { 24 /* ARMle_EABI */, 24 /* X86_32_UNIX */, 40 /* X86_64_UNIX */, 24 /* X86_32_MACOS */, 24 /* X86_32_WINDOWS */, 40 /* X86_64_WINDOWS */, 24 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_link_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_info_offset = new int[] { 28 /* ARMle_EABI */, 28 /* X86_32_UNIX */, 44 /* X86_64_UNIX */, 28 /* X86_32_MACOS */, 28 /* X86_32_WINDOWS */, 44 /* X86_64_WINDOWS */, 28 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_info_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_addralign_offset = new int[] { 32 /* ARMle_EABI */, 32 /* X86_32_UNIX */, 48 /* X86_64_UNIX */, 32 /* X86_32_MACOS */, 32 /* X86_32_WINDOWS */, 48 /* X86_64_WINDOWS */, 32 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_addralign_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
- private static final int[] sh_entsize_offset = new int[] { 36 /* ARMle_EABI */, 36 /* X86_32_UNIX */, 56 /* X86_64_UNIX */, 36 /* X86_32_MACOS */, 36 /* X86_32_WINDOWS */, 56 /* X86_64_WINDOWS */, 36 /* SPARC_32_SUNOS */ };
-//private static final int[] sh_entsize_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* X86_64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
-
- public static int size() {
- return Shdr_size[mdIdx];
- }
-
- public static Shdr create() {
- return create(Buffers.newDirectByteBuffer(size()));
- }
-
- public static Shdr create(java.nio.ByteBuffer buf) {
- return new Shdr(buf);
- }
-
- Shdr(java.nio.ByteBuffer buf) {
- accessor = new StructAccessor(buf);
- }
+ private final int mdIdx;
+ private final MachineDescription md;
+
+ private static final int[] Shdr_size = new int[] { 40 /* ARMle_EABI */, 40 /* X86_32_UNIX */, 64 /* LP64_UNIX */, 40 /* X86_32_MACOS */, 40 /* X86_32_WINDOWS */, 64 /* X86_64_WINDOWS */, 40 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_name_offset = new int[] { 0 /* ARMle_EABI */, 0 /* X86_32_UNIX */, 0 /* LP64_UNIX */, 0 /* X86_32_MACOS */, 0 /* X86_32_WINDOWS */, 0 /* X86_64_WINDOWS */, 0 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_name_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_type_offset = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_type_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_flags_offset = new int[] { 8 /* ARMle_EABI */, 8 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 8 /* X86_32_MACOS */, 8 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 8 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_flags_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_addr_offset = new int[] { 12 /* ARMle_EABI */, 12 /* X86_32_UNIX */, 16 /* LP64_UNIX */, 12 /* X86_32_MACOS */, 12 /* X86_32_WINDOWS */, 16 /* X86_64_WINDOWS */, 12 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_addr_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_offset_offset = new int[] { 16 /* ARMle_EABI */, 16 /* X86_32_UNIX */, 24 /* LP64_UNIX */, 16 /* X86_32_MACOS */, 16 /* X86_32_WINDOWS */, 24 /* X86_64_WINDOWS */, 16 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_offset_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_size_offset = new int[] { 20 /* ARMle_EABI */, 20 /* X86_32_UNIX */, 32 /* LP64_UNIX */, 20 /* X86_32_MACOS */, 20 /* X86_32_WINDOWS */, 32 /* X86_64_WINDOWS */, 20 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_size_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_link_offset = new int[] { 24 /* ARMle_EABI */, 24 /* X86_32_UNIX */, 40 /* LP64_UNIX */, 24 /* X86_32_MACOS */, 24 /* X86_32_WINDOWS */, 40 /* X86_64_WINDOWS */, 24 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_link_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_info_offset = new int[] { 28 /* ARMle_EABI */, 28 /* X86_32_UNIX */, 44 /* LP64_UNIX */, 28 /* X86_32_MACOS */, 28 /* X86_32_WINDOWS */, 44 /* X86_64_WINDOWS */, 28 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_info_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 4 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 4 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_addralign_offset = new int[] { 32 /* ARMle_EABI */, 32 /* X86_32_UNIX */, 48 /* LP64_UNIX */, 32 /* X86_32_MACOS */, 32 /* X86_32_WINDOWS */, 48 /* X86_64_WINDOWS */, 32 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_addralign_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
+ private static final int[] sh_entsize_offset = new int[] { 36 /* ARMle_EABI */, 36 /* X86_32_UNIX */, 56 /* LP64_UNIX */, 36 /* X86_32_MACOS */, 36 /* X86_32_WINDOWS */, 56 /* X86_64_WINDOWS */, 36 /* SPARC_32_SUNOS */ };
+//private static final int[] sh_entsize_size = new int[] { 4 /* ARMle_EABI */, 4 /* X86_32_UNIX */, 8 /* LP64_UNIX */, 4 /* X86_32_MACOS */, 4 /* X86_32_WINDOWS */, 8 /* X86_64_WINDOWS */, 4 /* SPARC_32_SUNOS */ };
public java.nio.ByteBuffer getBuffer() {
return accessor.getBuffer();
@@ -83,46 +68,46 @@ public class Shdr {
/** Setter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public Shdr setSh_flags(long val) {
- accessor.setLongAt(sh_flags_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ accessor.setLongAt(sh_flags_offset[mdIdx], val, md.longSizeInBytes());
return this;
}
/** Getter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public long getSh_flags() {
- return accessor.getLongAt(sh_flags_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return accessor.getLongAt(sh_flags_offset[mdIdx], md.longSizeInBytes());
}
/** Setter for native field: CType['ElfN_Addr' (typedef), size [fixed false, lnx64 8], [int]] */
public Shdr setSh_addr(long val) {
- accessor.setLongAt(sh_addr_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ accessor.setLongAt(sh_addr_offset[mdIdx], val, md.longSizeInBytes());
return this;
}
/** Getter for native field: CType['ElfN_Addr' (typedef), size [fixed false, lnx64 8], [int]] */
public long getSh_addr() {
- return accessor.getLongAt(sh_addr_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return accessor.getLongAt(sh_addr_offset[mdIdx], md.longSizeInBytes());
}
/** Setter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
public Shdr setSh_offset(long val) {
- accessor.setLongAt(sh_offset_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ accessor.setLongAt(sh_offset_offset[mdIdx], val, md.longSizeInBytes());
return this;
}
/** Getter for native field: CType['ElfN_Off' (typedef), size [fixed false, lnx64 8], [int]] */
public long getSh_offset() {
- return accessor.getLongAt(sh_offset_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return accessor.getLongAt(sh_offset_offset[mdIdx], md.longSizeInBytes());
}
/** Setter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public Shdr setSh_size(long val) {
- accessor.setLongAt(sh_size_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ accessor.setLongAt(sh_size_offset[mdIdx], val, md.longSizeInBytes());
return this;
}
/** Getter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public long getSh_size() {
- return accessor.getLongAt(sh_size_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return accessor.getLongAt(sh_size_offset[mdIdx], md.longSizeInBytes());
}
/** Setter for native field: CType['uint32_t', size [fixed true, lnx64 4], [int]] */
@@ -149,23 +134,43 @@ public class Shdr {
/** Setter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public Shdr setSh_addralign(long val) {
- accessor.setLongAt(sh_addralign_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ accessor.setLongAt(sh_addralign_offset[mdIdx], val, md.longSizeInBytes());
return this;
}
/** Getter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public long getSh_addralign() {
- return accessor.getLongAt(sh_addralign_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return accessor.getLongAt(sh_addralign_offset[mdIdx], md.longSizeInBytes());
}
/** Setter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public Shdr setSh_entsize(long val) {
- accessor.setLongAt(sh_entsize_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ accessor.setLongAt(sh_entsize_offset[mdIdx], val, md.longSizeInBytes());
return this;
}
/** Getter for native field: CType['ElfN_size' (typedef), size [fixed false, lnx64 8], [int]] */
public long getSh_entsize() {
- return accessor.getLongAt(sh_entsize_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return accessor.getLongAt(sh_entsize_offset[mdIdx], md.longSizeInBytes());
+ }
+
+ // --- Begin CustomJavaCode .cfg declarations
+ public static int size(final int mdIdx) {
+ return Shdr_size[mdIdx];
+ }
+
+ public static Shdr create(final int mdIdx) {
+ return create(mdIdx, Buffers.newDirectByteBuffer(size(mdIdx)));
+ }
+
+ public static Shdr create(final int mdIdx, final java.nio.ByteBuffer buf) {
+ return new Shdr(mdIdx, buf);
+ }
+
+ Shdr(final int mdIdx, final java.nio.ByteBuffer buf) {
+ this.mdIdx = mdIdx;
+ this.md = MachineDescription.StaticConfig.values()[mdIdx].md;
+ this.accessor = new StructAccessor(buf);
}
+ // ---- End CustomJavaCode .cfg declarations
}