Solaris 9 上的 Java 1.8.0_311 返回重定位错误,未找到符号 unsetenv 和 sema_timedwait
这类似于 这个关于Java 1.6的问题。作为该问题的OP,我有一个基于 SPARC v9 架构的 Solaris(物理 SUN Fire V445):
-bash-4.4$ cat /etc/release
Solaris 9 9/05 HW s9s_u9wos_06b SPARC
Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 25 September 2006
-bash-4.4$ isainfo -v
64-bit sparcv9 applications
32-bit sparc applications
从最新的 Oracle 分布式 Java 8 for SPARC 64 位调用 java 得到了这个:
-bash-4.4$ /usr/jdk/instances/jdk1.8.0_311/bin/java -version
Error: dl failure on line 893
Error: failed /export/home1/java/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so, because ld.so.1: java: fatal: relocation error: file /export/home1/java/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so: symbol unsetenv: referenced symbol not found
更仔细地查看 libjvm.so,不仅缺少 unsetenv:
-bash-4.4$ ldd -rv /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
find object=libsocket.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libsocket.so.1 => /usr/lib/64/libsocket.so.1
find object=libsched.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libsched.so.1 => /usr/lib/64/libsched.so.1
find object=libdl.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libdl.so.1 => /usr/lib/64/libdl.so.1
find object=libm.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libm.so.1 => /usr/lib/64/libm.so.1
find object=libCrun.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libCrun.so.1 => /usr/lib/64/libCrun.so.1
find object=libthread.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libthread.so.1 => /usr/lib/64/libthread.so.1
find object=libdoor.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libdoor.so.1 => /usr/lib/64/libdoor.so.1
find object=libc.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libc.so.1 => /usr/lib/64/libc.so.1
find object=libdemangle.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libdemangle.so.1 => /usr/lib/64/libdemangle.so.1
find object=libkstat.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libkstat.so.1 => /usr/lib/64/libkstat.so.1
find object=libnsl.so.1; required by /usr/lib/64/libsocket.so.1
libnsl.so.1 => /usr/lib/64/libnsl.so.1
find version=libnsl.so.1
libnsl.so.1 (SUNW_1.7) => /usr/lib/64/libnsl.so.1
libnsl.so.1 (SUNWprivate_1.1) => /usr/lib/64/libnsl.so.1
find object=libc.so.1; required by /usr/lib/64/libsocket.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.19) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libsched.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.8) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libm.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.7) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libCrun.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.1) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libthread.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.21.2) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libdl.so.1; required by /usr/lib/64/libthread.so.1
find version=libdl.so.1
libdl.so.1 (SUNWprivate_1.1) => /usr/lib/64/libdl.so.1
find object=libc.so.1; required by /usr/lib/64/libdoor.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.1) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libdl.so.1; required by /usr/lib/64/libc.so.1
find version=libdl.so.1
libdl.so.1 (SUNW_1.4) => /usr/lib/64/libdl.so.1
libdl.so.1 (SUNWprivate_1.1) => /usr/lib/64/libdl.so.1
find object=libc.so.1; required by /usr/lib/64/libdemangle.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.8) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libkstat.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.9) => /usr/lib/64/libc.so.1
find object=libdl.so.1; required by /usr/lib/64/libnsl.so.1
find version=libdl.so.1
libdl.so.1 (SUNW_0.7) => /usr/lib/64/libdl.so.1
find object=libc.so.1; required by /usr/lib/64/libnsl.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.21) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.2) => /usr/lib/64/libc.so.1
find object=libmp.so.2; required by /usr/lib/64/libnsl.so.1
libmp.so.2 => /usr/lib/64/libmp.so.2
find version=libmp.so.2
libmp.so.2 (SUNW_1.1) => /usr/lib/64/libmp.so.2
libmp.so.2 (SUNWprivate_1.1) => /usr/lib/64/libmp.so.2
find object=libc.so.1; required by /usr/lib/64/libmp.so.2
find version=libc.so.1
libc.so.1 (SUNW_0.7) => /usr/lib/64/libc.so.1
object=/usr/lib/64/libc.so.1; filter for /usr/platform/$PLATFORM/lib/sparcv9/libc_psr.so.1
find object=/usr/platform/SUNW,Sun-Fire-V445/lib/sparcv9/libc_psr.so.1; required by /usr/lib/64/libc.so.1
/usr/platform/SUNW,Sun-Fire-V445/lib/sparcv9/libc_psr.so.1
object=/usr/lib/64/libdl.so.1; filter for /usr/lib/sparcv9/ld.so.1
symbol not found: unsetenv (/usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so)
symbol not found: sema_timedwait (/usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so)
我认为 timedwait 信号量应该由 librt 实现,但事实并非如此:
-bash-4.4$ nm -gD /usr/lib/64/librt.so | grep sema
w _libthread_sema_wait
U _lwp_sema_init
U _lwp_sema_post
U _lwp_sema_trywait
U _lwp_sema_wait
U sema_destroy
U sema_init
U sema_post
U sema_trywait
U sema_wait
似乎,我被困在这里,因为这是唯一的 librt.so在那台机器上可用。有人知道如何让它发挥作用吗? (我知道,sunos5.9是一个垂死的平台,但 Oracle 仍然为该平台进行分发,我只是希望在那里使用它。)
谢谢!
This is similar to this question about Java 1.6. As the OP of that question, I have a Solaris on a SPARC v9 architecture (physical SUN Fire V445):
-bash-4.4$ cat /etc/release
Solaris 9 9/05 HW s9s_u9wos_06b SPARC
Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 25 September 2006
-bash-4.4$ isainfo -v
64-bit sparcv9 applications
32-bit sparc applications
Calling java from the latest Oracle-distributed Java 8 for SPARC 64-bit gets me this:
-bash-4.4$ /usr/jdk/instances/jdk1.8.0_311/bin/java -version
Error: dl failure on line 893
Error: failed /export/home1/java/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so, because ld.so.1: java: fatal: relocation error: file /export/home1/java/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so: symbol unsetenv: referenced symbol not found
Looking at libjvm.so more closely, not only unsetenv is missing:
-bash-4.4$ ldd -rv /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
find object=libsocket.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libsocket.so.1 => /usr/lib/64/libsocket.so.1
find object=libsched.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libsched.so.1 => /usr/lib/64/libsched.so.1
find object=libdl.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libdl.so.1 => /usr/lib/64/libdl.so.1
find object=libm.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libm.so.1 => /usr/lib/64/libm.so.1
find object=libCrun.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libCrun.so.1 => /usr/lib/64/libCrun.so.1
find object=libthread.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libthread.so.1 => /usr/lib/64/libthread.so.1
find object=libdoor.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libdoor.so.1 => /usr/lib/64/libdoor.so.1
find object=libc.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libc.so.1 => /usr/lib/64/libc.so.1
find object=libdemangle.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libdemangle.so.1 => /usr/lib/64/libdemangle.so.1
find object=libkstat.so.1; required by /usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so
libkstat.so.1 => /usr/lib/64/libkstat.so.1
find object=libnsl.so.1; required by /usr/lib/64/libsocket.so.1
libnsl.so.1 => /usr/lib/64/libnsl.so.1
find version=libnsl.so.1
libnsl.so.1 (SUNW_1.7) => /usr/lib/64/libnsl.so.1
libnsl.so.1 (SUNWprivate_1.1) => /usr/lib/64/libnsl.so.1
find object=libc.so.1; required by /usr/lib/64/libsocket.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.19) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libsched.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.8) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libm.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.7) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libCrun.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.1) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libthread.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.21.2) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libdl.so.1; required by /usr/lib/64/libthread.so.1
find version=libdl.so.1
libdl.so.1 (SUNWprivate_1.1) => /usr/lib/64/libdl.so.1
find object=libc.so.1; required by /usr/lib/64/libdoor.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.1) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.1) => /usr/lib/64/libc.so.1
find object=libdl.so.1; required by /usr/lib/64/libc.so.1
find version=libdl.so.1
libdl.so.1 (SUNW_1.4) => /usr/lib/64/libdl.so.1
libdl.so.1 (SUNWprivate_1.1) => /usr/lib/64/libdl.so.1
find object=libc.so.1; required by /usr/lib/64/libdemangle.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.8) => /usr/lib/64/libc.so.1
find object=libc.so.1; required by /usr/lib/64/libkstat.so.1
find version=libc.so.1
libc.so.1 (SUNW_0.9) => /usr/lib/64/libc.so.1
find object=libdl.so.1; required by /usr/lib/64/libnsl.so.1
find version=libdl.so.1
libdl.so.1 (SUNW_0.7) => /usr/lib/64/libdl.so.1
find object=libc.so.1; required by /usr/lib/64/libnsl.so.1
find version=libc.so.1
libc.so.1 (SUNW_1.21) => /usr/lib/64/libc.so.1
libc.so.1 (SUNWprivate_1.2) => /usr/lib/64/libc.so.1
find object=libmp.so.2; required by /usr/lib/64/libnsl.so.1
libmp.so.2 => /usr/lib/64/libmp.so.2
find version=libmp.so.2
libmp.so.2 (SUNW_1.1) => /usr/lib/64/libmp.so.2
libmp.so.2 (SUNWprivate_1.1) => /usr/lib/64/libmp.so.2
find object=libc.so.1; required by /usr/lib/64/libmp.so.2
find version=libc.so.1
libc.so.1 (SUNW_0.7) => /usr/lib/64/libc.so.1
object=/usr/lib/64/libc.so.1; filter for /usr/platform/$PLATFORM/lib/sparcv9/libc_psr.so.1
find object=/usr/platform/SUNW,Sun-Fire-V445/lib/sparcv9/libc_psr.so.1; required by /usr/lib/64/libc.so.1
/usr/platform/SUNW,Sun-Fire-V445/lib/sparcv9/libc_psr.so.1
object=/usr/lib/64/libdl.so.1; filter for /usr/lib/sparcv9/ld.so.1
symbol not found: unsetenv (/usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so)
symbol not found: sema_timedwait (/usr/jdk/instances/jdk1.8.0_311/jre/lib/sparcv9/server/libjvm.so)
I assume that the timedwait semaphore should be implemented by librt, but it is not:
-bash-4.4$ nm -gD /usr/lib/64/librt.so | grep sema
w _libthread_sema_wait
U _lwp_sema_init
U _lwp_sema_post
U _lwp_sema_trywait
U _lwp_sema_wait
U sema_destroy
U sema_init
U sema_post
U sema_trywait
U sema_wait
Seems, I'm stuck here, since that is the only librt.so available on that machine. Does anybody have an idea how to get it working? (I know, sunos5.9 is a dying platform, but Oracle still distributes for that platform and I'd simply expect to use it there as well.)
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要将系统升级到更高版本的 Solaris。 Solaris 9 不支持 Java 8 :
Solaris 9 没有
unsetenv()
函数。 Solaris 9 man 中记录的基本库函数页面仅列出了以下u*()
函数:Solaris 9 中唯一的环境处理函数是 putenv( ):
同样,线程和实时库函数 man 的“S”部分页第 3 节文档:
You need to upgrade your system to a later version of Solaris. Java 8 is not supported on Solaris 9:
Solaris 9 does not have an
unsetenv()
function. The basic library functions documented in the Solaris 9 man page only lists the followingu*()
functions:The only environment handling function in Solaris 9 is putenv():
Likewise, there's no
sema_timedwait()
in the "S" section of the Threads and Realtime Library Functions man pages section 3 documentation: