Need preliminary reviewers: Solaris/Linux shared library version changes
David Holmes
David.Holmes at oracle.com
Thu Mar 17 02:22:16 UTC 2011
Hi Kelly,
On the Hotspot side this change would appear to bake in the version info
at build time. So when I build Hotspot I will either build for JDK6 or
JDK7 or ... and then I wont be able to drop the VM libs I just built
into a different version of the JDK - is that right? If so I'd want a
way to disable the version checking during development so that I can
still drop the VM into different JDK versions.
David
Kelly O'Hair said the following on 03/17/11 11:59:
> Need preliminary reviewers: Solaris/Linux shared library version changes
>
> Long story, but the background may be important. It's not a slam dunk that these changes will
> go into JDK7, we may decide to do this in JDK8. I recognize it is late to be doing this in JDK7.
>
> If you have any experience with native shared library versioning or JNI usage, I would really
> appreciate you taking the time to look at this.
>
> Background:
> A while back, the JDK7 launchers were changed to NOT set LD_LIBRARY_PATH in the
> environment or use it in anyway to launch the jdk. This was and still is considered a good
> thing for us to have done. No applications should rely on LD_LIBRARY_PATH, it's a
> workaround mechanism and comes with some old baggage. But it comes with a cost.
> Low and behold, what we discovered was that a JDK6 process, if doing an exec of a JDK7
> launcher, or anything that might cause an exec of a JDK7, was leaving the LD_LIBRARY_PATH
> settings for JDK6 libraries in the environment for the JDK7 process to find.
> And, low and behold, it found the JDK6 shared libraries in some cases.
> So the JDK7 process would be running with a mix of JDK7 shared libraries and JDK6 shared libraries.
> This is considered a very very bad thing, but sometimes things appeared to work, and
> sometimes things would crash, missing newer extern symbols.
>
> Workaround:
> The workaround/solution has been to unset LD_LIBRARY_PATH in the appropriate place, if you have
> an appropriate place. The difficulty arises when LD_LIBRARY_PATH is being used for some
> other reason or tool, so just unsetting it needs to be done with care.
> After running into a situation where the build utility ant (a popular Java application)
> was running JDK6, and after doing a build of some Java code with JDK7 crashed, I decided
> to see what could be done to guarantee no mixing happened.
>
> Goal/Approach:
> My goal here is to prevent the mixing of JDK7 shared libraries with those of other JDK releases.
> My approach was to use shared library versioning to see I could group all the JDK7 shared libraries
> with the same version, a unique version for this release, and then have any shared library dependencies
> between them insist on that same shared library version.
> Any mixing would trigger a runtime linker error.
>
> Proposed Changes:
> There are 2 webrevs here, one for hotspot and one for the jdk.
> 7021644: Consider using a new version name on all jdk7 shared libraries
> http://cr.openjdk.java.net/~ohair/openjdk7/jdk7-build-jdk-mapfile/webrev/
> http://cr.openjdk.java.net/~ohair/openjdk7/jdk7-build-hotspot-mapfile/webrev/
> The libjvm.so and libjawt.so libraries will also provide the older version name.
>
> Mapfiles:
> Sometimes called version scripts, do lots of things, or can, the only part of the mapfiles
> of interest here is the version name. When you link, the version names of the shared
> libraries used and seen at link time are baked into your executable or shared library
> so that at runtime, the runtime linker will make sure you run with the right versions.
> The error message may be a cryptic runtime linker error, but it will refuse to run.
>
> Issues:
> * On the question of JNI usage, and user's JNI shared libraries being dependent on the older
> shared library version names from JDK6 and older. The JNI book references:
> http://java.sun.com/docs/books/jni/html/invoke.html#4944
> http://java.sun.com/docs/books/jni/html/invoke.html#24891
> Implies that any explicit shared library dependencies on libjvm.so or libjava.so would result
> in a JNI shared library that is tied to that particular implementation.
> It recommends using dynamic linking if multiple JDKs would be used.
> My proposal does not impact dynamic linking, but could catch problems where the dynamic
> linking was done with LD_LIBRARY_PATH set to other JDKs.
> It is an accepted fact that not everyone followed this advice, as good as it was.
>
> * Native apps linking directly to libjvm.so or any JDK shared library.
> The JDK is not a native library interface provider, with a few exceptions, libjawt.so and libjvm.so,
> all the extern symbols in the JDK shared libraries are not public interfaces.
> Having said that, I'm sure there are some people who may have purposely or accidently
> become dependent on certain extern symbols in our libraries.
>
> * Dynamic linking, which is usually the way most of our shared libraries get loaded
> into the process, is not an issue here. However, if the shared library has a dependency on
> another JDK7 shared library, that is where LD_LIBRARY_PATH could kick in and cause
> the wrong one to be loaded.
> So you might think that the answer would be to dynamically link everything, and in fact
> that might be the direction we go with JDK8, that remains to be seen.
> But that effort is much more work that this person was willing to do.
>
> Please, if you read this far, please send me comments.
>
> -kto
>
More information about the build-dev
mailing list