From 2432dbef17c1dc4164f055cf434073bdabf8a6a9 Mon Sep 17 00:00:00 2001
From: Sven Gothel
+ * References:
+ *
+ *
+ *
+ *
+ *
+ *
+ * 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_res183 = 183; + public static final short EM_res184 = 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(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; + + /** + * 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(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(java.nio.ByteBuffer buf, RandomAccessFile in) throws IllegalArgumentException, IOException { + d = Ehdr.create(buf); + if( !isIdentityValid(d.getE_ident()) ) { + throw new IllegalArgumentException("Buffer is not an ELF Header"); + } + sht = readSectionHeaderTable(in); + } + + 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( d.getE_ident()[EI_CLASS] ) { + case ELFCLASS32: return 32; + case ELFCLASS64: return 64; + default: return 0; + } + } + + /** + * Returns the processor's data encoding, + * 1 for {@link #ELFDATA2LSB}, 2 for for {@link #ELFDATA2MSB} + * and 0 for for {@link #ELFDATANONE} + */ + public final int getDataEncodingMode() { + switch( d.getE_ident()[EI_DATA] ) { + case ELFDATA2LSB: return 1; + case ELFDATA2MSB: return 2; + default: return 0; + } + } + + /** 3 == Linux */ + public final byte getOSABI() { + return d.getE_ident()[EI_OSABI]; + } + + /** Returns the object file type */ + public final short getType() { + return d.getE_type(); + } + + /** Returns the required architecture for the file */ + public final short getMachine() { + return d.getE_machine(); + } + + /** + * Returns true if {@link #getMachine() machine} is a 32 or 64 bit ARM CPU + * of type {@link #EM_ARM}. */ + public final boolean isArm() { + return getMachine() == EM_ARM; + } + + /** + * 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 isIntel() { + final short m = getMachine(); + return EM_386 == m || + EM_486 == m || + EM_X86_64 == m; + } + + /** Retruns 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(int type) { + for(int i=0; isb_off
,
+ * which shall not exceed sb.length - offset
.
+ * @param offset_post optional integer array holding offset post parsing
+ * @return the parsed string
+ * @throws IndexOutOfBoundsException if offset + remaining > sb.length
.
+ */
+ static String getString(final byte[] sb, final int offset, final int remaining, int[] offset_post) throws IndexOutOfBoundsException {
+ checkBounds(sb, offset, remaining);
+ int strlen = 0;
+ for(; strlen < remaining && sb[strlen + offset] != 0; strlen++) { }
+ final String s = 0 < strlen ? new String(sb, offset, strlen) : "" ;
+ if( null != offset_post ) {
+ offset_post[0] = offset + strlen + 1; // incl. EOS
+ }
+ return s;
+ }
+
+ /**
+ * @param sb 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
,
+ * which shall not exceed sb.length - offset
.
+ * @return the number of parsed strings
+ * @throws IndexOutOfBoundsException if offset + remaining > sb.length
.
+ */
+ static int getStringCount(final byte[] sb, int offset, final int remaining) throws IndexOutOfBoundsException {
+ checkBounds(sb, offset, remaining);
+ int strnum=0;
+ for(int i=0; i < remaining; i++) {
+ for(; i < remaining && sb[i + offset] != 0; i++) { }
+ strnum++;
+ }
+ return strnum;
+ }
+
+ /**
+ * @param sb 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
,
+ * which shall not exceed sb.length - offset
.
+ * @return the parsed strings
+ * @throws IndexOutOfBoundsException if offset + remaining > sb.length
.
+ */
+ public static String[] getStrings(final byte[] sb, int offset, final int remaining) throws IndexOutOfBoundsException {
+ final int strnum = getStringCount(sb, offset, remaining);
+ // System.err.println("XXX: strnum "+strnum+", sb_off "+sb_off+", sb_len "+sb_len);
+
+ final String[] sa = new String[strnum];
+ final int[] io_off = new int[] { offset };
+ for(int i=0; i < strnum; i++) {
+ // System.err.print("XXX: str["+i+"] ["+io_off[0]);
+ sa[i] = getString(sb, io_off[0], remaining - io_off[0], io_off);
+ // System.err.println(".. "+io_off[0]+"[ "+sa[i]);
+ }
+ return sa;
+ }
+
+}
diff --git a/src/java/jogamp/common/os/elf/Section.java b/src/java/jogamp/common/os/elf/Section.java
new file mode 100644
index 0000000..99c762c
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/Section.java
@@ -0,0 +1,50 @@
+/**
+ * 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;
+
+public class Section {
+ public SectionHeader sh;
+ public byte[] data;
+ public int offset;
+ public int length;
+
+ Section(SectionHeader sh, byte[] data, int offset, int length) {
+ this.sh = sh;
+ this.data = data;
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public String toString() {
+ return "Section["+toSubString()+"]";
+ }
+ String toSubString() {
+ return sh+", data[off "+offset+", len "+length+"/"+data.length+"]";
+ }
+
+}
diff --git a/src/java/jogamp/common/os/elf/SectionArmAttributes.java b/src/java/jogamp/common/os/elf/SectionArmAttributes.java
new file mode 100644
index 0000000..7b85bb9
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/SectionArmAttributes.java
@@ -0,0 +1,317 @@
+package jogamp.common.os.elf;
+
+import static jogamp.common.os.elf.IOUtils.toHexString;
+import static jogamp.common.os.elf.IOUtils.checkBounds;
+import static jogamp.common.os.elf.IOUtils.readUInt32;
+import static jogamp.common.os.elf.IOUtils.getString;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ARM EABI attributes within section header {@link SectionHeader#SHT_ARM_ATTRIBUTES}.
+ * + * References: + *
sb.length - offset
.
+ * @throws IndexOutOfBoundsException if offset + remaining > sb.length
.
+ * @throws IllegalArgumentException if section parsing failed, i.e. incompatible version or data.
+ */
+ static Listsb_off
,
+ * which shall not exceed sb.length - offset
.
+ * @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, int[] offset_post, List+ * References: + *
null
if not read. */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Returns the Section referenced w/ this section header
+ *
+ * @param in file owning the section
+ * @throws IOException if read error occurs
+ * @throws IllegalArgumentException if section offset or size mismatch including size > {@link Integer#MAX_VALUE}
+ */
+ public Section readSection(RandomAccessFile in) throws IOException, IllegalArgumentException {
+ final int s_size = long2Int(d.getSh_size());
+ if( 0 == s_size || 0 > s_size ) {
+ throw new IllegalArgumentException("Shdr["+idx+"] has invalid int size: "+d.getSh_size()+" -> "+s_size);
+ }
+ final byte[] s_buf = new byte[s_size];
+ return readSectionImpl(in, s_buf, 0, s_size);
+ }
+
+ /**
+ * Returns the Section referenced w/ this section header using given byte array.
+ *
+ * @param in file owning the section
+ * @param b destination buffer
+ * @param b_off offset in destination buffer
+ * @param r_len requested read length in bytes, which shall be ≤ than this section size
+ * @throws IOException if read error occurs
+ * @throws IllegalArgumentException if section offset or size mismatch including size > {@link Integer#MAX_VALUE}
+ * @throws IllegalArgumentException if requested read length is > section size
+ */
+ public Section readSection(RandomAccessFile in, byte[] b, int b_off, int r_len) throws IOException, IllegalArgumentException {
+ final int s_size = long2Int(d.getSh_size());
+ if( 0 == s_size || 0 > s_size ) {
+ throw new IllegalArgumentException("Shdr["+idx+"] has invalid int size: "+d.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");
+ }
+ return readSectionImpl(in, b, b_off, r_len);
+ }
+
+ Section readSectionImpl(RandomAccessFile in, byte[] b, int b_off, int r_len) throws IOException, IllegalArgumentException {
+ final long s_off = d.getSh_offset();
+ seek(in, s_off);
+ readBytes(in, b, b_off, r_len);
+ if( SectionHeader.SHT_ARM_ATTRIBUTES == getType() ) {
+ return new SectionArmAttributes(this, b, b_off, r_len);
+ } else {
+ return new Section(this, b, b_off, r_len);
+ }
+ }
+}
diff --git a/src/java/jogamp/common/os/elf/Shdr.java b/src/java/jogamp/common/os/elf/Shdr.java
new file mode 100644
index 0000000..5465b3d
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/Shdr.java
@@ -0,0 +1,141 @@
+/* !---- DO NOT EDIT: This file autogenerated by com/jogamp/gluegen/JavaEmitter.java on Thu Feb 07 17:54:18 CET 2013 ----! */
+
+
+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 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+
+ 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);
+ }
+
+ public java.nio.ByteBuffer getBuffer() {
+ return accessor.getBuffer();
+ }
+
+ public Shdr setSh_name(int val) {
+ accessor.setIntAt(sh_name_offset[mdIdx], val);
+ return this;
+ }
+
+ public int getSh_name() {
+ return accessor.getIntAt(sh_name_offset[mdIdx]);
+ }
+
+ public Shdr setSh_type(int val) {
+ accessor.setIntAt(sh_type_offset[mdIdx], val);
+ return this;
+ }
+
+ public int getSh_type() {
+ return accessor.getIntAt(sh_type_offset[mdIdx]);
+ }
+
+ public Shdr setSh_flags(long val) {
+ accessor.setLongAt(sh_flags_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getSh_flags() {
+ return accessor.getLongAt(sh_flags_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Shdr setSh_addr(long val) {
+ accessor.setLongAt(sh_addr_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getSh_addr() {
+ return accessor.getLongAt(sh_addr_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Shdr setSh_offset(long val) {
+ accessor.setLongAt(sh_offset_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getSh_offset() {
+ return accessor.getLongAt(sh_offset_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Shdr setSh_size(long val) {
+ accessor.setLongAt(sh_size_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getSh_size() {
+ return accessor.getLongAt(sh_size_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Shdr setSh_link(int val) {
+ accessor.setIntAt(sh_link_offset[mdIdx], val);
+ return this;
+ }
+
+ public int getSh_link() {
+ return accessor.getIntAt(sh_link_offset[mdIdx]);
+ }
+
+ public Shdr setSh_info(int val) {
+ accessor.setIntAt(sh_info_offset[mdIdx], val);
+ return this;
+ }
+
+ public int getSh_info() {
+ return accessor.getIntAt(sh_info_offset[mdIdx]);
+ }
+
+ public Shdr setSh_addralign(long val) {
+ accessor.setLongAt(sh_addralign_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getSh_addralign() {
+ return accessor.getLongAt(sh_addralign_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Shdr setSh_entsize(long val) {
+ accessor.setLongAt(sh_entsize_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getSh_entsize() {
+ return accessor.getLongAt(sh_entsize_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+}
diff --git a/src/junit/com/jogamp/common/nio/TestStructAccessorEndian.java b/src/junit/com/jogamp/common/nio/TestStructAccessorEndian.java
index c1d946e..6d8ed88 100644
--- a/src/junit/com/jogamp/common/nio/TestStructAccessorEndian.java
+++ b/src/junit/com/jogamp/common/nio/TestStructAccessorEndian.java
@@ -1,16 +1,16 @@
package com.jogamp.common.nio;
-import com.jogamp.common.os.*;
-import com.jogamp.gluegen.test.junit.generation.Test1p1JavaEmitter;
-import com.jogamp.junit.util.JunitTracer;
+import static java.lang.System.out;
import java.io.IOException;
-import java.nio.*;
+import java.nio.ByteBuffer;
import org.junit.Assert;
import org.junit.Test;
-import static java.lang.System.*;
+import com.jogamp.common.os.MachineDescription;
+import com.jogamp.common.os.Platform;
+import com.jogamp.junit.util.JunitTracer;
public class TestStructAccessorEndian extends JunitTracer {
diff --git a/src/junit/com/jogamp/common/os/TestElfReader01.java b/src/junit/com/jogamp/common/os/TestElfReader01.java
new file mode 100644
index 0000000..fe6adc2
--- /dev/null
+++ b/src/junit/com/jogamp/common/os/TestElfReader01.java
@@ -0,0 +1,119 @@
+package com.jogamp.common.os;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+import jogamp.common.os.elf.ElfHeader;
+import jogamp.common.os.elf.Section;
+import jogamp.common.os.elf.SectionArmAttributes;
+import jogamp.common.os.elf.SectionHeader;
+
+import org.junit.Test;
+
+import com.jogamp.junit.util.JunitTracer;
+
+public class TestElfReader01 extends JunitTracer {
+ public static String GNU_LINUX_SELF_EXE = "/proc/self/exe";
+ public static String ARM_HF_EXE = "tst-exe-armhf";
+ public static String ARM_SF_EXE = "tst-exe-arm";
+
+ @Test
+ public void testGNULinuxSelfExe () throws IOException {
+ testElfHeaderImpl(GNU_LINUX_SELF_EXE, false);
+ }
+
+ // @Test
+ public void testArmHFExe () throws IOException {
+ testElfHeaderImpl(ARM_HF_EXE, false);
+ }
+
+ // @Test
+ public void testArmSFExe () throws IOException {
+ testElfHeaderImpl(ARM_SF_EXE, false);
+ }
+
+ void testElfHeaderImpl(String file, boolean fileOutSections) throws IOException {
+ RandomAccessFile in = new RandomAccessFile(file, "r");
+ try {
+ ElfHeader eh = ElfHeader.read(in);
+ byte[] e_ident = eh.d.getE_ident();
+ int i=0;
+ System.err.print("[0..4]: 0x"+toHexString(e_ident[i++]));
+ System.err.print(", 0x"+toHexString(e_ident[i++]));
+ System.err.print(", 0x"+toHexString(e_ident[i++]));
+ System.err.println(", 0x"+toHexString(e_ident[i++]));
+ System.err.println("e_class "+e_ident[ElfHeader.EI_CLASS]+", "+eh.getArchClassBits()+" bits");
+ System.err.println("e_data "+e_ident[ElfHeader.EI_DATA]+", "+eh.getDataEncodingMode());
+ System.err.println("e_flags "+toHexString(eh.getFlags()));
+ System.err.println(" ARM ABI "+eh.getArmABI());
+ System.err.println(" ARM lGCC "+eh.getArmLegacyGCCFlags());
+ System.err.println(" ARM FLOAT "+eh.getArmFloatMode()+", is hard-float "+(2 == eh.getArmFloatMode()));
+ System.err.println("e_version "+e_ident[ElfHeader.EI_VERSION]);
+ System.err.println("e_osabi "+eh.getOSABI()+", Linux "+ElfHeader.ELFOSABI_LINUX);
+ System.err.println("e_abiversion "+e_ident[ElfHeader.EI_ABIVERSION]);
+ System.err.println("e_machine "+eh.getMachine()+", isARM "+eh.isArm()+", isIntel "+eh.isIntel());
+ System.err.println("e_version "+eh.d.getE_version());
+ System.err.println("e_type "+eh.getType());
+ System.err.println("EH Size "+eh.d.getE_ehsize());
+ System.err.println("SH num "+eh.d.getE_shnum());
+ System.err.println("SH entsz "+eh.d.getE_shentsize());
+ System.err.println("SH off "+toHexString(eh.d.getE_shoff()));
+ System.err.println("SH strndx "+eh.d.getE_shstrndx());
+ System.err.println("SH num "+eh.sht.length);
+ if( 0 < eh.sht.length ) {
+ System.err.println("SH size "+eh.sht[0].d.getBuffer().limit());
+ }
+ {
+ SectionHeader sh = eh.getSectionHeader(SectionHeader.SHT_ARM_ATTRIBUTES);
+ boolean abiVFPArgsAcceptsVFPVariant = false;
+ if( null != sh ) {
+ final SectionArmAttributes sArmAttrs = (SectionArmAttributes) sh.readSection(in);
+ final SectionArmAttributes.Attribute abiVFPArgsAttr = sArmAttrs.get(SectionArmAttributes.Tag.ABI_VFP_args);
+ if( null != abiVFPArgsAttr ) {
+ abiVFPArgsAcceptsVFPVariant = SectionArmAttributes.abiVFPArgsAcceptsVFPVariant(abiVFPArgsAttr.getULEB128());
+ }
+ }
+ System.err.println("abiVFPArgsAcceptsVFPVariant "+abiVFPArgsAcceptsVFPVariant);
+ }
+ for(i=0; i