From 2432dbef17c1dc4164f055cf434073bdabf8a6a9 Mon Sep 17 00:00:00 2001
From: Sven Gothel
Date: Fri, 8 Feb 2013 05:12:39 +0100
Subject: Bug 681: Add Basic ELF Header + ARM EABI Section Parsing, allowing to
distinguish ARM soft-float/hard-float (part-1)
https://jogamp.org/bugzilla/show_bug.cgi?id=681
+ * References:
+ *
+ * - http://linux.die.net/man/5/elf
+ * - http://www.sco.com/developers/gabi/latest/contents.html
+ * - http://infocenter.arm.com/
+ *
+ * - ARM IHI 0044E, current through ABI release 2.09
+ * - ARM IHI 0045D, current through ABI release 2.09
+ *
Added self contained jogamp.common.os.elf package w/ entry point class ElfHeader
to read a RandomAccessFile and parse it as an ELF file.
ELF Parsing completness:
- Header: OK
- SectionHeader: OK
- Section Type SHT_ARM_ATTRIBUTES: OK
- Will be read into SectionArmAttributes
- Used to distinguisgh soft/hard VFP float
Tested manually on:
- Linux intel 32bit / 64bit, arm soft-float and hard-float
---
doc/elf/crosstest-java-linux-armv6hf-panda.log | 61 +++
doc/elf/crosstest-java-linux-armv6hf-raspi.log | 61 +++
doc/elf/crosstest-java-linux-armv6sf-panda.log | 60 +++
make/build.xml | 59 ++-
make/elf-eh-const.cfg | 5 +
make/elf-header.cfg | 13 +
make/elf-sh-const.cfg | 5 +
make/scripts/crosstest-java-linux-armv6-rel.sh | 37 ++
make/scripts/crosstest-java-linux-armv6hf-rel.sh | 37 ++
make/scripts/crosstest-java-linux-armv7-rel.sh | 36 --
make/scripts/runtest.sh | 6 +-
make/stub_includes/os/elf_eh_const.h | 262 ++++++++++
make/stub_includes/os/elf_header.h | 60 +++
make/stub_includes/os/elf_sh_const.h | 211 ++++++++
src/java/jogamp/common/os/elf/Ehdr.java | 179 +++++++
src/java/jogamp/common/os/elf/ElfHeader.java | 574 +++++++++++++++++++++
src/java/jogamp/common/os/elf/IOUtils.java | 148 ++++++
src/java/jogamp/common/os/elf/Section.java | 50 ++
.../jogamp/common/os/elf/SectionArmAttributes.java | 317 ++++++++++++
src/java/jogamp/common/os/elf/SectionHeader.java | 274 ++++++++++
src/java/jogamp/common/os/elf/Shdr.java | 141 +++++
.../common/nio/TestStructAccessorEndian.java | 10 +-
.../com/jogamp/common/os/TestElfReader01.java | 119 +++++
23 files changed, 2676 insertions(+), 49 deletions(-)
create mode 100644 doc/elf/crosstest-java-linux-armv6hf-panda.log
create mode 100644 doc/elf/crosstest-java-linux-armv6hf-raspi.log
create mode 100644 doc/elf/crosstest-java-linux-armv6sf-panda.log
create mode 100755 make/elf-eh-const.cfg
create mode 100644 make/elf-header.cfg
create mode 100755 make/elf-sh-const.cfg
create mode 100644 make/scripts/crosstest-java-linux-armv6-rel.sh
create mode 100644 make/scripts/crosstest-java-linux-armv6hf-rel.sh
delete mode 100644 make/scripts/crosstest-java-linux-armv7-rel.sh
create mode 100644 make/stub_includes/os/elf_eh_const.h
create mode 100644 make/stub_includes/os/elf_header.h
create mode 100644 make/stub_includes/os/elf_sh_const.h
create mode 100644 src/java/jogamp/common/os/elf/Ehdr.java
create mode 100644 src/java/jogamp/common/os/elf/ElfHeader.java
create mode 100644 src/java/jogamp/common/os/elf/IOUtils.java
create mode 100644 src/java/jogamp/common/os/elf/Section.java
create mode 100644 src/java/jogamp/common/os/elf/SectionArmAttributes.java
create mode 100644 src/java/jogamp/common/os/elf/SectionHeader.java
create mode 100644 src/java/jogamp/common/os/elf/Shdr.java
create mode 100644 src/junit/com/jogamp/common/os/TestElfReader01.java
diff --git a/doc/elf/crosstest-java-linux-armv6hf-panda.log b/doc/elf/crosstest-java-linux-armv6hf-panda.log
new file mode 100644
index 0000000..cad24ec
--- /dev/null
+++ b/doc/elf/crosstest-java-linux-armv6hf-panda.log
@@ -0,0 +1,61 @@
+JUnit version 4.8.2
+.++++ TestCase.setUp: com.jogamp.common.os.TestElfReader01 - testGNULinuxSelfExe
+[0..4]: 0x0x7f, 0x0x45, 0x0x4c, 0x0x46
+e_class 1, 32 bits
+e_data 1, 1
+e_flags 0x5000002
+ ARM ABI 5
+ ARM lGCC 2
+ ARM FLOAT 0, is hard-float false
+e_version 1
+e_osabi 0, Linux 3
+e_abiversion 0
+e_machine 40, isARM true, isIntel false
+e_version 1
+e_type 2
+EH Size 52
+SH num 29
+SH entsz 40
+SH off 0x1168
+SH strndx 28
+SH num 29
+SH size 40
+abiVFPArgsAcceptsVFPVariant true
+SectionHeader[idx 0, name , type 0x0, link 0, info 0x0, flags 0x0]
+SectionHeader[idx 1, name .interp, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 2, name .note.ABI-tag, type 0x7, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 3, name .note.gnu.build-id, type 0x7, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 4, name .hash, type 0x5, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 5, name .gnu.hash, type 0x6ffffff6, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 6, name .dynsym, type 0xb, link 7, info 0x1, flags 0x2]
+SectionHeader[idx 7, name .dynstr, type 0x3, link 0, info 0x0, flags 0x2]
+SHT_STRTAB: read 270, Section[SectionHeader[idx 7, name .dynstr, type 0x3, link 0, info 0x0, flags 0x2], data[off 0, len 270/270]]
+SectionHeader[idx 8, name .gnu.version, type 0x6fffffff, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 9, name .gnu.version_r, type 0x6ffffffe, link 7, info 0x2, flags 0x2]
+SectionHeader[idx 10, name .rel.dyn, type 0x9, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 11, name .rel.plt, type 0x9, link 6, info 0xd, flags 0x2]
+SectionHeader[idx 12, name .init, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 13, name .plt, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 14, name .text, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 15, name .fini, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 16, name .rodata, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 17, name .ARM.exidx, type 0x70000001, link 14, info 0x0, flags 0x82]
+SectionHeader[idx 18, name .eh_frame, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 19, name .init_array, type 0xe, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 20, name .fini_array, type 0xf, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 21, name .jcr, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 22, name .dynamic, type 0x6, link 7, info 0x0, flags 0x3]
+SectionHeader[idx 23, name .got, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 24, name .data, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 25, name .bss, type 0x8, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 26, name .ARM.attributes, type 0x70000003, link 0, info 0x0, flags 0x0]
+SHT_ARM_ATTRIBUTES: read 51, SectionArmAttributes[SectionHeader[idx 26, name .ARM.attributes, type 0x70000003, link 0, info 0x0, flags 0x0], data[off 0, len 51/51], [aeabi[CPU_name = 7-A, CPU_arch = 10, CPU_arch_profile = 65, ARM_ISA_use = 1, THUMB_ISA_use = 2, FP_arch = 4, ABI_PCS_wchar_t = 4, ABI_FP_denormal = 1, ABI_FP_exceptions = 1, ABI_FP_number_model = 3, ABI_align_needed = 1, ABI_align_preserved = 1, ABI_enum_size = 2, ABI_HardFP_use = 3, ABI_VFP_args = 1, CPU_unaligned_access = 1]]]
+SectionHeader[idx 27, name .gnu_debuglink, type 0x1, link 0, info 0x0, flags 0x0]
+SectionHeader[idx 28, name .shstrtab, type 0x3, link 0, info 0x0, flags 0x0]
+SHT_STRTAB: read 256, Section[SectionHeader[idx 28, name .shstrtab, type 0x3, link 0, info 0x0, flags 0x0], data[off 0, len 256/256]]
+++++ TestCase.tearDown: com.jogamp.common.os.TestElfReader01 - testGNULinuxSelfExe
+
+Time: 0.163
+
+OK (1 test)
+
diff --git a/doc/elf/crosstest-java-linux-armv6hf-raspi.log b/doc/elf/crosstest-java-linux-armv6hf-raspi.log
new file mode 100644
index 0000000..724ee8e
--- /dev/null
+++ b/doc/elf/crosstest-java-linux-armv6hf-raspi.log
@@ -0,0 +1,61 @@
+JUnit version 4.8.2
+.++++ TestCase.setUp: com.jogamp.common.os.TestElfReader01 - testGNULinuxSelfExe
+[0..4]: 0x0x7f, 0x0x45, 0x0x4c, 0x0x46
+e_class 1, 32 bits
+e_data 1, 1
+e_flags 0x5000002
+ ARM ABI 5
+ ARM lGCC 2
+ ARM FLOAT 0, is hard-float false
+e_version 1
+e_osabi 0, Linux 3
+e_abiversion 0
+e_machine 40, isARM true, isIntel false
+e_version 1
+e_type 2
+EH Size 52
+SH num 29
+SH entsz 40
+SH off 0x1168
+SH strndx 28
+SH num 29
+SH size 40
+abiVFPArgsAcceptsVFPVariant true
+SectionHeader[idx 0, name , type 0x0, link 0, info 0x0, flags 0x0]
+SectionHeader[idx 1, name .interp, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 2, name .note.ABI-tag, type 0x7, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 3, name .note.gnu.build-id, type 0x7, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 4, name .hash, type 0x5, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 5, name .gnu.hash, type 0x6ffffff6, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 6, name .dynsym, type 0xb, link 7, info 0x1, flags 0x2]
+SectionHeader[idx 7, name .dynstr, type 0x3, link 0, info 0x0, flags 0x2]
+SHT_STRTAB: read 307, Section[SectionHeader[idx 7, name .dynstr, type 0x3, link 0, info 0x0, flags 0x2], data[off 0, len 307/307]]
+SectionHeader[idx 8, name .gnu.version, type 0x6fffffff, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 9, name .gnu.version_r, type 0x6ffffffe, link 7, info 0x2, flags 0x2]
+SectionHeader[idx 10, name .rel.dyn, type 0x9, link 6, info 0x0, flags 0x2]
+SectionHeader[idx 11, name .rel.plt, type 0x9, link 6, info 0xd, flags 0x2]
+SectionHeader[idx 12, name .init, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 13, name .plt, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 14, name .text, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 15, name .fini, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 16, name .rodata, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 17, name .ARM.exidx, type 0x70000001, link 14, info 0x0, flags 0x82]
+SectionHeader[idx 18, name .eh_frame, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 19, name .init_array, type 0xe, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 20, name .fini_array, type 0xf, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 21, name .jcr, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 22, name .dynamic, type 0x6, link 7, info 0x0, flags 0x3]
+SectionHeader[idx 23, name .got, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 24, name .data, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 25, name .bss, type 0x8, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 26, name .ARM.attributes, type 0x70000003, link 0, info 0x0, flags 0x0]
+SHT_ARM_ATTRIBUTES: read 49, SectionArmAttributes[SectionHeader[idx 26, name .ARM.attributes, type 0x70000003, link 0, info 0x0, flags 0x0], data[off 0, len 49/49], [aeabi[CPU_name = 6, CPU_arch = 6, ARM_ISA_use = 1, THUMB_ISA_use = 1, FP_arch = 2, ABI_PCS_wchar_t = 4, ABI_FP_denormal = 1, ABI_FP_exceptions = 1, ABI_FP_number_model = 3, ABI_align_needed = 1, ABI_align_preserved = 1, ABI_enum_size = 2, ABI_HardFP_use = 3, ABI_VFP_args = 1, CPU_unaligned_access = 1, DIV_use = 1]]]
+SectionHeader[idx 27, name .gnu_debuglink, type 0x1, link 0, info 0x0, flags 0x0]
+SectionHeader[idx 28, name .shstrtab, type 0x3, link 0, info 0x0, flags 0x0]
+SHT_STRTAB: read 256, Section[SectionHeader[idx 28, name .shstrtab, type 0x3, link 0, info 0x0, flags 0x0], data[off 0, len 256/256]]
+++++ TestCase.tearDown: com.jogamp.common.os.TestElfReader01 - testGNULinuxSelfExe
+
+Time: 1.016
+
+OK (1 test)
+
diff --git a/doc/elf/crosstest-java-linux-armv6sf-panda.log b/doc/elf/crosstest-java-linux-armv6sf-panda.log
new file mode 100644
index 0000000..9cc339a
--- /dev/null
+++ b/doc/elf/crosstest-java-linux-armv6sf-panda.log
@@ -0,0 +1,60 @@
+JUnit version 4.8.2
+.++++ TestCase.setUp: com.jogamp.common.os.TestElfReader01 - testGNULinuxSelfExe
+[0..4]: 0x0x7f, 0x0x45, 0x0x4c, 0x0x46
+e_class 1, 32 bits
+e_data 1, 1
+e_flags 0x5000002
+ ARM ABI 5
+ ARM lGCC 2
+ ARM FLOAT 0, is hard-float false
+e_version 1
+e_osabi 0, Linux 3
+e_abiversion 0
+e_machine 40, isARM true, isIntel false
+e_version 1
+e_type 2
+EH Size 52
+SH num 28
+SH entsz 40
+SH off 0x828c
+SH strndx 27
+SH num 28
+SH size 40
+abiVFPArgsAcceptsVFPVariant false
+SectionHeader[idx 0, name , type 0x0, link 0, info 0x0, flags 0x0]
+SectionHeader[idx 1, name .interp, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 2, name .note.ABI-tag, type 0x7, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 3, name .note.gnu.build-id, type 0x7, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 4, name .gnu.hash, type 0x6ffffff6, link 5, info 0x0, flags 0x2]
+SectionHeader[idx 5, name .dynsym, type 0xb, link 6, info 0x1, flags 0x2]
+SectionHeader[idx 6, name .dynstr, type 0x3, link 0, info 0x0, flags 0x2]
+SHT_STRTAB: read 1000, Section[SectionHeader[idx 6, name .dynstr, type 0x3, link 0, info 0x0, flags 0x2], data[off 0, len 1000/1000]]
+SectionHeader[idx 7, name .gnu.version, type 0x6fffffff, link 5, info 0x0, flags 0x2]
+SectionHeader[idx 8, name .gnu.version_r, type 0x6ffffffe, link 6, info 0x5, flags 0x2]
+SectionHeader[idx 9, name .rel.dyn, type 0x9, link 5, info 0x0, flags 0x2]
+SectionHeader[idx 10, name .rel.plt, type 0x9, link 5, info 0xc, flags 0x2]
+SectionHeader[idx 11, name .init, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 12, name .plt, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 13, name .text, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 14, name .fini, type 0x1, link 0, info 0x0, flags 0x6]
+SectionHeader[idx 15, name .rodata, type 0x1, link 0, info 0x0, flags 0x2]
+SectionHeader[idx 16, name .ARM.exidx, type 0x70000001, link 13, info 0x0, flags 0x82]
+SectionHeader[idx 17, name .init_array, type 0xe, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 18, name .fini_array, type 0xf, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 19, name .jcr, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 20, name .data.rel.ro, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 21, name .dynamic, type 0x6, link 6, info 0x0, flags 0x3]
+SectionHeader[idx 22, name .got, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 23, name .data, type 0x1, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 24, name .bss, type 0x8, link 0, info 0x0, flags 0x3]
+SectionHeader[idx 25, name .ARM.attributes, type 0x70000003, link 0, info 0x0, flags 0x0]
+SHT_ARM_ATTRIBUTES: read 49, SectionArmAttributes[SectionHeader[idx 25, name .ARM.attributes, type 0x70000003, link 0, info 0x0, flags 0x0], data[off 0, len 49/49], [aeabi[CPU_name = 7-A, CPU_arch = 10, CPU_arch_profile = 65, ARM_ISA_use = 1, THUMB_ISA_use = 2, FP_arch = 4, ABI_PCS_wchar_t = 4, ABI_FP_denormal = 1, ABI_FP_exceptions = 1, ABI_FP_number_model = 3, ABI_align_needed = 1, ABI_align_preserved = 1, ABI_enum_size = 2, ABI_HardFP_use = 3, DIV_use = 1]]]
+SectionHeader[idx 26, name .gnu_debuglink, type 0x1, link 0, info 0x0, flags 0x0]
+SectionHeader[idx 27, name .shstrtab, type 0x3, link 0, info 0x0, flags 0x0]
+SHT_STRTAB: read 259, Section[SectionHeader[idx 27, name .shstrtab, type 0x3, link 0, info 0x0, flags 0x0], data[off 0, len 259/259]]
+++++ TestCase.tearDown: com.jogamp.common.os.TestElfReader01 - testGNULinuxSelfExe
+
+Time: 0.083
+
+OK (1 test)
+
diff --git a/make/build.xml b/make/build.xml
index 76187a1..b9d4985 100644
--- a/make/build.xml
+++ b/make/build.xml
@@ -151,7 +151,12 @@
+
+
+
+
@@ -191,14 +196,51 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -209,9 +251,6 @@
-
-
+
+
+
&1 | tee $LOGFILE \
+"
+
+scp $TARGET_UID@$TARGET_IP:$TARGET_ROOT/gluegen/make/$LOGFILE .
diff --git a/make/scripts/crosstest-java-linux-armv6hf-rel.sh b/make/scripts/crosstest-java-linux-armv6hf-rel.sh
new file mode 100644
index 0000000..24dec99
--- /dev/null
+++ b/make/scripts/crosstest-java-linux-armv6hf-rel.sh
@@ -0,0 +1,37 @@
+export HOST_UID=sven
+export HOST_IP=jogamp02
+export HOST_RSYNC_ROOT=PROJECTS/JOGL
+
+export TARGET_UID=jogamp
+export TARGET_IP=panda02
+export TARGET_ROOT=projects-cross
+
+export ANT_PATH=/usr/share/ant
+export BUILD_DIR=../build-linux-armv6hf
+
+#TSTCLASS=com.jogamp.gluegen.test.junit.generation.Test1p2ProcAddressEmitter
+#TSTCLASS=com.jogamp.common.GlueGenVersion
+TSTCLASS=com.jogamp.common.os.TestElfReader01
+
+LOGFILE=`basename $0 .sh`.log
+
+RSYNC_EXCLUDES="--exclude 'build-x86*/' --exclude 'build-linux-x*/' --exclude 'build-android*/' --exclude 'build-win*/' --exclude 'build-mac*/' \
+ --exclude 'classes/' --exclude 'src/' --exclude '.git/' --exclude 'gluegen-java-src.zip' \
+ --delete-excluded"
+
+ssh $TARGET_UID@$TARGET_IP "\
+rsync -aAv --delete --delete-after $RSYNC_EXCLUDES $HOST_UID@$HOST_IP::$HOST_RSYNC_ROOT/gluegen $TARGET_ROOT ; \
+cd $TARGET_ROOT/gluegen/make ;
+LD_LIBRARY_PATH=$BUILD_DIR/obj:$BUILD_DIR/test/build/natives \
+java \
+ -Djava.library.path=$BUILD_DIR/obj:$BUILD_DIR/test/build/natives \
+ -Djava.class.path=lib/junit.jar:$ANT_PATH/lib/ant.jar:$ANT_PATH/lib/ant-junit.jar:$BUILD_DIR/gluegen.jar:$BUILD_DIR/test/build/gluegen-test.jar \
+ -Djogamp.debug.JNILibLoader=true \
+ -Djogamp.debug.NativeLibrary=true \
+ -Djogamp.debug.NativeLibrary.Lookup=true \
+ -Djogamp.debug.ProcAddressHelper=true \
+ $TSTCLASS \
+ 2>&1 | tee $LOGFILE \
+"
+
+scp $TARGET_UID@$TARGET_IP:$TARGET_ROOT/gluegen/make/$LOGFILE .
diff --git a/make/scripts/crosstest-java-linux-armv7-rel.sh b/make/scripts/crosstest-java-linux-armv7-rel.sh
deleted file mode 100644
index 12ec855..0000000
--- a/make/scripts/crosstest-java-linux-armv7-rel.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-export HOST_UID=sven
-export HOST_IP=192.168.0.52
-export HOST_RSYNC_ROOT=PROJECTS/JOGL
-
-export TARGET_UID=jogamp
-export TARGET_IP=beagle01
-export TARGET_ROOT=projects-cross
-
-export ANT_PATH=/usr/share/ant
-export BUILD_DIR=../build-linux-armv7
-
-#TSTCLASS=com.jogamp.gluegen.test.junit.generation.Test1p2ProcAddressEmitter
-TSTCLASS=com.jogamp.common.GlueGenVersion
-
-LOGFILE=`basename $0 .sh`.log
-
-RSYNC_EXCLUDES="--exclude 'build-x86*/' --exclude 'build-linux-x*/' --exclude 'build-android*/' --exclude 'build-win*/' --exclude 'build-mac*/' \
- --exclude 'classes/' --exclude 'src/' --exclude '.git/' --exclude 'gluegen-java-src.zip' \
- --delete-excluded"
-
-ssh $TARGET_UID@$TARGET_IP "\
-rsync -aAv --delete --delete-after $RSYNC_EXCLUDES $HOST_UID@$HOST_IP::$HOST_RSYNC_ROOT/gluegen $TARGET_ROOT ; \
-cd $TARGET_ROOT/gluegen/make ;
-LD_LIBRARY_PATH=$BUILD_DIR/obj:$BUILD_DIR/test/build/natives \
-java \
- -Djava.library.path=$BUILD_DIR/obj:$BUILD_DIR/test/build/natives \
- -Djava.class.path=lib/junit.jar:$ANT_PATH/lib/ant.jar:$ANT_PATH/lib/ant-junit.jar:$BUILD_DIR/gluegen.jar:$BUILD_DIR/test/build/gluegen-test.jar \
- -Djogamp.debug.JNILibLoader=true \
- -Djogamp.debug.NativeLibrary=true \
- -Djogamp.debug.NativeLibrary.Lookup=true \
- -Djogamp.debug.ProcAddressHelper=true \
- $TSTCLASS \
- 2>&1 | tee $LOGFILE \
-"
-
-scp $TARGET_UID@$TARGET_IP:$TARGET_ROOT/gluegen/make/$LOGFILE .
diff --git a/make/scripts/runtest.sh b/make/scripts/runtest.sh
index 13f4aa0..b8af676 100755
--- a/make/scripts/runtest.sh
+++ b/make/scripts/runtest.sh
@@ -47,7 +47,7 @@ rm -f $LOG
#D_ARGS="-Djogamp.debug.IOUtil -Djogamp.debug.JNILibLoader -Djogamp.debug.TempFileCache -Djogamp.debug.JarUtil -Djava.io.tmpdir=/run/tmp"
#D_ARGS="-Djogamp.debug.IOUtil -Djogamp.debug.JNILibLoader -Djogamp.debug.TempFileCache -Djogamp.debug.JarUtil -Djogamp.debug.TempJarCache"
#D_ARGS="-Djogamp.debug.JNILibLoader -Djogamp.gluegen.UseTempJarCache=false"
-D_ARGS="-Djogamp.debug.JNILibLoader"
+#D_ARGS="-Djogamp.debug.JNILibLoader"
#D_ARGS="-Djogamp.debug.Lock"
#D_ARGS="-Djogamp.debug.Lock -Djogamp.debug.Lock.TraceLock"
#D_ARGS="-Djogamp.debug.Lock.TraceLock"
@@ -64,6 +64,7 @@ function onetest() {
export LD_LIBRARY_PATH DYLD_LIBRARY_PATH
echo LD_LIBRARY_PATH $LD_LIBRARY_PATH
echo CLASSPATH $CLASSPATH
+ which java
echo java -cp $CLASSPATH $D_ARGS -Djava.library.path=$libspath $clazz
java -cp $CLASSPATH $D_ARGS -Djava.library.path=$libspath $*
echo
@@ -89,7 +90,8 @@ function onetest() {
#onetest com.jogamp.gluegen.PCPPTest 2>&1 | tee -a $LOG
#onetest com.jogamp.common.nio.TestPointerBufferEndian 2>&1 | tee -a $LOG
#onetest com.jogamp.common.nio.TestStructAccessorEndian 2>&1 | tee -a $LOG
-onetest com.jogamp.gluegen.test.junit.generation.Test1p1JavaEmitter 2>&1 | tee -a $LOG
+onetest com.jogamp.common.os.TestElfReader01 2>&1 | tee -a $LOG
+#onetest com.jogamp.gluegen.test.junit.generation.Test1p1JavaEmitter 2>&1 | tee -a $LOG
#onetest com.jogamp.gluegen.test.junit.generation.Test1p2ProcAddressEmitter 2>&1 | tee -a $LOG
#onetest com.jogamp.common.util.TestPlatform01 2>&1 | tee -a $LOG
#onetest com.jogamp.common.util.TestRunnableTask01 2>&1 | tee -a $LOG
diff --git a/make/stub_includes/os/elf_eh_const.h b/make/stub_includes/os/elf_eh_const.h
new file mode 100644
index 0000000..2b4e7b9
--- /dev/null
+++ b/make/stub_includes/os/elf_eh_const.h
@@ -0,0 +1,262 @@
+
+///////////////////////
+// ELF Header Constants
+
+// File type
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_LOOS 0xFE00
+#define ET_HIOS 0xFEFF
+#define ET_LOPROC 0xFF00
+#define ET_HIPROC 0xFFFF
+
+#define EM_NONE 0 // No machine
+#define EM_M32 1 // AT&T WE 32100
+#define EM_SPARC 2 // SUN SPARC
+#define EM_386 3 // Intel 80386
+#define EM_68K 4 // Motorola m68k family
+#define EM_88K 5 // Motorola m88k family
+#define EM_486 6 // Intel 80486// Reserved for future use
+#define EM_860 7 // Intel 80860
+#define EM_MIPS 8 // MIPS R3000 (officially, big-endian only)
+#define EM_S370 9 // IBM System/370
+#define EM_MIPS_RS3_LE 10 // MIPS R3000 little-endian (Oct 4 1999 Draft) Deprecated
+#define EM_res011 11 // Reserved
+#define EM_res012 12 // Reserved
+#define EM_res013 13 // Reserved
+#define EM_res014 14 // Reserved
+#define EM_PARISC 15 // HPPA
+#define EM_res016 16 // Reserved
+#define EM_VPP550 17 // Fujitsu VPP500
+#define EM_SPARC32PLUS 18 // Sun's "v8plus"
+#define EM_960 19 // Intel 80960
+#define EM_PPC 20 // PowerPC
+#define EM_PPC64 21 // 64-bit PowerPC
+#define EM_S390 22 // IBM S/390
+#define EM_SPU 23 // Sony/Toshiba/IBM SPU
+#define EM_res024 24 // Reserved
+#define EM_res025 25 // Reserved
+#define EM_res026 26 // Reserved
+#define EM_res027 27 // Reserved
+#define EM_res028 28 // Reserved
+#define EM_res029 29 // Reserved
+#define EM_res030 30 // Reserved
+#define EM_res031 31 // Reserved
+#define EM_res032 32 // Reserved
+#define EM_res033 33 // Reserved
+#define EM_res034 34 // Reserved
+#define EM_res035 35 // Reserved
+#define EM_V800 36 // NEC V800 series
+#define EM_FR20 37 // Fujitsu FR20
+#define EM_RH32 38 // TRW RH32
+#define EM_MCORE 39 // Motorola M*Core // May also be taken by Fujitsu MMA
+#define EM_RCE 39 // Old name for MCore
+#define EM_ARM 40 // ARM
+#define EM_OLD_ALPHA 41 // Digital Alpha
+#define EM_SH 42 // Renesas (formerly Hitachi) / SuperH SH
+#define EM_SPARCV9 43 // SPARC v9 64-bit
+#define EM_TRICORE 44 // Siemens Tricore embedded processor
+#define EM_ARC 45 // ARC Cores
+#define EM_H8_300 46 // Renesas (formerly Hitachi) H8/300
+#define EM_H8_300H 47 // Renesas (formerly Hitachi) H8/300H
+#define EM_H8S 48 // Renesas (formerly Hitachi) H8S
+#define EM_H8_500 49 // Renesas (formerly Hitachi) H8/500
+#define EM_IA_64 50 // Intel IA-64 Processor
+#define EM_MIPS_X 51 // Stanford MIPS-X
+#define EM_COLDFIRE 52 // Motorola Coldfire
+#define EM_68HC12 53 // Motorola M68HC12
+#define EM_MMA 54 // Fujitsu Multimedia Accelerator
+#define EM_PCP 55 // Siemens PCP
+#define EM_NCPU 56 // Sony nCPU embedded RISC processor
+#define EM_NDR1 57 // Denso NDR1 microprocesspr
+#define EM_STARCORE 58 // Motorola Star*Core processor
+#define EM_ME16 59 // Toyota ME16 processor
+#define EM_ST100 60 // STMicroelectronics ST100 processor
+#define EM_TINYJ 61 // Advanced Logic Corp. TinyJ embedded processor
+#define EM_X86_64 62 // Advanced Micro Devices X86-64 processor
+#define EM_PDSP 63 // Sony DSP Processor
+#define EM_PDP10 64 // Digital Equipment Corp. PDP-10
+#define EM_PDP11 65 // Digital Equipment Corp. PDP-11
+#define EM_FX66 66 // Siemens FX66 microcontroller
+#define EM_ST9PLUS 67 // STMicroelectronics ST9+ 8/16 bit microcontroller
+#define EM_ST7 68 // STMicroelectronics ST7 8-bit microcontroller
+#define EM_68HC16 69 // Motorola MC68HC16 Microcontroller
+#define EM_68HC11 70 // Motorola MC68HC11 Microcontroller
+#define EM_68HC08 71 // Motorola MC68HC08 Microcontroller
+#define EM_68HC05 72 // Motorola MC68HC05 Microcontroller
+#define EM_SVX 73 // Silicon Graphics SVx
+#define EM_ST19 74 // STMicroelectronics ST19 8-bit cpu
+#define EM_VAX 75 // Digital VAX
+#define EM_CRIS 76 // Axis Communications 32-bit embedded processor
+#define EM_JAVELIN 77 // Infineon Technologies 32-bit embedded cpu
+#define EM_FIREPATH 78 // Element 14 64-bit DSP processor
+#define EM_ZSP 79 // LSI Logic's 16-bit DSP processor
+#define EM_MMIX 80 // Donald Knuth's educational 64-bit processor
+#define EM_HUANY 81 // Harvard's machine-independent format
+#define EM_PRISM 82 // SiTera Prism
+#define EM_AVR 83 // Atmel AVR 8-bit microcontroller
+#define EM_FR30 84 // Fujitsu FR30
+#define EM_D10V 85 // Mitsubishi D10V
+#define EM_D30V 86 // Mitsubishi D30V
+#define EM_V850 87 // NEC v850
+#define EM_M32R 88 // Renesas M32R (formerly Mitsubishi M32R)
+#define EM_MN10300 89 // Matsushita MN10300
+#define EM_MN10200 90 // Matsushita MN10200
+#define EM_PJ 91 // picoJava
+#define EM_OPENRISC 92 // OpenRISC 32-bit embedded processor
+#define EM_ARC_A5 93 // ARC Cores Tangent-A5
+#define EM_XTENSA 94 // Tensilica Xtensa Architecture
+#define EM_VIDEOCORE 95 // Alphamosaic VideoCore processor
+#define EM_TMM_GPP 96 // Thompson Multimedia General Purpose Processor
+#define EM_NS32K 97 // National Semiconductor 32000 series
+#define EM_TPC 98 // Tenor Network TPC processor
+#define EM_SNP1K 99 // Trebia SNP 1000 processor
+#define EM_ST200 100 // STMicroelectronics ST200 microcontroller
+#define EM_IP2K 101 // Ubicom IP2022 micro controller
+#define EM_MAX 102 // MAX Processor
+#define EM_CR 103 // National Semiconductor CompactRISC
+#define EM_F2MC16 104 // Fujitsu F2MC16
+#define EM_MSP430 105 // TI msp430 micro controller
+#define EM_BLACKFIN 106 // ADI Blackfin
+#define EM_SE_C33 107 // S1C33 Family of Seiko Epson processors
+#define EM_SEP 108 // Sharp embedded microprocessor
+#define EM_ARCA 109 // Arca RISC Microprocessor
+#define EM_UNICORE 110 // Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University
+#define EM_EXCESS 111 // eXcess: 16/32/64-bit configurable embedded CPU
+#define EM_DXP 112 // Icera Semiconductor Inc. Deep Execution Processor
+#define EM_ALTERA_NIOS2 113 // Altera Nios II soft-core processor
+#define EM_CRX 114 // National Semiconductor CRX
+#define EM_XGATE 115 // Motorola XGATE embedded processor
+#define EM_C166 116 // Infineon C16x/XC16x processor
+#define EM_M16C 117 // Renesas M16C series microprocessors
+#define EM_DSPIC30F 118 // Microchip Technology dsPIC30F Digital Signal Controller
+#define EM_CE 119 // Freescale Communication Engine RISC core
+#define EM_M32C 120 // Renesas M32C series microprocessors
+#define EM_res121 121 // Reserved
+#define EM_res122 122 // Reserved
+#define EM_res123 123 // Reserved
+#define EM_res124 124 // Reserved
+#define EM_res125 125 // Reserved
+#define EM_res126 126 // Reserved
+#define EM_res127 127 // Reserved
+#define EM_res128 128 // Reserved
+#define EM_res129 129 // Reserved
+#define EM_res130 130 // Reserved
+#define EM_TSK3000 131 // Altium TSK3000 core
+#define EM_RS08 132 // Freescale RS08 embedded processor
+#define EM_res133 133 // Reserved
+#define EM_ECOG2 134 // Cyan Technology eCOG2 microprocessor
+#define EM_SCORE 135 // Sunplus Score
+#define EM_SCORE7 135 // Sunplus S+core7 RISC processor
+#define EM_DSP24 136 // New Japan Radio (NJR) 24-bit DSP Processor
+#define EM_VIDEOCORE3 137 // Broadcom VideoCore III processor
+#define EM_LATTICEMICO32 138 // RISC processor for Lattice FPGA architecture
+#define EM_SE_C17 139 // Seiko Epson C17 family
+#define EM_TI_C6000 140 // Texas Instruments TMS320C6000 DSP family
+#define EM_TI_C2000 141 // Texas Instruments TMS320C2000 DSP family
+#define EM_TI_C5500 142 // Texas Instruments TMS320C55x DSP family
+#define EM_res143 143 // Reserved
+#define EM_res144 144 // Reserved
+#define EM_res145 145 // Reserved
+#define EM_res146 146 // Reserved
+#define EM_res147 147 // Reserved
+#define EM_res148 148 // Reserved
+#define EM_res149 149 // Reserved
+#define EM_res150 150 // Reserved
+#define EM_res151 151 // Reserved
+#define EM_res152 152 // Reserved
+#define EM_res153 153 // Reserved
+#define EM_res154 154 // Reserved
+#define EM_res155 155 // Reserved
+#define EM_res156 156 // Reserved
+#define EM_res157 157 // Reserved
+#define EM_res158 158 // Reserved
+#define EM_res159 159 // Reserved
+#define EM_MMDSP_PLUS 160 // STMicroelectronics 64bit VLIW Data Signal Processor
+#define EM_CYPRESS_M8C 161 // Cypress M8C microprocessor
+#define EM_R32C 162 // Renesas R32C series microprocessors
+#define EM_TRIMEDIA 163 // NXP Semiconductors TriMedia architecture family
+#define EM_QDSP6 164 // QUALCOMM DSP6 Processor
+#define EM_8051 165 // Intel 8051 and variants
+#define EM_STXP7X 166 // STMicroelectronics STxP7x family
+#define EM_NDS32 167 // Andes Technology compact code size embedded RISC processor family
+#define EM_ECOG1 168 // Cyan Technology eCOG1X family
+#define EM_ECOG1X 168 // Cyan Technology eCOG1X family
+#define EM_MAXQ30 169 // Dallas Semiconductor MAXQ30 Core Micro-controllers
+#define EM_XIMO16 170 // New Japan Radio (NJR) 16-bit DSP Processor
+#define EM_MANIK 171 // M2000 Reconfigurable RISC Microprocessor
+#define EM_CRAYNV2 172 // Cray Inc. NV2 vector architecture
+#define EM_RX 173 // Renesas RX family
+#define EM_METAG 174 // Imagination Technologies META processor architecture
+#define EM_MCST_ELBRUS 175 // MCST Elbrus general purpose hardware architecture
+#define EM_ECOG16 176 // Cyan Technology eCOG16 family
+#define EM_CR16 177 // National Semiconductor CompactRISC 16-bit processor
+#define EM_ETPU 178 // Freescale Extended Time Processing Unit
+#define EM_SLE9X 179 // Infineon Technologies SLE9X core
+#define EM_L1OM 180 // Intel L1OM
+#define EM_INTEL181 181 // Reserved by Intel
+#define EM_INTEL182 182 // Reserved by Intel
+#define EM_res183 183 // Reserved by ARM
+#define EM_res184 184 // Reserved by ARM
+#define EM_AVR32 185 // Atmel Corporation 32-bit microprocessor family
+#define EM_STM8 186 // STMicroeletronics STM8 8-bit microcontroller
+#define EM_TILE64 187 // Tilera TILE64 multicore architecture family
+#define EM_TILEPRO 188 // Tilera TILEPro multicore architecture family
+#define EM_MICROBLAZE 189 // Xilinx MicroBlaze 32-bit RISC soft processor core
+#define EM_CUDA 190 // NVIDIA CUDA architecture
+
+
+// File version
+#define EV_NONE 0
+#define EV_CURRENT 1
+
+// Identification index
+#define EI_MAG0 0
+#define EI_MAG1 1
+#define EI_MAG2 2
+#define EI_MAG3 3
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+#define EI_OSABI 7
+#define EI_ABIVERSION 8
+#define EI_PAD 9
+#define EI_NIDENT 16
+
+// Magic number
+#define ELFMAG0 0x7F
+#define ELFMAG1 'E'
+#define ELFMAG2 'L'
+#define ELFMAG3 'F'
+
+// File class
+#define ELFCLASSNONE 0
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+
+// Encoding
+#define ELFDATANONE 0
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+
+// OS extensions
+#define ELFOSABI_NONE 0 // No extensions or unspecified
+#define ELFOSABI_HPUX 1 // Hewlett-Packard HP-UX
+#define ELFOSABI_NETBSD 2 // NetBSD
+#define ELFOSABI_LINUX 3 // Linux
+#define ELFOSABI_SOLARIS 6 // Sun Solaris
+#define ELFOSABI_AIX 7 // AIX
+#define ELFOSABI_IRIX 8 // IRIX
+#define ELFOSABI_FREEBSD 9 // FreeBSD
+#define ELFOSABI_TRU64 10 // Compaq TRU64 UNIX
+#define ELFOSABI_MODESTO 11 // Novell Modesto
+#define ELFOSABI_OPENBSD 12 // Open BSD
+#define ELFOSABI_OPENVMS 13 // Open VMS
+#define ELFOSABI_NSK 14 // Hewlett-Packard Non-Stop Kernel
+#define ELFOSABI_AROS 15 // Amiga Research OS
+#define ELFOSABI_FENIXOS 16 // The FenixOS highly scalable multi-core OS
+ // 64-255 Architecture-specific value range
+
diff --git a/make/stub_includes/os/elf_header.h b/make/stub_includes/os/elf_header.h
new file mode 100644
index 0000000..7d608f0
--- /dev/null
+++ b/make/stub_includes/os/elf_header.h
@@ -0,0 +1,60 @@
+
+#include
+#include
+
+// #define EI_NIDENT 16
+
+// #define ElfN_Addr uintptr_t
+// #define ElfN_Off size_t
+typedef uintptr_t ElfN_Addr;
+typedef size_t ElfN_Off;
+typedef size_t ElfN_size;
+
+typedef struct {
+ unsigned char e_ident[16];
+ uint16_t e_type;
+ uint16_t e_machine;
+ uint32_t e_version;
+ ElfN_Addr e_entry;
+ ElfN_Off e_phoff;
+ ElfN_Off e_shoff;
+ uint32_t e_flags;
+ uint16_t e_ehsize;
+ uint16_t e_phentsize;
+ uint16_t e_phnum;
+ uint16_t e_shentsize;
+ uint16_t e_shnum;
+ uint16_t e_shstrndx;
+} Ehdr;
+
+typedef struct {
+ uint32_t sh_name;
+ uint32_t sh_type;
+ ElfN_size sh_flags;
+ ElfN_Addr sh_addr;
+ ElfN_Off sh_offset;
+ ElfN_size sh_size;
+ uint32_t sh_link;
+ uint32_t sh_info;
+ ElfN_size sh_addralign;
+ ElfN_size sh_entsize;
+} Shdr;
+
+typedef struct {
+ uint32_t st_name;
+ ElfN_Addr st_value;
+ ElfN_size st_size;
+ uint8_t st_info;
+ uint8_t st_other;
+ uint16_t st_shndx;
+} Sym32;
+
+typedef struct {
+ uint32_t st_name;
+ uint8_t st_info;
+ uint8_t st_other;
+ uint16_t st_shndx;
+ ElfN_Addr st_value;
+ ElfN_size st_size;
+} Sym64;
+
diff --git a/make/stub_includes/os/elf_sh_const.h b/make/stub_includes/os/elf_sh_const.h
new file mode 100644
index 0000000..73e30e8
--- /dev/null
+++ b/make/stub_includes/os/elf_sh_const.h
@@ -0,0 +1,211 @@
+/////////////////////
+// Sections constants
+
+// Section indexes
+#define SHN_UNDEF 0
+#define SHN_LORESERVE 0xFF00
+#define SHN_LOPROC 0xFF00
+#define SHN_HIPROC 0xFF1F
+#define SHN_LOOS 0xFF20
+#define SHN_HIOS 0xFF3F
+#define SHN_ABS 0xFFF1
+#define SHN_COMMON 0xFFF2
+#define SHN_XINDEX 0xFFFF
+#define SHN_HIRESERVE 0xFFFF
+
+// Section types
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_INIT_ARRAY 14
+#define SHT_FINI_ARRAY 15
+#define SHT_PREINIT_ARRAY 16
+#define SHT_GROUP 17
+#define SHT_SYMTAB_SHNDX 18
+#define SHT_LOOS 0x60000000
+#define SHT_HIOS 0x6fffffff
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7FFFFFFF
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0xFFFFFFFF
+
+// Section attribute flags
+#define SHF_WRITE 0x1
+#define SHF_ALLOC 0x2
+#define SHF_EXECINSTR 0x4
+#define SHF_MERGE 0x10
+#define SHF_STRINGS 0x20
+#define SHF_INFO_LINK 0x40
+#define SHF_LINK_ORDER 0x80
+#define SHF_OS_NONCONFORMING 0x100
+#define SHF_GROUP 0x200
+#define SHF_TLS 0x400
+#define SHF_MASKOS 0x0ff00000
+#define SHF_MASKPROC 0xF0000000
+
+// Section group flags
+#define GRP_COMDAT 0x1
+#define GRP_MASKOS 0x0ff00000
+#define GRP_MASKPROC 0xf0000000
+
+// Symbol binding
+#define STB_LOCAL 0
+#define STB_GLOBAL 1
+#define STB_WEAK 2
+#define STB_LOOS 10
+#define STB_HIOS 12
+#define STB_MULTIDEF 13
+#define STB_LOPROC 13
+#define STB_HIPROC 15
+
+// Symbol types
+#define STT_NOTYPE 0
+#define STT_OBJECT 1
+#define STT_FUNC 2
+#define STT_SECTION 3
+#define STT_FILE 4
+#define STT_COMMON 5
+#define STT_TLS 6
+#define STT_LOOS 10
+#define STT_HIOS 12
+#define STT_LOPROC 13
+#define STT_HIPROC 15
+
+// Symbol visibility
+#define STV_DEFAULT 0
+#define STV_INTERNAL 1
+#define STV_HIDDEN 2
+#define STV_PROTECTED 3
+
+// Undefined name
+#define STN_UNDEF 0
+
+// Relocation types
+#define R_386_NONE 0
+#define R_X86_64_NONE 0
+#define R_386_32 1
+#define R_X86_64_64 1
+#define R_386_PC32 2
+#define R_X86_64_PC32 2
+#define R_386_GOT32 3
+#define R_X86_64_GOT32 3
+#define R_386_PLT32 4
+#define R_X86_64_PLT32 4
+#define R_386_COPY 5
+#define R_X86_64_COPY 5
+#define R_386_GLOB_DAT 6
+#define R_X86_64_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_X86_64_JUMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_X86_64_RELATIVE 8
+#define R_386_GOTOFF 9
+#define R_X86_64_GOTPCREL 9
+#define R_386_GOTPC 10
+#define R_X86_64_32 10
+#define R_X86_64_32S 11
+#define R_X86_64_16 12
+#define R_X86_64_PC16 13
+#define R_X86_64_8 14
+#define R_X86_64_PC8 15
+#define R_X86_64_DTPMOD64 16
+#define R_X86_64_DTPOFF64 17
+#define R_X86_64_TPOFF64 18
+#define R_X86_64_TLSGD 19
+#define R_X86_64_TLSLD 20
+#define R_X86_64_DTPOFF32 21
+#define R_X86_64_GOTTPOFF 22
+#define R_X86_64_TPOFF32 23
+#define R_X86_64_PC64 24
+#define R_X86_64_GOTOFF64 25
+#define R_X86_64_GOTPC32 26
+#define R_X86_64_GOT64 27
+#define R_X86_64_GOTPCREL64 28
+#define R_X86_64_GOTPC64 29
+#define R_X86_64_GOTPLT64 30
+#define R_X86_64_PLTOFF64 31
+#define R_X86_64_GOTPC32_TLSDESC 34
+#define R_X86_64_TLSDESC_CALL 35
+#define R_X86_64_TLSDESC 36
+#define R_X86_64_IRELATIVE 37
+#define R_X86_64_GNU_VTINHERIT 250
+#define R_X86_64_GNU_VTENTRY 251
+
+// Segment types
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_TLS 7
+#define PT_LOOS 0x60000000
+#define PT_HIOS 0x6fffffff
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7FFFFFFF
+
+// Segment flags
+#define PF_X 1 // Execute
+#define PF_W 2 // Write
+#define PF_R 4 // Read
+#define PF_MASKOS 0x0ff00000 // Unspecified
+#define PF_MASKPROC 0xf0000000 // Unspecified
+
+// Dynamic Array Tags
+#define DT_NULL 0
+#define DT_NEEDED 1
+#define DT_PLTRELSZ 2
+#define DT_PLTGOT 3
+#define DT_HASH 4
+#define DT_STRTAB 5
+#define DT_SYMTAB 6
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+#define DT_STRSZ 10
+#define DT_SYMENT 11
+#define DT_INIT 12
+#define DT_FINI 13
+#define DT_SONAME 14
+#define DT_RPATH 15
+#define DT_SYMBOLIC 16
+#define DT_REL 17
+#define DT_RELSZ 18
+#define DT_RELENT 19
+#define DT_PLTREL 20
+#define DT_DEBUG 21
+#define DT_TEXTREL 22
+#define DT_JMPREL 23
+#define DT_BIND_NOW 24
+#define DT_INIT_ARRAY 25
+#define DT_FINI_ARRAY 26
+#define DT_INIT_ARRAYSZ 27
+#define DT_FINI_ARRAYSZ 28
+#define DT_RUNPATH 29
+#define DT_FLAGS 30
+#define DT_ENCODING 32
+#define DT_PREINIT_ARRAY 32
+#define DT_PREINIT_ARRAYSZ 33
+#define DT_LOOS 0x6000000D
+#define DT_HIOS 0x6ffff000
+#define DT_LOPROC 0x70000000
+#define DT_HIPROC 0x7FFFFFFF
+
+// DT_FLAGS values
+#define DF_ORIGIN 0x1
+#define DF_SYMBOLIC 0x2
+#define DF_TEXTREL 0x4
+#define DF_BIND_NOW 0x8
+#define DF_STATIC_TLS 0x10
+
+
diff --git a/src/java/jogamp/common/os/elf/Ehdr.java b/src/java/jogamp/common/os/elf/Ehdr.java
new file mode 100644
index 0000000..d787f67
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/Ehdr.java
@@ -0,0 +1,179 @@
+/* !---- 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 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+ 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 */ };
+
+ 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();
+ }
+
+ public Ehdr setE_ident(byte[] val) {
+ accessor.setBytesAt(e_ident_offset[mdIdx], val); return this;
+ }
+
+ public byte[] getE_ident() {
+ return accessor.getBytesAt(e_ident_offset[mdIdx], new byte[16]); }
+
+ public Ehdr setE_type(short val) {
+ accessor.setShortAt(e_type_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_type() {
+ return accessor.getShortAt(e_type_offset[mdIdx]);
+ }
+
+ public Ehdr setE_machine(short val) {
+ accessor.setShortAt(e_machine_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_machine() {
+ return accessor.getShortAt(e_machine_offset[mdIdx]);
+ }
+
+ public Ehdr setE_version(int val) {
+ accessor.setIntAt(e_version_offset[mdIdx], val);
+ return this;
+ }
+
+ public int getE_version() {
+ return accessor.getIntAt(e_version_offset[mdIdx]);
+ }
+
+ public Ehdr setE_entry(long val) {
+ accessor.setLongAt(e_entry_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getE_entry() {
+ return accessor.getLongAt(e_entry_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Ehdr setE_phoff(long val) {
+ accessor.setLongAt(e_phoff_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getE_phoff() {
+ return accessor.getLongAt(e_phoff_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Ehdr setE_shoff(long val) {
+ accessor.setLongAt(e_shoff_offset[mdIdx], val, MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ return this;
+ }
+
+ public long getE_shoff() {
+ return accessor.getLongAt(e_shoff_offset[mdIdx], MachineDescriptionRuntime.getStatic().md.longSizeInBytes());
+ }
+
+ public Ehdr setE_flags(int val) {
+ accessor.setIntAt(e_flags_offset[mdIdx], val);
+ return this;
+ }
+
+ public int getE_flags() {
+ return accessor.getIntAt(e_flags_offset[mdIdx]);
+ }
+
+ public Ehdr setE_ehsize(short val) {
+ accessor.setShortAt(e_ehsize_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_ehsize() {
+ return accessor.getShortAt(e_ehsize_offset[mdIdx]);
+ }
+
+ public Ehdr setE_phentsize(short val) {
+ accessor.setShortAt(e_phentsize_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_phentsize() {
+ return accessor.getShortAt(e_phentsize_offset[mdIdx]);
+ }
+
+ public Ehdr setE_phnum(short val) {
+ accessor.setShortAt(e_phnum_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_phnum() {
+ return accessor.getShortAt(e_phnum_offset[mdIdx]);
+ }
+
+ public Ehdr setE_shentsize(short val) {
+ accessor.setShortAt(e_shentsize_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_shentsize() {
+ return accessor.getShortAt(e_shentsize_offset[mdIdx]);
+ }
+
+ public Ehdr setE_shnum(short val) {
+ accessor.setShortAt(e_shnum_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_shnum() {
+ return accessor.getShortAt(e_shnum_offset[mdIdx]);
+ }
+
+ public Ehdr setE_shstrndx(short val) {
+ accessor.setShortAt(e_shstrndx_offset[mdIdx], val);
+ return this;
+ }
+
+ public short getE_shstrndx() {
+ return accessor.getShortAt(e_shstrndx_offset[mdIdx]);
+ }
+}
diff --git a/src/java/jogamp/common/os/elf/ElfHeader.java b/src/java/jogamp/common/os/elf/ElfHeader.java
new file mode 100644
index 0000000..85bdcf0
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/ElfHeader.java
@@ -0,0 +1,574 @@
+/**
+ * Copyright 2013 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.common.os.elf;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import static jogamp.common.os.elf.IOUtils.readBytes;
+import static jogamp.common.os.elf.IOUtils.seek;
+import static jogamp.common.os.elf.IOUtils.shortToInt;
+
+/**
+ * ELF ABI Header
+ *
+ * References:
+ *
+ * - http://linux.die.net/man/5/elf
+ * - http://www.sco.com/developers/gabi/latest/contents.html
+ * - http://infocenter.arm.com/
+ *
+ * - ARM IHI 0044E, current through ABI release 2.09
+ *
+ *
+ *
+ */
+public class ElfHeader {
+ /** Size of e_ident array - {@value} */
+ public static int EI_NIDENT = 16;
+
+ /** ident byte #0 - {@value} */
+ public static final byte ELFMAG0 = 0x7f;
+ /** ident byte #1 - {@value} */
+ public static final byte ELFMAG1 = 'E';
+ /** ident byte #2 - {@value} */
+ public static final byte ELFMAG2 = 'L';
+ /** ident byte #3 - {@value} */
+ public static final byte ELFMAG3 = 'F';
+
+ /** ident byte #4 */
+ public static final int EI_CLASS = 4;
+ public static final byte ELFCLASSNONE = 0;
+ public static final byte ELFCLASS32 = 1;
+ public static final byte ELFCLASS64 = 2;
+
+ /** ident byte #5 */
+ public static final int EI_DATA = 5;
+ public static final byte ELFDATANONE = 0;
+ public static final byte ELFDATA2LSB = 1;
+ public static final byte ELFDATA2MSB = 2;
+
+ /** ident byte #6 */
+ public static final int EI_VERSION = 6;
+ public static final byte EV_NONE = 0;
+ public static final byte EV_CURRENT = 1;
+
+ /** ident byte #7 */
+ public static final int EI_OSABI = 7;
+ /** Unix System V ABI - {@value} */
+ public static final byte ELFOSABI_SYSV = 0;
+ public static final byte ELFOSABI_NONE = ELFOSABI_SYSV;
+ /** HP-UX ABI - {@value} */
+ public static final byte ELFOSABI_HPUX = 1;
+ /** NetBSD ABI - {@value} **/
+ public static final byte ELFOSABI_NETBSD = 2;
+ /** Linux ABI - {@value} **/
+ public static final byte ELFOSABI_LINUX = 3;
+ /** Solaris ABI - {@value} **/
+ public static final byte ELFOSABI_SOLARIS = 6;
+ /** IRIX ABI - {@value} **/
+ public static final byte ELFOSABI_IRIX = 7;
+ /** FreeBSD ABI - {@value} **/
+ public static final byte ELFOSABI_FREEBSD = 8;
+ /** ARM architecture ABI - {@value} **/
+ public static final byte ELFOSABI_ARM = 8; // FIXME
+ /** Stand-alone (embedded) ABI - {@value} **/
+ public static final byte ELFOSABI_STANDALONE = 9; // FIXME
+ /** TRU64 UNIX ABI - {@value} **/
+ public static final byte ELFOSABI_TRU64 = 10;
+ /** Novell Modesto ABI - {@value} **/
+ public static final byte ELFOSABI_MODESTO = 11;
+ /** Open BSD ABI - {@value} **/
+ public static final byte ELFOSABI_OPENBSD = 12;
+ /** Open VMS ABI - {@value} **/
+ public static final byte ELFOSABI_OPENVMS = 13;
+ /** Hewlett-Packard Non-Stop Kernel ABI - {@value} **/
+ public static final byte ELFOSABI_NSK = 14;
+ /** Amiga Research OS ABI - {@value} **/
+ public static final byte ELFOSABI_AROS = 15;
+ /** The FenixOS highly scalable multi-core OS 64-255 Architecture-specific value range - {@value} */
+ public static final byte ELFOSABI_FENIXOS = 16;
+
+ /** ident byte #8
+ *
+ * This byte identifies the version of the ABI to which the object is targeted.
+ * This field is used to distinguish among incompatible versions of an ABI.
+ * The interpretation of this version number is dependent on the ABI identified by the EI_OSABI field.
+ * Applications conforming to this specification use the value 0.
+ *
+ */
+ public static final int EI_ABIVERSION = 8;
+
+ /**
+ * ident byte #9 .. ?
+ *
+ * Start of padding.
+ * These bytes are reserved and set to zero.
+ * Programs which read them should ignore them.
+ * The value for EI_PAD will change in the future if currently unused bytes are given meanings.
+ *
+ */
+ public static final int EI_PAD = 9;
+
+ /**
+ * This masks an 8-bit version number, the version of the ABI to which this
+ * ELF file conforms. This ABI is version 5. A value of 0 denotes unknown conformance.
+ * {@value}
+ */
+ public static final int EF_ARM_ABIMASK = 0xFF000000;
+ public static final int EF_ARM_ABISHIFT = 24;
+
+ /**
+ * ARM ABI version 5.
+ * {@value}
+ */
+ public static final int EF_ARM_ABI5 = 0x05000000;
+
+ /**
+ * The ELF file contains BE-8 code, suitable for execution on an ARM
+ * Architecture v6 processor. This flag must only be set on an executable file.
+ * {@value}
+ */
+ public static final int EF_ARM_BE8 = 0x00800000;
+
+ /**
+ * Legacy code (ABI version 4 and earlier) generated by gcc-arm-xxx might
+ * use these bits.
+ * {@value}
+ */
+ public static final int EF_ARM_GCCMASK = 0x00400FFF;
+
+ /**
+ * Set in executable file headers (e_type = ET_EXEC or ET_DYN) to note that
+ * the executable file was built to conform to the hardware floating-point
+ * procedure-call standard.
+ *
+ * Compatible with legacy (pre version 5) gcc use as EF_ARM_VFP_FLOAT.
+ *
+ *
+ * Note: This is not used (anymore)
+ *
+ * {@value}
+ */
+ public static final int EF_ARM_ABI_FLOAT_HARD = 0x00000400;
+
+ /**
+ * Set in executable file headers (e_type = ET_EXEC or ET_DYN) to note
+ * explicitly that the executable file was built to conform to the software
+ * floating-point procedure-call standard (the base standard). If both
+ * {@link #EF_ARM_ABI_FLOAT_HARD} and {@link #EF_ARM_ABI_FLOAT_SOFT} are clear,
+ * conformance to the base procedure-call standard is implied.
+ *
+ * Compatible with legacy (pre version 5) gcc use as EF_ARM_SOFT_FLOAT.
+ *
+ *
+ * Note: This is not used (anymore)
+ *
+ * {@value}
+ */
+ public static final int EF_ARM_ABI_FLOAT_SOFT = 0x00000200;
+
+ /** An unknown type - {@value} */
+ public static final short ET_NONE = 0;
+ /** A relocatable file - {@value} */
+ public static final short ET_REL = 1;
+ /** An executable file - {@value} */
+ public static final short ET_EXEC = 2;
+ /** A shared object - {@value} */
+ public static final short ET_DYN = 3;
+ /** A core file - {@value} */
+ public static final short ET_CORE = 4;
+
+ public static final short EM_NONE = 0;
+ public static final short EM_M32 = 1;
+ public static final short EM_SPARC = 2;
+ public static final short EM_386 = 3;
+ public static final short EM_68K = 4;
+ public static final short EM_88K = 5;
+ public static final short EM_486 = 6;
+ public static final short EM_860 = 7;
+ public static final short EM_MIPS = 8;
+ public static final short EM_S370 = 9;
+ public static final short EM_MIPS_RS3_LE = 10;
+ public static final short EM_PARISC = 15;
+ public static final short EM_res016 = 16;
+ public static final short EM_VPP550 = 17;
+ public static final short EM_SPARC32PLUS = 18;
+ public static final short EM_960 = 19;
+ public static final short EM_PPC = 20;
+ public static final short EM_PPC64 = 21;
+ public static final short EM_S390 = 22;
+ public static final short EM_SPU = 23;
+ public static final short EM_V800 = 36;
+ public static final short EM_FR20 = 37;
+ public static final short EM_RH32 = 38;
+ public static final short EM_MCORE = 39;
+ public static final short EM_RCE = 39;
+ public static final short EM_ARM = 40;
+ public static final short EM_OLD_ALPHA = 41;
+ public static final short EM_SH = 42;
+ public static final short EM_SPARCV9 = 43;
+ public static final short EM_TRICORE = 44;
+ public static final short EM_ARC = 45;
+ public static final short EM_H8_300 = 46;
+ public static final short EM_H8_300H = 47;
+ public static final short EM_H8S = 48;
+ public static final short EM_H8_500 = 49;
+ public static final short EM_IA_64 = 50;
+ public static final short EM_MIPS_X = 51;
+ public static final short EM_COLDFIRE = 52;
+ public static final short EM_68HC12 = 53;
+ public static final short EM_MMA = 54;
+ public static final short EM_PCP = 55;
+ public static final short EM_NCPU = 56;
+ public static final short EM_NDR1 = 57;
+ public static final short EM_STARCORE = 58;
+ public static final short EM_ME16 = 59;
+ public static final short EM_ST100 = 60;
+ public static final short EM_TINYJ = 61;
+ public static final short EM_X86_64 = 62;
+ public static final short EM_PDSP = 63;
+ public static final short EM_PDP10 = 64;
+ public static final short EM_PDP11 = 65;
+ public static final short EM_FX66 = 66;
+ public static final short EM_ST9PLUS = 67;
+ public static final short EM_ST7 = 68;
+ public static final short EM_68HC16 = 69;
+ public static final short EM_68HC11 = 70;
+ public static final short EM_68HC08 = 71;
+ public static final short EM_68HC05 = 72;
+ public static final short EM_SVX = 73;
+ public static final short EM_ST19 = 74;
+ public static final short EM_VAX = 75;
+ public static final short EM_CRIS = 76;
+ public static final short EM_JAVELIN = 77;
+ public static final short EM_FIREPATH = 78;
+ public static final short EM_ZSP = 79;
+ public static final short EM_MMIX = 80;
+ public static final short EM_HUANY = 81;
+ public static final short EM_PRISM = 82;
+ public static final short EM_AVR = 83;
+ public static final short EM_FR30 = 84;
+ public static final short EM_D10V = 85;
+ public static final short EM_D30V = 86;
+ public static final short EM_V850 = 87;
+ public static final short EM_M32R = 88;
+ public static final short EM_MN10300 = 89;
+ public static final short EM_MN10200 = 90;
+ public static final short EM_PJ = 91;
+ public static final short EM_OPENRISC = 92;
+ public static final short EM_ARC_A5 = 93;
+ public static final short EM_XTENSA = 94;
+ public static final short EM_VIDEOCORE = 95;
+ public static final short EM_TMM_GPP = 96;
+ public static final short EM_NS32K = 97;
+ public static final short EM_TPC = 98;
+ public static final short EM_SNP1K = 99;
+ public static final short EM_ST200 = 100;
+ public static final short EM_IP2K = 101;
+ public static final short EM_MAX = 102;
+ public static final short EM_CR = 103;
+ public static final short EM_F2MC16 = 104;
+ public static final short EM_MSP430 = 105;
+ public static final short EM_BLACKFIN = 106;
+ public static final short EM_SE_C33 = 107;
+ public static final short EM_SEP = 108;
+ public static final short EM_ARCA = 109;
+ public static final short EM_UNICORE = 110;
+ public static final short EM_EXCESS = 111;
+ public static final short EM_DXP = 112;
+ public static final short EM_ALTERA_NIOS2 = 113;
+ public static final short EM_CRX = 114;
+ public static final short EM_XGATE = 115;
+ public static final short EM_C166 = 116;
+ public static final short EM_M16C = 117;
+ public static final short EM_DSPIC30F = 118;
+ public static final short EM_CE = 119;
+ public static final short EM_M32C = 120;
+ public static final short EM_TSK3000 = 131;
+ public static final short EM_RS08 = 132;
+ public static final short EM_res133 = 133;
+ public static final short EM_ECOG2 = 134;
+ public static final short EM_SCORE = 135;
+ public static final short EM_SCORE7 = 135;
+ public static final short EM_DSP24 = 136;
+ public static final short EM_VIDEOCORE3 = 137;
+ public static final short EM_LATTICEMICO32 = 138;
+ public static final short EM_SE_C17 = 139;
+ public static final short EM_TI_C6000 = 140;
+ public static final short EM_TI_C2000 = 141;
+ public static final short EM_TI_C5500 = 142;
+ public static final short EM_MMDSP_PLUS = 160;
+ public static final short EM_CYPRESS_M8C = 161;
+ public static final short EM_R32C = 162;
+ public static final short EM_TRIMEDIA = 163;
+ public static final short EM_QDSP6 = 164;
+ public static final short EM_8051 = 165;
+ public static final short EM_STXP7X = 166;
+ public static final short EM_NDS32 = 167;
+ public static final short EM_ECOG1 = 168;
+ public static final short EM_ECOG1X = 168;
+ public static final short EM_MAXQ30 = 169;
+ public static final short EM_XIMO16 = 170;
+ public static final short EM_MANIK = 171;
+ public static final short EM_CRAYNV2 = 172;
+ public static final short EM_RX = 173;
+ public static final short EM_METAG = 174;
+ public static final short EM_MCST_ELBRUS = 175;
+ public static final short EM_ECOG16 = 176;
+ public static final short EM_CR16 = 177;
+ public static final short EM_ETPU = 178;
+ public static final short EM_SLE9X = 179;
+ public static final short EM_L1OM = 180;
+ public static final short EM_INTEL181 = 181;
+ public static final short EM_INTEL182 = 182;
+ public static final short EM_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; i= num ) {
+ throw new IllegalArgumentException("EHdr sh_num == 0 and 1st SHdr size == 0");
+ }
+ sht = new SectionHeader[num];
+ sht[0] = sh0;
+ i=1;
+ } else {
+ num = d.getE_shnum();
+ sht = new SectionHeader[num];
+ i=0;
+ }
+ for(; i int32-max "+toHexString(MAX_INT_VALUE));
+ }
+ return (int)v;
+ }
+
+ static void checkBounds(final byte[] sb, final int offset, final int remaining) {
+ if( offset + remaining > sb.length ) {
+ throw new IndexOutOfBoundsException("Buffer of size "+sb.length+" cannot hold offset "+offset+" + remaining "+remaining);
+ }
+ }
+
+ static void readBytes(final RandomAccessFile in, final byte[] out, final int offset, final int len)
+ throws IOException, IllegalArgumentException
+ {
+ in.readFully(out, offset, len);
+ }
+
+ static void seek(final RandomAccessFile in, long newPos) throws IOException {
+ in.seek(newPos);
+ }
+
+ static int readUInt32(final byte[] in, final int offset) {
+ final int v = readInt32(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); */
+ }
+
+ static int readInt32(final byte[] in, final int offset) {
+ checkBounds(in, offset, 4);
+ final ByteBuffer b = ByteBuffer.wrap(in, offset, 4).order(ByteOrder.nativeOrder());
+ return b.asIntBuffer().get(0);
+ }
+
+ /**
+ * @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
.
+ * @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:
+ *
+ * - http://infocenter.arm.com/
+ *
+ * - ARM IHI 0044E, current through ABI release 2.09
+ * - ARM IHI 0045D, current through ABI release 2.09
+ *
+ *
+ *
+ */
+public class SectionArmAttributes extends Section {
+ public static final byte FORMAT_VERSION_A = 0x41; // 'A';
+
+ public static enum Type {
+ /** No Value */
+ None,
+ /** A Sub-Section - following the 4 byte sub section total size (tag + size + content) - byte order of the ELF file */
+ SubSection,
+ /** Null Terminated Byte-String */
+ NTBS,
+ ULEB128,
+ }
+
+ /** ULEB128 Value for {@link Tag#ABI_VFP_args}: FP parameter/result passing conforms to AAPCS, BASE variant. */
+ public static final byte ABI_VFP_ARGS_IS_BASE_VARIANT = 0;
+ /** ULEB128 Value for {@link Tag#ABI_VFP_args}: FP parameter/result passing conforms to AAPCS, VFP variant. */
+ public static final byte ABI_VFP_ARGS_IS_VFP_VARIANT = 1;
+ /** ULEB128 Value for {@link Tag#ABI_VFP_args}: FP parameter/result passing conforms to custom toolchain. */
+ public static final byte ABI_VFP_ARGS_IS_CUSTOM_VARIANT = 2;
+ /** ULEB128 Value for {@link Tag#ABI_VFP_args}: FP parameter/result passing conforms to both , BASE and VFP variant. */
+ public static final byte ABI_VFP_ARGS_IS_BOTH_BASE_AND_VFP_VARIANT = 3;
+
+ /**
+ * Returns true if value is either {@link #ABI_VFP_ARGS_IS_VFP_VARIANT} or {@link #ABI_VFP_ARGS_IS_BOTH_BASE_AND_VFP_VARIANT}
+ * @param v ULEB128 Value from {@link Tag#ABI_VFP_args} attribute
+ */
+ public static final boolean abiVFPArgsAcceptsVFPVariant(byte v) {
+ return ABI_VFP_ARGS_IS_VFP_VARIANT == v || ABI_VFP_ARGS_IS_BOTH_BASE_AND_VFP_VARIANT == v;
+ }
+
+ public static enum Tag {
+ None(0, Type.None),
+ File(1, Type.SubSection), Section(2, Type.SubSection), Symbol(3, Type.SubSection),
+ CPU_raw_name( 4, Type.NTBS ),
+ CPU_name( 5, Type.NTBS ),
+ CPU_arch( 6, Type.ULEB128 ),
+ CPU_arch_profile( 7, Type.ULEB128 ),
+ ARM_ISA_use( 8, Type.ULEB128 ),
+ THUMB_ISA_use( 9, Type.ULEB128 ),
+ FP_arch( 10, Type.ULEB128 ),
+ WMMX_arch( 11, Type.ULEB128 ),
+ Advanced_SIMD_arch( 12, Type.ULEB128 ),
+ PCS_config( 13, Type.ULEB128 ),
+ ABI_PCS_R9_use ( 14, Type.ULEB128 ),
+ ABI_PCS_RW_data( 15, Type.ULEB128 ),
+ ABI_PCS_RO_data( 16, Type.ULEB128 ),
+ ABI_PCS_GOT_use( 17, Type.ULEB128 ),
+ ABI_PCS_wchar_t( 18, Type.ULEB128 ),
+ ABI_FP_rounding( 19, Type.ULEB128 ),
+ ABI_FP_denormal( 20, Type.ULEB128 ),
+ ABI_FP_exceptions( 21, Type.ULEB128 ),
+ ABI_FP_user_exceptions( 22, Type.ULEB128 ),
+ ABI_FP_number_model( 23, Type.ULEB128 ),
+ ABI_align_needed( 24, Type.ULEB128 ),
+ ABI_align_preserved( 25, Type.ULEB128 ),
+ ABI_enum_size( 26, Type.ULEB128 ),
+ ABI_HardFP_use( 27, Type.ULEB128 ),
+ ABI_VFP_args( 28, Type.ULEB128 ),
+ ABI_WMMX_args( 29, Type.ULEB128 ),
+ ABI_optimization_goals( 30, Type.ULEB128 ),
+ ABI_FP_optimization_goals( 31, Type.ULEB128 ),
+ compatibility ( 32, Type.NTBS ), /** with each byte interpreted as an ULEB128 with closing EOS */
+ CPU_unaligned_access( 34, Type.ULEB128 ),
+ FP_HP_extension( 36, Type.ULEB128 ),
+ ABI_FP_16bit_format( 38, Type.ULEB128 ),
+ MPextension_use( 42, Type.ULEB128 ),
+ DIV_use( 44, Type.ULEB128 ),
+ nodefaults( 64, Type.ULEB128 ), /* value ignored */
+ also_compatible_with( 65, Type.ULEB128 ),
+ T2EE_use( 66, Type.ULEB128 ),
+ conformance( 67, Type.NTBS ),
+ Virtualization_use( 68, Type.ULEB128 ),
+ undefined69( 69, Type.None ),
+ MPextension_use_legacy( 70, Type.ULEB128 )
+ ;
+
+ public final int id;
+ public final Type type;
+
+ /** Slow O(n) transition of a native tag value to a Tag. */
+ public static Tag get(final int id) {
+ final Tag[] tags = Tag.values();
+ final int tag_count = tags.length;
+ for(int i=0; i < tag_count; i++) {
+ if( tags[i].id == id ) {
+ return tags[i];
+ }
+ }
+ return null;
+ }
+
+ Tag(int id, Type type){
+ this.id = id;
+ this.type = type;
+ }
+ }
+
+ public static class Attribute {
+ public final Tag tag;
+ private final Object value;
+
+ Attribute(Tag tag, Object value) {
+ this.tag = tag;
+ this.value = value;
+ }
+
+ public final boolean isNTBS() {
+ return Type.NTBS == tag.type;
+ }
+ public final String getNTBS() {
+ if( Type.NTBS == tag.type ) {
+ return (String) value;
+ }
+ throw new IllegalArgumentException("Not NTBS but "+tag.type);
+ }
+
+ public final boolean isULEB128() {
+ return Type.ULEB128 == tag.type;
+ }
+ public final byte getULEB128() {
+ if( Type.ULEB128== tag.type ) {
+ return ((Byte) value).byteValue();
+ }
+ throw new IllegalArgumentException("Not ULEB128 but "+tag.type);
+ }
+
+ public String toString() {
+ return tag+" = "+value;
+ }
+ }
+
+ public static class VendorAttributes {
+ public final String vendor;
+ public final List attributes;
+
+ VendorAttributes(String vendor, List attributes) {
+ this.vendor = vendor;
+ this.attributes = attributes;
+ }
+
+ public String toString() {
+ return vendor + attributes.toString();
+ }
+ }
+ public final List vendorAttributesList;
+
+ SectionArmAttributes(SectionHeader sh, byte[] data, int offset, int length) throws IndexOutOfBoundsException, IllegalArgumentException {
+ super(sh, data, offset, length);
+ this.vendorAttributesList = parse(data, offset, length);
+ }
+
+ public String toString() {
+ return "SectionArmAttributes["+super.toSubString()+", "+vendorAttributesList.toString()+"]";
+ }
+
+ public final Attribute get(Tag tag) {
+ for(int i=0; i attributes = vendorAttributesList.get(i).attributes;
+ for(int j=0; j get(String vendor) {
+ return get(vendorAttributesList, vendor);
+ }
+
+ static final List get(final List vendorAttributesList, String vendor) {
+ for(int i=0; isb_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 List parse(final byte[] in, final int offset, final int remaining) throws IndexOutOfBoundsException, IllegalArgumentException {
+ checkBounds(in, offset, remaining);
+ int i = offset;
+ if( FORMAT_VERSION_A != in[ i ] ) {
+ throw new IllegalArgumentException("ShArmAttr: Not version A, but: "+toHexString(in[i]));
+ }
+ i++;
+
+ final List vendorAttributesList = new ArrayList();
+
+ 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 */
+ i+=4;
+
+ final String vendor;
+ {
+ int[] i_post = new int[] { 0 };
+ vendor = getString(in, i, secLen - 4, i_post);
+ i = i_post[0];
+ }
+
+ final List attributes = new ArrayList();
+
+ while(i < secLen) {
+ int[] i_post = new int[] { 0 };
+ parseSub(in, i, secLen - i, i_post, attributes);
+ i = i_post[0];
+ }
+
+ if( i_pre + secLen != i ) {
+ throw new IllegalArgumentException("ShArmAttr: Section length count mismatch, expected "+(i_pre + secLen)+", has "+i);
+ }
+
+ final List mergeAttribs = get(vendorAttributesList, vendor);
+ if( null != mergeAttribs ) {
+ mergeAttribs.addAll(attributes);
+ } else {
+ vendorAttributesList.add(new VendorAttributes(vendor, attributes));
+ }
+ }
+
+ return vendorAttributesList;
+ }
+
+ /**
+ * @param in byte source buffer to parse
+ * @param offset offset within byte source buffer to start parsing
+ * @param remaining remaining numbers of bytes to parse beginning w/ sb_off
,
+ * 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 attributes) throws IndexOutOfBoundsException, IllegalArgumentException {
+ checkBounds(in, offset, remaining);
+
+ // Starts w/ sub-section Tag
+ int i = offset;
+ final int i_sTag = in[i++];
+ final Tag sTag = Tag.get(i_sTag);
+ if( null == sTag ) {
+ throw new IllegalArgumentException("ShArmAttr: Invalid Sub-Section tag (NaT): "+i_sTag);
+ }
+ final int subSecLen; // sub section total size (tag + size + content)
+ switch(sTag) {
+ case File:
+ case Section:
+ case Symbol:
+ subSecLen = readUInt32(in, i);
+ i+=4;
+ break;
+ default:
+ throw new IllegalArgumentException("ShArmAttr: Invalid Sub-Section tag: "+sTag);
+ }
+ if( Tag.File == sTag ) {
+ while( i < offset + subSecLen ) {
+ final int i_tag = in[i++];
+ final Tag tag = Tag.get(i_tag);
+ if( null == tag ) {
+ throw new IllegalArgumentException("ShArmAttr: Invalid Attribute tag (NaT): "+i_tag);
+ }
+ switch(tag.type) {
+ case NTBS:
+ {
+ int[] i_post = new int[] { 0 };
+ final String value = getString(in, i, subSecLen + offset - i, i_post);
+ attributes.add(new Attribute(tag, value));
+ i = i_post[0];
+ }
+ break;
+ case ULEB128:
+ {
+ final byte value = in[i++];
+ attributes.add(new Attribute(tag, new Byte(value)));
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("ShArmAttr: Invalid Attribute tag: "+tag);
+ }
+ }
+ }
+ offset_post[0] = offset + subSecLen;
+ }
+}
diff --git a/src/java/jogamp/common/os/elf/SectionHeader.java b/src/java/jogamp/common/os/elf/SectionHeader.java
new file mode 100644
index 0000000..18a3293
--- /dev/null
+++ b/src/java/jogamp/common/os/elf/SectionHeader.java
@@ -0,0 +1,274 @@
+/**
+ * Copyright 2013 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.common.os.elf;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import static jogamp.common.os.elf.IOUtils.long2Int;
+import static jogamp.common.os.elf.IOUtils.readBytes;
+import static jogamp.common.os.elf.IOUtils.seek;
+import static jogamp.common.os.elf.IOUtils.getString;
+import static jogamp.common.os.elf.IOUtils.toHexString;
+
+/**
+ * ELF ABI Section Header
+ *
+ * References:
+ *
+ * - http://linux.die.net/man/5/elf
+ * - http://www.sco.com/developers/gabi/latest/contents.html
+ * - http://infocenter.arm.com/
+ *
+ * - ARM IHI 0044E, current through ABI release 2.09
+ *
+ *
+ *
+ */
+public class SectionHeader {
+ /**
+ * {@value}
+ */
+ public static final int SHT_NULL = 0;
+ /**
+ * {@value}
+ */
+ public static final int SHT_PROGBITS = 1;
+ /**
+ * {@value}
+ */
+ public static final int SHT_SYMTAB = 2;
+ /**
+ * {@value}
+ */
+ public static final int SHT_STRTAB = 3;
+ /**
+ * {@value}
+ */
+ public static final int SHT_RELA = 4;
+ /**
+ * {@value}
+ */
+ public static final int SHT_HASH = 5;
+ /**
+ * {@value}
+ */
+ public static final int SHT_DYNAMIC = 6;
+ /**
+ * {@value}
+ */
+ public static final int SHT_NOTE = 7;
+ /**
+ * {@value}
+ */
+ public static final int SHT_NOBITS = 8;
+ /**
+ * {@value}
+ */
+ public static final int SHT_REL = 9;
+ /**
+ * {@value}
+ */
+ public static final int SHT_SHLIB = 10;
+ /**
+ * {@value}
+ */
+ public static final int SHT_DYNSYM = 11;
+ /**
+ * {@value}
+ */
+ public static final int SHT_NUM = 12;
+ /**
+ * {@value}
+ */
+ public static final int SHT_LOPROC = 0x70000000;
+ /**
+ * {@value}
+ */
+ public static final int SHT_HIPROC = 0x7fffffff;
+ /**
+ * {@value}
+ */
+ public static final int SHT_LOUSER = 0x80000000;
+ /**
+ * {@value}
+ */
+ public static final int SHT_HIUSER = 0xffffffff;
+
+ /**
+ * {@value}
+ */
+ public static final int SHT_ARM_EXIDX = 0x70000001;
+ /**
+ * {@value}
+ */
+ public static final int SHT_ARM_PREEMPTMAP = 0x70000002;
+ /**
+ * {@value}
+ */
+ public static final int SHT_ARM_ATTRIBUTES = 0x70000003;
+ /**
+ * {@value}
+ */
+ public static final int SHT_ARM_DEBUGOVERLAY = 0x70000004;
+ /**
+ * {@value}
+ */
+ public static final int SHT_ARM_OVERLAYSECTION = 0x70000005;
+
+ /**
+ * {@value}
+ */
+ public static final short SHN_UNDEF = (short)0;
+ /**
+ * {@value}
+ */
+ public static final short SHN_LORESERVE = (short)0xff00;
+ /**
+ * {@value}
+ */
+ public static final short SHN_LOPROC = (short)0xff00;
+ /**
+ * {@value}
+ */
+ public static final short SHN_HIPROC = (short)0xff1f;
+ /**
+ * {@value}
+ */
+ public static final short SHN_ABS = (short)0xfff1;
+ /**
+ * {@value}
+ */
+ public static final short SHN_COMMON = (short)0xfff2;
+ /**
+ * {@value}
+ */
+ public static final short SHN_HIRESERVE = (short)0xffff;
+
+ /** Public access to the raw elf section header */
+ public final Shdr d;
+
+ private int idx;
+ private String name;
+
+ SectionHeader(byte[] buf, int offset, int length, int sectionIdx) {
+ this( ByteBuffer.wrap(buf, 0, buf.length), sectionIdx );
+ }
+ SectionHeader(java.nio.ByteBuffer buf, int idx) {
+ d = Shdr.create(buf);
+ this.idx = idx;
+ name = null;
+ }
+
+ public String toString() {
+ return "SectionHeader[idx "+idx+", name "+name+", type "+toHexString(getType())+", link "+d.getSh_link()+", info "+toHexString(d.getSh_info())+", flags "+toHexString(getFlags())+"]";
+ }
+
+ /**
+ * @param strS the {@link SectionHeader#SHT_STRTAB} section containing all strings
+ * @param nameOffset name offset within strS
+ */
+ void initName(final Section strS, final int nameOffset) throws IndexOutOfBoundsException {
+ name = getString(strS.data, strS.offset + nameOffset, strS.length - nameOffset, null);
+ }
+
+ /** Returns the index of this section within the Elf section header table. */
+ public int getIndex() {
+ return idx;
+ }
+
+ /** Returns the type of this section. */
+ public int getType() {
+ return d.getSh_type();
+ }
+
+ /** Returns the flags of this section. */
+ public long getFlags() {
+ return d.getSh_flags();
+ }
+
+ /** Returns the size of this section. */
+ public long getSize() {
+ return d.getSh_size();
+ }
+
+ /** Returns this section name, maybe 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