File: macos_nativelib_dependencies.md

package info (click to toggle)
gluegen2 2.6.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,320 kB
  • sloc: java: 55,357; ansic: 3,758; xml: 3,328; sh: 1,565; pascal: 591; asm: 162; makefile: 76
file content (43 lines) | stat: -rw-r--r-- 1,739 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Loading a MacOS Native Library's Dependencies 
Assume we have `libBindingtest1p1.dylib`, which links to `libtest1.dylib`,
i.e. requires the OS native library to load `libtest1.dylib` to resolve symbols.

Usually we just se `DYLD_LIBRARY_PATH` including the path where `libtest1.dylib`
is located and we are good to go.

## Just use dynamic loading via GlueGen's ProcAddressTable
Note, the above problem does not occur when using GlueGen's ProcAddressTable,
i.e. loading the underlying tool library `libtest2.dylib` w/ dlopen
and passing all symbols to the JNI library `libBindingtest1p2.dylib`.

## Can't pass `DYLD_LIBRARY_PATH` to `/usr/bin/java`
This is supposed to be related to MacOS's `System Integrity Protect (SIP)`.

## Workaround inability to pass `DYLD_LIBRARY_PATH` to `/usr/bin/java`

### Use explicit OpenJDK/Temurin JDK `java` executable path

Interestingly passing `DYLD_LIBRARY_PATH` works using the 
explicit `java` executable path, set by default as follows:

```
# MacOS: Select JVM path to allow DYLD_LIBRARY_PATH
JAVA_HOME=`/usr/libexec/java_home -version 17`
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
```        


### Using ``@loader_path` within dependent library
Set location of referenced library `libtest1.dylib` to same path of dependent library `libBindingtest1p1.dylib`
using `@loader_path`.
```
cd build-macosx/test/build/natives/
otool -L libBindingtest1p1.dylib 
install_name_tool -change libtest1.dylib @loader_path/libtest1.dylib libBindingtest1p1.dylib
otool -L libBindingtest1p1.dylib 
```

Further we could try `@executable_path` and `@rpath`.

See [An alternative to macOS's DYLD_LIBRARY_PATH](https://www.joyfulbikeshedding.com/blog/2021-01-13-alternative-to-macos-dyld-library-path.html).