2

我在 USB 上安装了一个 Java 应用程序,用户应该能够从任何操作系统运行它。

为了这,

  1. 我正在将一个 JRE 实例与我的应用程序一起打包到 USB 上。
  2. 我在 USB 上有一个 FAT32 文件系统。

但是,问题是,FAT32 没有执行(“+x”)权限的概念。虽然我可以启动一个 shell 脚本,如下所示:

$ sh /path/to/fat32-usb/helloWorld.sh

,虽然我可以启动一个简单的 ELF 二进制文件,如下所示:

$ /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/helloWorld

,我似乎无法启动 Java ELF 程序。我收到这些错误:

Error: could not find libjava.so
Error: Could not find Java SE Runtime Environment.

在启动之前java,我尝试将这些环境变量设置如下:

export JAVA_HOME=/path/to/fat32-usb/jre
export LD_LIBRARY_PATH="$JAVA_HOME/lib/amd64:.:$LD_LIBRARY_PATH" 
export PATH="$JAVA_HOME/bin:.:$PATH"

我也尝试过从目录java内部启动$JAVA_HOME/bin。最后,我还尝试将所有的libXXX.so' 从复制$JAVA_HOME/lib/amd64/到,希望它们能以某种方式$JAVA_HOME/bin从当前目录中被拾取。.

但没有任何效果。

编辑

这是最后几行strace输出:

$ strace -vfo /tmp/java.strace /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/jre ...
...
readlink("/proc/self/exe", "/lib/x86_64-linux-gnu/ld-2.17.so", 4096) = 32
write(2, "Error: could not find libjava.so", 32) = 32
write(2, "\n", 1)                       = 1
write(2, "Error: Could not find Java SE Ru"..., 50) = 50
write(2, "\n", 1)                       = 1
exit_group(2)                           = ?

编辑2

这是ltrace(只有一行!)的输出:

$ ltrace -s 120 -e '*' -ifo /tmp/java.ltrace /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/jre ...
30913 [0xffffffffffffffff] +++ exited (status 2) +++

编辑 3

这是关于 Java 在ext4 分区ltrace(而不是问题 FAT32 分区)上加载的摘录,我可以很好地加载:libjava.so

5525 [0x7f7627600763] <... snprintf resumed> "/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", 4096, "%s/lib/%s/libjava.so", "/home/aaa/bbb/jdk1.7.0_40", "amd64") = 46
5525 [0x7f762760076d] libjli.so->access("/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", 0)                                                                 = -1
5525 [0x7f762760078d] libjli.so->snprintf( <unfinished ...>
5525 [0x3085246bdb] libc.so.6->(0, 0x7fffffd8, 0x7f7627607363, 39)                                                                                           = 0
5525 [0x3085246be3] libc.so.6->(0, 0x7fffffd8, 0x7f7627607363, 39)                                                                                           = 0
5525 [0x7f762760078d] <... snprintf resumed> "/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", 4096, "%s/jre/lib/%s/libjava.so", "/home/aaa/bbb/jdk1.7.0_40", "amd64") = 50
5525 [0x7f7627600797] libjli.so->access("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", 0)                                                             = 0

strace又是 health/loading 的输出java

5952  readlink("/proc/self/exe", "/home/aaa/bbb/jdk1.7.0_40/bin/ja"..., 4096) = 34
5952  access("/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", F_OK) = -1 ENOENT (No such file or directory)
5952  access("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", F_OK) = 0
5952  open("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/jvm.cfg", O_RDONLY) = 3
4

0 回答 0