Skip to content
Snippets Groups Projects
Commit 616c0519 authored by Jeff Wallace's avatar Jeff Wallace
Browse files

Updated datamodel to load libs from system on unix platforms, except for the TSK JNI.

parent 5c179a8f
No related branches found
No related tags found
No related merge requests found
...@@ -42,16 +42,10 @@ ...@@ -42,16 +42,10 @@
<property environment="env"/> <property environment="env"/>
<property name="jni.dylib" location="${basedir}/jni/.libs/libtsk_jni.dylib" /> <property name="jni.dylib" location="${basedir}/jni/.libs/libtsk_jni.dylib" />
<property name="jni.jnilib" value="libtsk_jni.jnilib" /> <property name="jni.jnilib" value="libtsk_jni.jnilib" />
<property name="mac.zlib" location="/usr/lib/libz.dylib"/>
<property name="mac.libewf" location="${env.LIBEWF_HOME}/libewf/.libs/libewf.dylib"/>
<!-- x86_64 --> <!-- x86_64 -->
<copy file="${jni.dylib}" tofile="${x86_64}/mac/${jni.jnilib}"/> <copy file="${jni.dylib}" tofile="${x86_64}/mac/${jni.jnilib}"/>
<copy file="${mac.libewf}" tofile="${x86_64}/mac/libewf.dylib"/>
<copy file="${mac.zlib}" tofile="${x86_64}/mac/zlib.dylib"/>
<!-- amd64 --> <!-- amd64 -->
<copy file="${jni.dylib}" tofile="${amd64}/mac/${jni.jnilib}"/> <copy file="${jni.dylib}" tofile="${amd64}/mac/${jni.jnilib}"/>
<copy file="${mac.libewf}" tofile="${amd64}/mac/libewf.dylib"/>
<copy file="${mac.zlib}" tofile="${amd64}/mac/zlib.dylib"/>
</target> </target>
<!-- Non-OS X --> <!-- Non-OS X -->
...@@ -63,35 +57,18 @@ ...@@ -63,35 +57,18 @@
<target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present"> <target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present">
<property environment="env"/> <property environment="env"/>
<property name="jni.so" location="${basedir}/jni/.libs/libtsk_jni.so" /> <property name="jni.so" location="${basedir}/jni/.libs/libtsk_jni.so" />
<!-- check that this location is correct -->
<property name="linux.zlib" location="/usr/lib/libz.so"/>
<property name="zlib.so" value="zlib.so"/>
<property name="linux.libewf" location="${env.LIBEWF_HOME}/libewf/.libs/libewf.so"/>
<property name="libewf.so" value="libewf.so"/>
<!-- x86_64 --> <!-- x86_64 -->
<copy file="${jni.so}" tofile="${x86_64}/linux/libtsk_jni.so"/> <copy file="${jni.so}" tofile="${x86_64}/linux/libtsk_jni.so"/>
<copy file="${linux.zlib}" tofile="${x86_64}/linux/${zlib.so}"/>
<copy file="${linux.libewf}" tofile="${x86_64}/linux/${libewf.so}"/>
<!-- amd64 --> <!-- amd64 -->
<copy file="${jni.so}" tofile="${amd64}/linux/libtsk_jni.so"/> <copy file="${jni.so}" tofile="${amd64}/linux/libtsk_jni.so"/>
<copy file="${linux.zlib}" tofile="${amd64}/linux/${zlib.so}"/>
<copy file="${linux.libewf}" tofile="${amd64}/linux/${libewf.so}"/>
<!-- x86 --> <!-- x86 -->
<copy file="${jni.so}" tofile="${x86}/linux/libtsk_jni.so"/> <copy file="${jni.so}" tofile="${x86}/linux/libtsk_jni.so"/>
<copy file="${linux.zlib}" tofile="${x86}/linux/${zlib.so}"/>
<copy file="${linux.libewf}" tofile="${x86}/linux/${libewf.so}"/>
<!-- i386 --> <!-- i386 -->
<copy file="${jni.so}" tofile="${i386}/linux/libtsk_jni.so"/> <copy file="${jni.so}" tofile="${i386}/linux/libtsk_jni.so"/>
<copy file="${linux.zlib}" tofile="${i386}/linux/${zlib.so}"/>
<copy file="${linux.libewf}" tofile="${i386}/linux/${libewf.so}"/>
<!-- i586 --> <!-- i586 -->
<copy file="${jni.so}" tofile="${i586}/linux/libtsk_jni.so"/> <copy file="${jni.so}" tofile="${i586}/linux/libtsk_jni.so"/>
<copy file="${linux.zlib}" tofile="${i586}/linux/${zlib.so}"/>
<copy file="${linux.libewf}" tofile="${i586}/linux/${libewf.so}"/>
<!-- i686 --> <!-- i686 -->
<copy file="${jni.so}" tofile="${i686}/linux/libtsk_jni.so"/> <copy file="${jni.so}" tofile="${i686}/linux/libtsk_jni.so"/>
<copy file="${linux.zlib}" tofile="${i686}/linux/${zlib.so}"/>
<copy file="${linux.libewf}" tofile="${i686}/linux/${libewf.so}"/>
</target> </target>
<target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" /> <target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" />
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URL; import java.net.URL;
import java.util.Arrays;
import java.util.List;
/** /**
* Collection of methods to load libraries embedded in the TSK Datamodel Jar file. * Collection of methods to load libraries embedded in the TSK Datamodel Jar file.
...@@ -35,34 +37,113 @@ public class LibraryUtils { ...@@ -35,34 +37,113 @@ public class LibraryUtils {
public static final Lib[] CRT_LIBS = new Lib[] { Lib.MSVCP, Lib.MSVCR }; public static final Lib[] CRT_LIBS = new Lib[] { Lib.MSVCP, Lib.MSVCR };
public static final Lib[] OTHER_LIBS = new Lib[] { Lib.ZLIB, Lib.LIBEWF, Lib.TSK_JNI }; public static final Lib[] OTHER_LIBS = new Lib[] { Lib.ZLIB, Lib.LIBEWF };
/** /**
* The libraries the TSK Datamodel needs. * The libraries the TSK Datamodel needs.
*/ */
public enum Lib { public enum Lib {
MSVCP ("msvcp100"), MSVCP ("msvcp100", ""),
MSVCR ("msvcr100"), MSVCR ("msvcr100", ""),
ZLIB ("zlib"), ZLIB ("zlib", "z"),
LIBEWF ("libewf"), LIBEWF ("libewf", "ewf"),
TSK_JNI ("libtsk_jni"); TSK_JNI ("libtsk_jni", "tsk_jni");
private final String name; private final String name;
private final String unixName;
Lib(String name) { Lib(String name, String unixName) {
this.name = name; this.name = name;
this.unixName = unixName;
} }
public String getLibName() { public String getLibName() {
return this.name; return this.name;
} }
public String getUnixName() {
return this.unixName;
}
} }
/**
* Load all libraries needed for the current platform except the TSK JNI.
*
* @return
*/
public static boolean loadAuxilliaryLibs() {
boolean loaded = true;
if (LibraryUtils.isWindows()) {
try {
// on windows force loading ms crt dependencies first
// in case linker can't find them on some systems
// Note: if shipping with a different CRT version, this will only print a warning
// and try to use linker mechanism to find the correct versions of libs.
// We should update this if we officially switch to a new version of CRT/compiler
for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) {
loaded = LibraryUtils.loadLibFromJar(crt);
if(!loaded) {
System.out.println("SleuthkitJNI: failed to load " + crt.getLibName());
} else {
System.out.println("SleuthkitJNI: loaded " + crt.getLibName());
}
}
} catch (UnsatisfiedLinkError e1) {
System.out.println(e1.toString());
try {
//Try to load from system path.
System.out.println("Can't find CRT libraries, attempting to load from System.loadLibrary");
System.loadLibrary("msvcr100");
System.loadLibrary("msvcp100");
loaded = true;
} catch (UnsatisfiedLinkError e2) {
System.out.println("SleuthkitJNI: error loading CRT libraries, " + e2.toString());
loaded = false;
}
}
for(LibraryUtils.Lib lib : LibraryUtils.getLibs()) {
loaded = LibraryUtils.loadLibFromJar(lib);
if (!loaded) {
System.out.println("SleuthkitJNI: failed to load " + lib.getLibName());
} else {
System.out.println("SleuthkitJNI: loaded " + lib.getLibName());
}
}
} else {
// Unix platform
for (Lib lib : LibraryUtils.getLibs()) {
try {
System.loadLibrary(lib.getUnixName());
System.out.println("SleuthkitJNI: loaded " + lib.getLibName());
} catch (UnsatisfiedLinkError e) {
loaded = false;
System.out.println("SleuthkitJNI: failed to load " + lib.getLibName());
}
}
}
return loaded;
}
/**
* Load the Sleuthkit JNI.
*
* @return
*/
public static boolean loadSleuthkitJNI() {
boolean loaded = LibraryUtils.loadLibFromJar(Lib.TSK_JNI);
if (!loaded) {
System.out.println("SleuthkitJNI: failed to load " + Lib.TSK_JNI.getLibName());
} else {
System.out.println("SleuthkitJNI: loaded " + Lib.TSK_JNI.getLibName());
}
return loaded;
}
/** /**
* Get the name of the current platform. * Get the name of the current platform.
* *
* @return a platform identifier, formatted as "OS_ARCH/OS_NAME" * @return a platform identifier, formatted as "OS_ARCH/OS_NAME"
*/ */
public static String getPlatform() { private static String getPlatform() {
String os = System.getProperty("os.name").toLowerCase(); String os = System.getProperty("os.name").toLowerCase();
if(LibraryUtils.isWindows()) { if(LibraryUtils.isWindows()) {
os = "win"; os = "win";
...@@ -79,7 +160,7 @@ public static String getPlatform() { ...@@ -79,7 +160,7 @@ public static String getPlatform() {
* *
* @return * @return
*/ */
public static boolean isWindows() { private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("windows"); return System.getProperty("os.name").toLowerCase().contains("windows");
} }
...@@ -97,7 +178,7 @@ private static boolean isMac() { ...@@ -97,7 +178,7 @@ private static boolean isMac() {
* *
* @return * @return
*/ */
public static boolean isLinux() { private static boolean isLinux() {
return System.getProperty("os.name").equals("Linux"); return System.getProperty("os.name").equals("Linux");
} }
...@@ -107,7 +188,7 @@ public static boolean isLinux() { ...@@ -107,7 +188,7 @@ public static boolean isLinux() {
* @param library * @param library
* @return * @return
*/ */
public static boolean loadLibrary(Lib library) { private static boolean loadLibFromJar(Lib library) {
StringBuilder path = new StringBuilder(); StringBuilder path = new StringBuilder();
path.append("/NATIVELIBS/"); path.append("/NATIVELIBS/");
path.append(getPlatform()); path.append(getPlatform());
...@@ -159,11 +240,11 @@ public static boolean loadLibrary(Lib library) { ...@@ -159,11 +240,11 @@ public static boolean loadLibrary(Lib library) {
return true; return true;
} }
public static Lib[] getCRTLibs() { private static Lib[] getCRTLibs() {
return CRT_LIBS; return CRT_LIBS;
} }
public static Lib[] getLibs() { private static Lib[] getLibs() {
return OTHER_LIBS; return OTHER_LIBS;
} }
} }
...@@ -118,49 +118,8 @@ public class SleuthkitJNI { ...@@ -118,49 +118,8 @@ public class SleuthkitJNI {
//Linked library loading //Linked library loading
static { static {
boolean loaded = false; LibraryUtils.loadAuxilliaryLibs();
if (LibraryUtils.isWindows()) { LibraryUtils.loadSleuthkitJNI();
try {
// on windows force loading ms crt dependencies first
// in case linker can't find them on some systems
// Note: if shipping with a different CRT version, this will only print a warning
// and try to use linker mechanism to find the correct versions of libs.
// We should update this if we officially switch to a new version of CRT/compiler
for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) {
loaded = LibraryUtils.loadLibrary(crt);
if(!loaded) {
System.out.println("SleuthkitJNI: failed to load " + crt.getLibName());
} else {
System.out.println("SleuthkitJNI: loaded " + crt.getLibName());
}
}
} catch (UnsatisfiedLinkError e1) {
System.out.println(e1.toString());
try {
//Try to load from system path.
System.out.println("Can't find CRT libraries, attempting to load from System.loadLibrary");
System.loadLibrary("msvcr100");
System.loadLibrary("msvcp100");
} catch (UnsatisfiedLinkError e2) {
System.out.println("SleuthkitJNI: error loading CRT libraries, " + e2.toString());
}
}
}
for (LibraryUtils.Lib lib : LibraryUtils.getLibs()) {
try {
loaded = LibraryUtils.loadLibrary(lib);
if(loaded) {
System.out.println("SleuthkitJNI: loaded " + lib);
} else {
System.out.println("SleuthkitJNI: failed to load " + lib);
}
} catch (UnsatisfiedLinkError e) {
System.out.println("SleuthkitJNI: error loading " + lib + "library, " + e.toString());
}
}
} }
public SleuthkitJNI() { public SleuthkitJNI() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment