如何在启用了 SIP 的情况下使用 Java 二进制文件(JNI 库)在 macOS 上正确预加载 ASAN 库

问题描述 投票:0回答:1

我们有一个大型 C++ 库,我们使用 SWIG 创建了 Java 绑定(因此是一个 JNI 共享库)。我们针对 macOS、Linux 和 Windows 上的许多构建平台进行构建并运行测试;调试和选择;还有阿桑。

我们在使用 ASAN + Java 时遇到问题,特别是在某些 macOS 计算机上。对于我们的常规 C++ 库及其测试,在所有操作系统上都没有问题。我们整理了所有编译器标志、链接标志和运行时环境变量,以使 ASAN 正常工作。

但是对于 macOS 上的 Java 绑定 JNI 库(仅限),情况有所不同。当我们加载 ASAN 链接的绑定库并尝试在 macOS 上的 Java 中使用它时,我们收到以下错误并且 Java 进程中止:

==36055==ERROR: Interceptors are not working. This may be because AddressSanitizer is loaded too late (e.g. via dlopen). Please launch the executable with:
DYLD_INSERT_LIBRARIES=/path/to/libclang_rt.asan_osx_dynamic.dylib
"interceptors not installed" && 0

当我们尝试显而易见的方式时(指定

DYLD_INSERT_LIBRARIES
启动 Java 进程),它可以在我们本地的开发人员计算机上运行,但不能在我们的构建器上运行。经过进一步调查,我们确定我们的开发人员计算机禁用了 SIP(系统完整性保护),而我们的构建人员启用了 SIP。我们的 Infra 团队告诉我们,禁用 SIP 不是一个选项,因此我们必须在启用 SIP 的情况下完成这项工作。

强制 Java 在启用 SIP 的 macOS 系统上预加载 ASAN 库以防止此错误的正确方法是什么?

java c++ macos java-native-interface address-sanitizer
1个回答
0
投票

原帖中关于事物如何链接、如何使用

SWIG
的细节很少,但我尝试用纯
JNI
重现它,并且它有效。

查看我用于测试的示例代码,此处:link

如果我在致电

DYLD_INSERT_LIBRARIES
之前按照建议进行操作(通过
Java
),它就会按预期工作。如果我不这样做 - 代码就会失败。

我的

SIP
enabled

> csrutil status
System Integrity Protection status: enabled.

这就是

make test
make test_asan

的输出
> make test
/Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home/bin/java -Djava.library.path=:./lib -cp target recipeNo082.redux.HelloWorldASAN
==4717==ERROR: Interceptors are not working. This may be because AddressSanitizer is loaded too late (e.g. via dlopen). Please launch the executable with:
DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
"interceptors not installed" && 0
make: *** [test] Abort trap: 6

> make test_asan
DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/16/lib/darwin/libclang_rt.asan_osx_dynamic.dylib  /Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home/bin/java -Djava.library.path=:./lib -cp target recipeNo082.redux.HelloWorldASAN
java(4725,0x7ff84ca4bb40) malloc: nano zone abandoned due to inability to reserve vm space.
library: :./lib
=================================================================
==4725==ERROR: AddressSanitizer: heap-use-after-free on address 0x607000011745 at pc 0x00012e3abead bp 0x70000a6bc9c0 sp 0x70000a6bc9b8
WRITE of size 1 at 0x607000011745 thread T2
    #0 0x12e3abeac in Java_recipeNo082_redux_HelloWorldASAN_displayMessage recipeNo082_redux_HelloWorldASAN.c:24
© www.soinside.com 2019 - 2024. All rights reserved.