From a3f2d08801c5a54048faca52f422bcededf81b2a Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sun, 1 Feb 2015 05:21:39 +0100 Subject: 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. --- .../common/os/MachineDescriptionRuntime.java | 33 +- src/java/jogamp/common/os/PlatformPropsImpl.java | 405 ++++++------- src/java/jogamp/common/os/elf/Ehdr.java | 246 -------- src/java/jogamp/common/os/elf/Ehdr_p1.java | 118 ++++ src/java/jogamp/common/os/elf/Ehdr_p2.java | 176 ++++++ src/java/jogamp/common/os/elf/ElfHeader.java | 654 --------------------- src/java/jogamp/common/os/elf/ElfHeaderPart1.java | 500 ++++++++++++++++ src/java/jogamp/common/os/elf/ElfHeaderPart2.java | 374 ++++++++++++ src/java/jogamp/common/os/elf/IOUtils.java | 10 +- .../jogamp/common/os/elf/SectionArmAttributes.java | 45 +- src/java/jogamp/common/os/elf/SectionHeader.java | 40 +- src/java/jogamp/common/os/elf/Shdr.java | 109 ++-- 12 files changed, 1506 insertions(+), 1204 deletions(-) delete mode 100644 src/java/jogamp/common/os/elf/Ehdr.java create mode 100644 src/java/jogamp/common/os/elf/Ehdr_p1.java create mode 100644 src/java/jogamp/common/os/elf/Ehdr_p2.java delete mode 100644 src/java/jogamp/common/os/elf/ElfHeader.java create mode 100644 src/java/jogamp/common/os/elf/ElfHeaderPart1.java create mode 100644 src/java/jogamp/common/os/elf/ElfHeaderPart2.java (limited to 'src/java/jogamp/common/os') 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}. Note: We claim Android is compatible. */ + /** + * True only if being compatible w/ language level 6, e.g. JRE 1.6. + *

+ * Implies {@link #isJavaSE()}. + *

+ *

+ * Note: We claim Android is compatible. + *

+ */ 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() { + @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)}. *

*/ - private static final ElfHeader queryABITypeImpl(final OSType osType, final CPUType[] cpuType, final ABIType[] abiType) { - return AccessController.doPrivileged(new PrivilegedAction() { - @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 16 */ - 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 16 */ - 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 16 */ - 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 16 */ - 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 16 */ + 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 16 */ + 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 16 */ + 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 16 */ + 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/ElfHeader.java deleted file mode 100644 index 60b6d50..0000000 --- a/src/java/jogamp/common/os/elf/ElfHeader.java +++ /dev/null @@ -1,654 +0,0 @@ -/** - * 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 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 - *

- * References: - *

    - *
  • http://linux.die.net/man/5/elf
  • - *
  • http://www.sco.com/developers/gabi/latest/contents.html
  • - *
  • http://infocenter.arm.com/ - *
      - *
    • ARM IHI 0044E, current through ABI release 2.09
    • - *
  • - *
- *

- */ -public class ElfHeader { - /** Size of e_ident array - {@value} */ - public static int EI_NIDENT = 16; - - /** ident byte #0 - {@value} */ - public static final byte ELFMAG0 = 0x7f; - /** ident byte #1 - {@value} */ - public static final byte ELFMAG1 = 'E'; - /** ident byte #2 - {@value} */ - public static final byte ELFMAG2 = 'L'; - /** ident byte #3 - {@value} */ - public static final byte ELFMAG3 = 'F'; - - /** ident byte #4 */ - public static final int EI_CLASS = 4; - public static final byte ELFCLASSNONE = 0; - public static final byte ELFCLASS32 = 1; - public static final byte ELFCLASS64 = 2; - - /** ident byte #5 */ - public static final int EI_DATA = 5; - public static final byte ELFDATANONE = 0; - public static final byte ELFDATA2LSB = 1; - public static final byte ELFDATA2MSB = 2; - - /** ident byte #6 */ - public static final int EI_VERSION = 6; - public static final byte EV_NONE = 0; - public static final byte EV_CURRENT = 1; - - /** ident byte #7 */ - public static final int EI_OSABI = 7; - /** Unix System V ABI - {@value} */ - public static final byte ELFOSABI_SYSV = 0; - public static final byte ELFOSABI_NONE = ELFOSABI_SYSV; - /** HP-UX ABI - {@value} */ - public static final byte ELFOSABI_HPUX = 1; - /** NetBSD ABI - {@value} **/ - public static final byte ELFOSABI_NETBSD = 2; - /** Linux ABI - {@value} **/ - public static final byte ELFOSABI_LINUX = 3; - /** Solaris ABI - {@value} **/ - public static final byte ELFOSABI_SOLARIS = 6; - /** IRIX ABI - {@value} **/ - public static final byte ELFOSABI_IRIX = 7; - /** FreeBSD ABI - {@value} **/ - public static final byte ELFOSABI_FREEBSD = 8; - /** ARM architecture ABI - {@value} **/ - public static final byte ELFOSABI_ARM = 8; // FIXME - /** Stand-alone (embedded) ABI - {@value} **/ - public static final byte ELFOSABI_STANDALONE = 9; // FIXME - /** TRU64 UNIX ABI - {@value} **/ - public static final byte ELFOSABI_TRU64 = 10; - /** Novell Modesto ABI - {@value} **/ - public static final byte ELFOSABI_MODESTO = 11; - /** Open BSD ABI - {@value} **/ - public static final byte ELFOSABI_OPENBSD = 12; - /** Open VMS ABI - {@value} **/ - public static final byte ELFOSABI_OPENVMS = 13; - /** Hewlett-Packard Non-Stop Kernel ABI - {@value} **/ - public static final byte ELFOSABI_NSK = 14; - /** Amiga Research OS ABI - {@value} **/ - public static final byte ELFOSABI_AROS = 15; - /** The FenixOS highly scalable multi-core OS 64-255 Architecture-specific value range - {@value} */ - public static final byte ELFOSABI_FENIXOS = 16; - - /** ident byte #8 - *

- * This byte identifies the version of the ABI to which the object is targeted. - * This field is used to distinguish among incompatible versions of an ABI. - * The interpretation of this version number is dependent on the ABI identified by the EI_OSABI field. - * Applications conforming to this specification use the value 0. - *

- */ - public static final int EI_ABIVERSION = 8; - - /** - * ident byte #9 .. ? - *

- * Start of padding. - * These bytes are reserved and set to zero. - * Programs which read them should ignore them. - * The value for EI_PAD will change in the future if currently unused bytes are given meanings. - *

- */ - 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. - *

- * Compatible with legacy (pre version 5) gcc use as EF_ARM_VFP_FLOAT. - *

- *

- * Note: This is not used (anymore) - *

- * {@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. - *

- * Compatible with legacy (pre version 5) gcc use as EF_ARM_SOFT_FLOAT. - *

- *

- * Note: This is not used (anymore) - *

- * {@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} */ - public static final short ET_REL = 1; - /** An executable file - {@value} */ - public static final short ET_EXEC = 2; - /** A shared object - {@value} */ - public static final short ET_DYN = 3; - /** A core file - {@value} */ - public static final short ET_CORE = 4; - - public static final short EM_NONE = 0; - public static final short EM_M32 = 1; - public static final short EM_SPARC = 2; - public static final short EM_386 = 3; - public static final short EM_68K = 4; - public static final short EM_88K = 5; - public static final short EM_486 = 6; - public static final short EM_860 = 7; - public static final short EM_MIPS = 8; - public static final short EM_S370 = 9; - public static final short EM_MIPS_RS3_LE = 10; - public static final short EM_PARISC = 15; - public static final short EM_res016 = 16; - public static final short EM_VPP550 = 17; - public static final short EM_SPARC32PLUS = 18; - public static final short EM_960 = 19; - public static final short EM_PPC = 20; - public static final short EM_PPC64 = 21; - public static final short EM_S390 = 22; - public static final short EM_SPU = 23; - public static final short EM_V800 = 36; - public static final short EM_FR20 = 37; - public static final short EM_RH32 = 38; - public static final short EM_MCORE = 39; - public static final short EM_RCE = 39; - public static final short EM_ARM = 40; - public static final short EM_OLD_ALPHA = 41; - public static final short EM_SH = 42; - public static final short EM_SPARCV9 = 43; - public static final short EM_TRICORE = 44; - public static final short EM_ARC = 45; - public static final short EM_H8_300 = 46; - public static final short EM_H8_300H = 47; - public static final short EM_H8S = 48; - public static final short EM_H8_500 = 49; - public static final short EM_IA_64 = 50; - public static final short EM_MIPS_X = 51; - public static final short EM_COLDFIRE = 52; - public static final short EM_68HC12 = 53; - public static final short EM_MMA = 54; - public static final short EM_PCP = 55; - public static final short EM_NCPU = 56; - public static final short EM_NDR1 = 57; - public static final short EM_STARCORE = 58; - public static final short EM_ME16 = 59; - public static final short EM_ST100 = 60; - public static final short EM_TINYJ = 61; - public static final short EM_X86_64 = 62; - public static final short EM_PDSP = 63; - public static final short EM_PDP10 = 64; - public static final short EM_PDP11 = 65; - public static final short EM_FX66 = 66; - public static final short EM_ST9PLUS = 67; - public static final short EM_ST7 = 68; - public static final short EM_68HC16 = 69; - public static final short EM_68HC11 = 70; - public static final short EM_68HC08 = 71; - public static final short EM_68HC05 = 72; - public static final short EM_SVX = 73; - public static final short EM_ST19 = 74; - public static final short EM_VAX = 75; - public static final short EM_CRIS = 76; - public static final short EM_JAVELIN = 77; - public static final short EM_FIREPATH = 78; - public static final short EM_ZSP = 79; - public static final short EM_MMIX = 80; - public static final short EM_HUANY = 81; - public static final short EM_PRISM = 82; - public static final short EM_AVR = 83; - public static final short EM_FR30 = 84; - public static final short EM_D10V = 85; - public static final short EM_D30V = 86; - public static final short EM_V850 = 87; - public static final short EM_M32R = 88; - public static final short EM_MN10300 = 89; - public static final short EM_MN10200 = 90; - public static final short EM_PJ = 91; - public static final short EM_OPENRISC = 92; - public static final short EM_ARC_A5 = 93; - public static final short EM_XTENSA = 94; - public static final short EM_VIDEOCORE = 95; - public static final short EM_TMM_GPP = 96; - public static final short EM_NS32K = 97; - public static final short EM_TPC = 98; - public static final short EM_SNP1K = 99; - public static final short EM_ST200 = 100; - public static final short EM_IP2K = 101; - public static final short EM_MAX = 102; - public static final short EM_CR = 103; - public static final short EM_F2MC16 = 104; - public static final short EM_MSP430 = 105; - public static final short EM_BLACKFIN = 106; - public static final short EM_SE_C33 = 107; - public static final short EM_SEP = 108; - public static final short EM_ARCA = 109; - public static final short EM_UNICORE = 110; - public static final short EM_EXCESS = 111; - public static final short EM_DXP = 112; - public static final short EM_ALTERA_NIOS2 = 113; - public static final short EM_CRX = 114; - public static final short EM_XGATE = 115; - public static final short EM_C166 = 116; - public static final short EM_M16C = 117; - public static final short EM_DSPIC30F = 118; - public static final short EM_CE = 119; - public static final short EM_M32C = 120; - public static final short EM_TSK3000 = 131; - public static final short EM_RS08 = 132; - public static final short EM_res133 = 133; - public static final short EM_ECOG2 = 134; - public static final short EM_SCORE = 135; - public static final short EM_SCORE7 = 135; - public static final short EM_DSP24 = 136; - public static final short EM_VIDEOCORE3 = 137; - public static final short EM_LATTICEMICO32 = 138; - public static final short EM_SE_C17 = 139; - public static final short EM_TI_C6000 = 140; - public static final short EM_TI_C2000 = 141; - public static final short EM_TI_C5500 = 142; - public static final short EM_MMDSP_PLUS = 160; - public static final short EM_CYPRESS_M8C = 161; - public static final short EM_R32C = 162; - public static final short EM_TRIMEDIA = 163; - public static final short EM_QDSP6 = 164; - public static final short EM_8051 = 165; - public static final short EM_STXP7X = 166; - public static final short EM_NDS32 = 167; - public static final short EM_ECOG1 = 168; - public static final short EM_ECOG1X = 168; - public static final short EM_MAXQ30 = 169; - public static final short EM_XIMO16 = 170; - public static final short EM_MANIK = 171; - public static final short EM_CRAYNV2 = 172; - public static final short EM_RX = 173; - public static final short EM_METAG = 174; - public static final short EM_MCST_ELBRUS = 175; - public static final short EM_ECOG16 = 176; - public static final short EM_CR16 = 177; - public static final short EM_ETPU = 178; - public static final short EM_SLE9X = 179; - public static final short EM_L1OM = 180; - public static final short EM_INTEL181 = 181; - public static final short EM_INTEL182 = 182; - public static final short EM_AARCH64 = 183; - public static final short EM_ARM184 = 184; - public static final short EM_AVR32 = 185; - public static final short EM_STM8 = 186; - public static final short EM_TILE64 = 187; - public static final short EM_TILEPRO = 188; - public static final short EM_MICROBLAZE = 189; - public static final short EM_CUDA = 190; - - public static final boolean isIdentityValid(final byte[] ident) { - return ELFMAG0 == ident[0] && - ELFMAG1 == ident[1] && - ELFMAG2 == ident[2] && - ELFMAG3 == ident[3] ; - } - - /** Public access to the raw elf header */ - public final Ehdr d; - - /** Public access to the {@link SectionHeader} */ - public final SectionHeader[] sht; - - private final String string; - private final byte[] E_ident; - - /** - * 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 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; - } - - /** - * @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()]); - 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(); } - - /** - * Returns the architecture class in bits, - * 32 for {@link #ELFCLASS32}, 64 for {@link #ELFCLASS64} - * and 0 for {@link #ELFCLASSNONE}. - */ - public final int getArchClassBits() { - switch( E_ident[EI_CLASS] ) { - case ELFCLASS32: return 32; - case ELFCLASS64: return 64; - default: return 0; - } - } - - /** - * Returns the processor's data encoding, i.e. - * {@link #ELFDATA2LSB}, {@link #ELFDATA2MSB} or {@link #ELFDATANONE}; - */ - public final byte getDataEncodingMode() { - return E_ident[EI_DATA]; - } - - /** Returns the ELF file version, should be {@link #EV_CURRENT}. */ - public final byte getVersion() { - return E_ident[EI_VERSION]; - } - - /** Returns the operating system and ABI for this file, 3 == Linux. Note: Often not used. */ - public final byte getOSABI() { - return E_ident[EI_OSABI]; - } - - /** Returns the version of the {@link #getOSABI() OSABI} for this file. */ - public final byte getOSABIVersion() { - return E_ident[EI_ABIVERSION]; - } - - /** Returns the object file type, e.g. {@link #ET_EXEC}, .. */ - public final short getType() { - return d.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. - *

- * Note: This is not used (anymore) - *

- */ - 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= 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; - } - for(; i + * Part-1 can be read w/o knowledge of CPUType! + *

+ *

+ * References: + *

    + *
  • http://linux.die.net/man/5/elf
  • + *
  • http://www.sco.com/developers/gabi/latest/contents.html
  • + *
  • http://infocenter.arm.com/ + *
      + *
    • ARM IHI 0044E, current through ABI release 2.09
    • + *
    • ARM IHI 0056B: Elf for ARM 64-bit Architecture
    • + *
  • + *
+ *

+ */ +public class ElfHeaderPart1 { + static final boolean DEBUG = Debug.debug("Platform"); + + /** Size of e_ident array - {@value} */ + public static int EI_NIDENT = 16; + + /** ident byte #0 - {@value} */ + public static final byte ELFMAG0 = 0x7f; + /** ident byte #1 - {@value} */ + public static final byte ELFMAG1 = 'E'; + /** ident byte #2 - {@value} */ + public static final byte ELFMAG2 = 'L'; + /** ident byte #3 - {@value} */ + public static final byte ELFMAG3 = 'F'; + + /** ident byte #4 */ + public static final int EI_CLASS = 4; + public static final byte ELFCLASSNONE = 0; + public static final byte ELFCLASS32 = 1; + public static final byte ELFCLASS64 = 2; + + /** ident byte #5 */ + public static final int EI_DATA = 5; + public static final byte ELFDATANONE = 0; + public static final byte ELFDATA2LSB = 1; + public static final byte ELFDATA2MSB = 2; + + /** ident byte #6 */ + public static final int EI_VERSION = 6; + public static final byte EV_NONE = 0; + public static final byte EV_CURRENT = 1; + + /** ident byte #7 */ + public static final int EI_OSABI = 7; + /** Unix System V ABI - {@value} */ + public static final byte ELFOSABI_SYSV = 0; + public static final byte ELFOSABI_NONE = ELFOSABI_SYSV; + /** HP-UX ABI - {@value} */ + public static final byte ELFOSABI_HPUX = 1; + /** NetBSD ABI - {@value} **/ + public static final byte ELFOSABI_NETBSD = 2; + /** Linux ABI - {@value} **/ + public static final byte ELFOSABI_LINUX = 3; + /** Solaris ABI - {@value} **/ + public static final byte ELFOSABI_SOLARIS = 6; + /** IRIX ABI - {@value} **/ + public static final byte ELFOSABI_IRIX = 7; + /** FreeBSD ABI - {@value} **/ + public static final byte ELFOSABI_FREEBSD = 8; + /** ARM architecture ABI - {@value} **/ + public static final byte ELFOSABI_ARM = 8; // FIXME + /** Stand-alone (embedded) ABI - {@value} **/ + public static final byte ELFOSABI_STANDALONE = 9; // FIXME + /** TRU64 UNIX ABI - {@value} **/ + public static final byte ELFOSABI_TRU64 = 10; + /** Novell Modesto ABI - {@value} **/ + public static final byte ELFOSABI_MODESTO = 11; + /** Open BSD ABI - {@value} **/ + public static final byte ELFOSABI_OPENBSD = 12; + /** Open VMS ABI - {@value} **/ + public static final byte ELFOSABI_OPENVMS = 13; + /** Hewlett-Packard Non-Stop Kernel ABI - {@value} **/ + public static final byte ELFOSABI_NSK = 14; + /** Amiga Research OS ABI - {@value} **/ + public static final byte ELFOSABI_AROS = 15; + /** The FenixOS highly scalable multi-core OS 64-255 Architecture-specific value range - {@value} */ + public static final byte ELFOSABI_FENIXOS = 16; + + /** ident byte #8 + *

+ * This byte identifies the version of the ABI to which the object is targeted. + * This field is used to distinguish among incompatible versions of an ABI. + * The interpretation of this version number is dependent on the ABI identified by the EI_OSABI field. + * Applications conforming to this specification use the value 0. + *

+ */ + public static final int EI_ABIVERSION = 8; + + /** + * ident byte #9 .. ? + *

+ * Start of padding. + * These bytes are reserved and set to zero. + * Programs which read them should ignore them. + * The value for EI_PAD will change in the future if currently unused bytes are given meanings. + *

+ */ + public static final int EI_PAD = 9; + + /** An unknown type - {@value} */ + public static final short ET_NONE = 0; + /** A relocatable file - {@value} */ + public static final short ET_REL = 1; + /** An executable file - {@value} */ + public static final short ET_EXEC = 2; + /** A shared object - {@value} */ + public static final short ET_DYN = 3; + /** A core file - {@value} */ + public static final short ET_CORE = 4; + + public static final short EM_NONE = 0; + public static final short EM_M32 = 1; + public static final short EM_SPARC = 2; + public static final short EM_386 = 3; + public static final short EM_68K = 4; + public static final short EM_88K = 5; + public static final short EM_486 = 6; + public static final short EM_860 = 7; + public static final short EM_MIPS = 8; + public static final short EM_S370 = 9; + public static final short EM_MIPS_RS3_LE = 10; + public static final short EM_PARISC = 15; + public static final short EM_res016 = 16; + public static final short EM_VPP550 = 17; + public static final short EM_SPARC32PLUS = 18; + public static final short EM_960 = 19; + public static final short EM_PPC = 20; + public static final short EM_PPC64 = 21; + public static final short EM_S390 = 22; + public static final short EM_SPU = 23; + public static final short EM_V800 = 36; + public static final short EM_FR20 = 37; + public static final short EM_RH32 = 38; + public static final short EM_MCORE = 39; + public static final short EM_RCE = 39; + public static final short EM_ARM = 40; + public static final short EM_OLD_ALPHA = 41; + public static final short EM_SH = 42; + public static final short EM_SPARCV9 = 43; + public static final short EM_TRICORE = 44; + public static final short EM_ARC = 45; + public static final short EM_H8_300 = 46; + public static final short EM_H8_300H = 47; + public static final short EM_H8S = 48; + public static final short EM_H8_500 = 49; + public static final short EM_IA_64 = 50; + public static final short EM_MIPS_X = 51; + public static final short EM_COLDFIRE = 52; + public static final short EM_68HC12 = 53; + public static final short EM_MMA = 54; + public static final short EM_PCP = 55; + public static final short EM_NCPU = 56; + public static final short EM_NDR1 = 57; + public static final short EM_STARCORE = 58; + public static final short EM_ME16 = 59; + public static final short EM_ST100 = 60; + public static final short EM_TINYJ = 61; + public static final short EM_X86_64 = 62; + public static final short EM_PDSP = 63; + public static final short EM_PDP10 = 64; + public static final short EM_PDP11 = 65; + public static final short EM_FX66 = 66; + public static final short EM_ST9PLUS = 67; + public static final short EM_ST7 = 68; + public static final short EM_68HC16 = 69; + public static final short EM_68HC11 = 70; + public static final short EM_68HC08 = 71; + public static final short EM_68HC05 = 72; + public static final short EM_SVX = 73; + public static final short EM_ST19 = 74; + public static final short EM_VAX = 75; + public static final short EM_CRIS = 76; + public static final short EM_JAVELIN = 77; + public static final short EM_FIREPATH = 78; + public static final short EM_ZSP = 79; + public static final short EM_MMIX = 80; + public static final short EM_HUANY = 81; + public static final short EM_PRISM = 82; + public static final short EM_AVR = 83; + public static final short EM_FR30 = 84; + public static final short EM_D10V = 85; + public static final short EM_D30V = 86; + public static final short EM_V850 = 87; + public static final short EM_M32R = 88; + public static final short EM_MN10300 = 89; + public static final short EM_MN10200 = 90; + public static final short EM_PJ = 91; + public static final short EM_OPENRISC = 92; + public static final short EM_ARC_A5 = 93; + public static final short EM_XTENSA = 94; + public static final short EM_VIDEOCORE = 95; + public static final short EM_TMM_GPP = 96; + public static final short EM_NS32K = 97; + public static final short EM_TPC = 98; + public static final short EM_SNP1K = 99; + public static final short EM_ST200 = 100; + public static final short EM_IP2K = 101; + public static final short EM_MAX = 102; + public static final short EM_CR = 103; + public static final short EM_F2MC16 = 104; + public static final short EM_MSP430 = 105; + public static final short EM_BLACKFIN = 106; + public static final short EM_SE_C33 = 107; + public static final short EM_SEP = 108; + public static final short EM_ARCA = 109; + public static final short EM_UNICORE = 110; + public static final short EM_EXCESS = 111; + public static final short EM_DXP = 112; + public static final short EM_ALTERA_NIOS2 = 113; + public static final short EM_CRX = 114; + public static final short EM_XGATE = 115; + public static final short EM_C166 = 116; + public static final short EM_M16C = 117; + public static final short EM_DSPIC30F = 118; + public static final short EM_CE = 119; + public static final short EM_M32C = 120; + public static final short EM_TSK3000 = 131; + public static final short EM_RS08 = 132; + public static final short EM_res133 = 133; + public static final short EM_ECOG2 = 134; + public static final short EM_SCORE = 135; + public static final short EM_SCORE7 = 135; + public static final short EM_DSP24 = 136; + public static final short EM_VIDEOCORE3 = 137; + public static final short EM_LATTICEMICO32 = 138; + public static final short EM_SE_C17 = 139; + public static final short EM_TI_C6000 = 140; + public static final short EM_TI_C2000 = 141; + public static final short EM_TI_C5500 = 142; + public static final short EM_MMDSP_PLUS = 160; + public static final short EM_CYPRESS_M8C = 161; + public static final short EM_R32C = 162; + public static final short EM_TRIMEDIA = 163; + public static final short EM_QDSP6 = 164; + public static final short EM_8051 = 165; + public static final short EM_STXP7X = 166; + public static final short EM_NDS32 = 167; + public static final short EM_ECOG1 = 168; + public static final short EM_ECOG1X = 168; + public static final short EM_MAXQ30 = 169; + public static final short EM_XIMO16 = 170; + public static final short EM_MANIK = 171; + public static final short EM_CRAYNV2 = 172; + public static final short EM_RX = 173; + public static final short EM_METAG = 174; + public static final short EM_MCST_ELBRUS = 175; + public static final short EM_ECOG16 = 176; + public static final short EM_CR16 = 177; + public static final short EM_ETPU = 178; + public static final short EM_SLE9X = 179; + public static final short EM_L1OM = 180; + public static final short EM_INTEL181 = 181; + public static final short EM_INTEL182 = 182; + public static final short EM_AARCH64 = 183; + public static final short EM_ARM184 = 184; + public static final short EM_AVR32 = 185; + public static final short EM_STM8 = 186; + public static final short EM_TILE64 = 187; + public static final short EM_TILEPRO = 188; + public static final short EM_MICROBLAZE = 189; + public static final short EM_CUDA = 190; + + public static final boolean isIdentityValid(final byte[] ident) { + return ELFMAG0 == ident[0] && + ELFMAG1 == ident[1] && + ELFMAG2 == ident[2] && + ELFMAG3 == ident[3] ; + } + + /** Public access to the raw elf header part-1 (CPU/ABI independent read) */ + public final Ehdr_p1 raw; + private final byte[] E_ident; + + /** Lower case CPUType name */ + public final String cpuName; + public final CPUType cpuType; + public final ABIType abiType; + + 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 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 + */ + 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"); + } + + 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, + * 32 for {@link #ELFCLASS32}, 64 for {@link #ELFCLASS64} + * and 0 for {@link #ELFCLASSNONE}. + */ + public final int getArchClassBits() { + switch( E_ident[EI_CLASS] ) { + case ELFCLASS32: return 32; + case ELFCLASS64: return 64; + default: return 0; + } + } + + /** + * Returns the processor's data encoding, i.e. + * {@link #ELFDATA2LSB}, {@link #ELFDATA2MSB} or {@link #ELFDATANONE}; + */ + public final byte getDataEncodingMode() { + 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]; + } + + /** Returns the operating system and ABI for this file, 3 == Linux. Note: Often not used. */ + public final byte getOSABI() { + return E_ident[EI_OSABI]; + } + + /** Returns the version of the {@link #getOSABI() OSABI} for this file. */ + public final byte getOSABIVersion() { + return E_ident[EI_ABIVERSION]; + } + + /** Returns the object file type, e.g. {@link #ET_EXEC}, .. */ + public final short getType() { + return raw.getE_type(); + } + + /** Returns the required architecture for the file, e.g. {@link #EM_386}, .. */ + public final short getMachine() { + return raw.getE_machine(); + } + + @Override + public final String toString() { + final int enc = getDataEncodingMode(); + final String encS; + switch(enc) { + case ELFDATA2LSB: encS = "LSB"; break; + case ELFDATA2MSB: encS = "MSB"; break; + default: encS = "NON"; break; /* ELFDATANONE */ + } + 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 */ + } + 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 + *

+ * Part-2 can only be read w/ knowledge of CPUType! + *

+ *

+ * References: + *

    + *
  • http://linux.die.net/man/5/elf
  • + *
  • http://www.sco.com/developers/gabi/latest/contents.html
  • + *
  • http://infocenter.arm.com/ + *
      + *
    • ARM IHI 0044E, current through ABI release 2.09
    • + *
    • ARM IHI 0056B: Elf for ARM 64-bit Architecture
    • + *
  • + *
+ *

+ */ +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. + *

+ * Compatible with legacy (pre version 5) gcc use as EF_ARM_VFP_FLOAT. + *

+ *

+ * Note: This is not used (anymore) + *

+ * {@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. + *

+ * Compatible with legacy (pre version 5) gcc use as EF_ARM_SOFT_FLOAT. + *

+ *

+ * Note: This is not used (anymore) + *

+ * {@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. + *

+ * Note: This is not used (anymore) + *

+ */ + 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= 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 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/ sb_off, @@ -215,7 +243,7 @@ public class SectionArmAttributes extends Section { * @throws IndexOutOfBoundsException if offset + remaining > sb.length. * @throws IllegalArgumentException if section parsing failed, i.e. incompatible version or data. */ - static List parse(final byte[] in, final int offset, final int remaining) throws IndexOutOfBoundsException, IllegalArgumentException { + static List 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 vendorAttributesList = new ArrayList(); + 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/ sb_off, @@ -268,7 +298,10 @@ public class SectionArmAttributes extends Section { * @throws IndexOutOfBoundsException if offset + remaining > sb.length. * @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 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 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 null if not read. */ @@ -232,9 +242,9 @@ public class SectionHeader { * @throws IllegalArgumentException if section offset or size mismatch including size > {@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 > 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 } -- cgit v1.2.3