RFR: JDK-8055141 Catch linker errors earlier in the JVM build by not allowing unresolved externals

Mikael Gerdin mikael.gerdin at oracle.com
Thu Sep 25 07:32:20 UTC 2014


On Friday 19 September 2014 09.40.37 David Holmes wrote:
> Looks good and works well! Lets get this one backported too please. :)

Thanks for the reviews, David, Erik & Erik.
I suppose it does not really matter which hs-repo I push this to, so I'll push 
it to hs-gc/hotspot.

/Mikael

> 
> Thanks,
> David
> 
> On 18/09/2014 6:39 PM, Mikael Gerdin wrote:
> > Hi all,
> > 
> > As you may know, linking an ELF shared object allows unresolved external
> > symbols at link time. This is sometimes problematic for JVM developers
> > since the JVM does not depend on unresolved external symbols and all
> > missing symbols at build time are due to mistakes, usually missing
> > includes of inline definitions.
> > 
> > In order to disallow such unresolved externals I propose that we add
> > "-z defs" to the linker command line when linking the JVM, thereby making
> > unresolved externals a build-time error instead of a run-time failure when
> > dlopen:ing the newly built JVM for the first time.
> > 
> > On Windows ans OSX this is already the default linker behavior.
> > I took the liberty of modifying the bsd make file since I believe that bsd
> > uses the GNU linker which supports the "-z defs" flag. I'm not sure about
> > the behavior or flags appropriate for AIX so I didn't change the AIX
> > makefiles.
> > 
> > 
> > On Solaris, linking with "-z defs" failed at first with the following
> > message:
> > 
> > Undefined                       first referenced
> > 
> >   symbol                             in file
> > 
> > gethostbyname                       ostream.o  (symbol belongs to implicit
> > dependency /lib/64/libnsl.so.1)
> > inet_addr                           ostream.o  (symbol belongs to implicit
> > dependency /lib/64/libnsl.so.1)
> > ld: fatal: symbol referencing errors. No output written to libjvm.so
> > 
> > This has not caused any failures earlier since libsocket depends on
> > libnsl, so in practice the symbols are always present at runtime, but
> > with the "-z defs" flag the linker requires the dependency to be
> > explicitly stated.
> > I fixed the issure by appending -lnsl to the link-time libraries for the
> > Solaris build.
> > 
> > Webrev: http://cr.openjdk.java.net/~mgerdin/8055141/webrev.0/
> > Bug: https://bugs.openjdk.java.net/browse/JDK-8055141
> > 
> > Testing:
> > * Verified that the additional flag causes build-time errors on all
> > platforms in the presence of unresolved external symbols.
> > * Verified that the build passes on all Oracle-supported platforms with
> > the
> > new flag.
> > 
> > Thanks
> > /Mikael




More information about the build-dev mailing list