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