diff --git a/builtin-adapter/CMakeLists.txt b/builtin-adapter/CMakeLists.txt index d48cd2bb..273d79fe 100644 --- a/builtin-adapter/CMakeLists.txt +++ b/builtin-adapter/CMakeLists.txt @@ -18,6 +18,19 @@ include_directories(${JNI_INCLUDE_DIRS} ${REINDEXER_INCLUDE_DIRS}) target_link_libraries(${TARGET} reindexer_server_library reindexer_server_resources ${REINDEXER_LIBRARIES}) +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(JNI_EXPORTS "${CMAKE_CURRENT_SOURCE_DIR}/jni.exports") + set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS + " -Wl,--version-script=\"${JNI_EXPORTS}\" -Wl,--gc-sections") + set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS "${JNI_EXPORTS}") + + # Keep the regular symbol table for native backtraces, but omit DWARF data. + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND "${CMAKE_STRIP}" --strip-debug "$" + VERBATIM + ) +endif() + # Workaround for macOS to propagate a correct OpenSSL lib path to Reindexer. if(APPLE) find_package(OpenSSL) diff --git a/builtin-adapter/jni.exports b/builtin-adapter/jni.exports new file mode 100644 index 00000000..091a3a89 --- /dev/null +++ b/builtin-adapter/jni.exports @@ -0,0 +1,7 @@ +{ + global: + Java_ru_rt_restream_reindexer_binding_builtin_BuiltinAdapter_*; + Java_ru_rt_restream_reindexer_util_NativeUtils_*; + local: + *; +}; diff --git a/pom.xml b/pom.xml index c2a136a0..b40e004c 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,12 @@ org.apache.maven.plugins maven-source-plugin 2.2.1 + + + **/*.so + **/*.dylib + + attach-sources diff --git a/src/main/java/ru/rt/restream/reindexer/binding/builtin/BuiltinAdapter.java b/src/main/java/ru/rt/restream/reindexer/binding/builtin/BuiltinAdapter.java index a76ee6f8..21f0597f 100644 --- a/src/main/java/ru/rt/restream/reindexer/binding/builtin/BuiltinAdapter.java +++ b/src/main/java/ru/rt/restream/reindexer/binding/builtin/BuiltinAdapter.java @@ -51,17 +51,23 @@ public class BuiltinAdapter { private static void loadLibrary(String fileName) throws IOException { Path tempFile = Files.createTempFile("rx-connector-", fileName); + boolean loaded = false; LOGGER.debug("rx: loading {}", tempFile); try (InputStream is = BuiltinAdapter.class.getClassLoader().getResourceAsStream(fileName)) { if (is == null) { throw new IllegalArgumentException("File: '" + fileName + "' is not found"); } Files.copy(is, tempFile, StandardCopyOption.REPLACE_EXISTING); + // Native backtrace resolution needs the ELF file after the library is loaded. + tempFile.toFile().deleteOnExit(); System.load(tempFile.toAbsolutePath().toString()); + loaded = true; LOGGER.debug("rx: loaded {}", tempFile); } finally { - Files.delete(tempFile); - LOGGER.debug("rx: deleted {}", tempFile); + if (!loaded) { + Files.deleteIfExists(tempFile); + LOGGER.debug("rx: deleted {}", tempFile); + } } }