我在USB上安装了一个Java应用程序,用户应该可以从任何操作系统运行该应用程序。
为此,
然而,问题是,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) = ?
EDIT2
这是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
这是ltrace
摘录围绕 ext4分区上的Java加载libjava.so
(而不是问题FAT32分区),我可以正常加载:
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
的{{1}}输出。
java