Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error looking up function 'dwarf_producer_init': /usr/lib/libdwarf.so: undefined symbol: dwarf_producer_init #23

Open
DCNick3 opened this issue Oct 5, 2023 · 2 comments

Comments

@DCNick3
Copy link

DCNick3 commented Oct 5, 2023

When using with ghidra 10.3.3 on arch linux, I get the following error:

Traceback (most recent call last):
  File "/home/dcnick3/Downloads/ghidra2dwarf/ghidra2dwarf.py", line 507, in <module>
    dwarf_producer_init(
  File "/home/dcnick3/Downloads/ghidra2dwarf/ghidra2dwarf.py", line 111, in wrapper
    r = fun(*(args + (err,)))
	at com.sun.jna.Function.<init>(Function.java:252)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:594)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:570)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:556)
	at com.sun.jna.Library$Handler.invoke(Library.java:243)
	at jdk.proxy3/jdk.proxy3.$Proxy74.dwarf_producer_init(Unknown Source)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: Error looking up function 'dwarf_producer_init': /usr/lib/libdwarf.so: undefined symbol: dwarf_producer_init

This seems to happen because of version mismatch of system libdwarf and the one used by the script + the loader preferring the system libdwarf over the one provided in the script.

I was able to work around the issue by renaming the library to libdwardf_vendor.so and updating the library to call loadLibrary with dwardf_vendor

@francesco-scar
Copy link

@DCNick3 can you explain in detail how you worked around the issue? Where is the call to loadLibrary? Thanks

@DCNick3
Copy link
Author

DCNick3 commented Mar 22, 2024

The call is here I believe.

Here's a complete diff I used for my workaround:

diff --git a/lib/fetch_libs_and_build.sh b/lib/fetch_libs_and_build.sh
index d31b5e5..2917ba7 100755
--- a/lib/fetch_libs_and_build.sh
+++ b/lib/fetch_libs_and_build.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 [ ! -f src/main/resources/linux-x86-64/libdwarf.so ] && \
-    curl -o src/main/resources/linux-x86-64/libdwarf.so -L --create-dirs https://github.com/cesena/libdwarf-ghidra2dwarf/releases/download/latest/libdwarf.so
+    curl -o src/main/resources/linux-x86-64/libdwarf_vendor.so -L --create-dirs https://github.com/cesena/libdwarf-ghidra2dwarf/releases/download/latest/libdwarf.so
 
 [ ! -f src/main/resources/win32-x86-64/libdwarf.dll ] && \
     curl -o src/main/resources/win32-x86-64/libdwarf.dll -L --create-dirs https://github.com/cesena/libdwarf-ghidra2dwarf/releases/download/latest/libdwarf.dll
diff --git a/lib/pom.xml b/lib/pom.xml
index b376647..a318e27 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -10,8 +10,8 @@
 	<packaging>jar</packaging>
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<maven.compiler.source>1.7</maven.compiler.source>
-		<maven.compiler.target>1.7</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
 	</properties>
 	<dependencies>
 		<dependency>
diff --git a/lib/src/main/java/libdwarf/LibdwarfLibrary.java b/lib/src/main/java/libdwarf/LibdwarfLibrary.java
index f6eaa90..88372ca 100644
--- a/lib/src/main/java/libdwarf/LibdwarfLibrary.java
+++ b/lib/src/main/java/libdwarf/LibdwarfLibrary.java
@@ -10,7 +10,7 @@ import com.sun.jna.ptr.LongByReference;
 import com.sun.jna.ptr.PointerByReference;
 
 public interface LibdwarfLibrary extends Library {
-	public static final LibdwarfLibrary INSTANCE = (LibdwarfLibrary)Native.loadLibrary(Platform.isWindows() ? "libdwarf" : "dwarf", LibdwarfLibrary.class);
+	public static final LibdwarfLibrary INSTANCE = (LibdwarfLibrary)Native.loadLibrary(Platform.isWindows() ? "libdwarf" : "dwarf_vendor", LibdwarfLibrary.class);
 
 	// functions
 	String dwarf_errmsg(LibdwarfLibrary.Dwarf_Error Dwarf_Error1);

(the change to use of java 1.8 was probably because that's what I have on my system)

Then I re-built the plugin with the fetch_libs_and_build.sh script in the lib subfolder. After this the build plugin will be located at target/libdwarf.jar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants