# HG changeset patch # User omajid # Date 1344978671 14400 # Node ID 7ef99df651efdd205ba93ad465674aecfcf36eda # Parent 00e2703dc63935303f6cad65a7996037a30babd5 7190813: (launcher) RPATH needs to have additional paths Reviewed-by: anthony, ksrini diff -r 00e2703dc639 -r 7ef99df651ef make/common/Program.gmk --- a/make/common/Program.gmk Wed Aug 08 18:26:51 2012 +0100 +++ b/make/common/Program.gmk Tue Aug 14 17:11:11 2012 -0400 @@ -131,6 +131,26 @@ endif # PLATFORM # +# Applications expect to be able to link against libjawt without invoking +# System.loadLibrary("jawt") first. This was the behaviour described in the +# devloper documentation of JAWT and what worked with OpenJDK6. +# +ifeq ($(PLATFORM), solaris) + ifeq ($(ARCH_DATA_MODEL), 32) + LDFLAGS += -R \$$ORIGIN/../lib/$(LIBARCH) + LDFLAGS += -R \$$ORIGIN/../jre/lib/$(LIBARCH) + else # ! ARCH_DATA_MODEL 64-bit + LDFLAGS += -R \$$ORIGIN/../../lib/$(LIBARCH) + LDFLAGS += -R \$$ORIGIN/../../jre/lib/$(LIBARCH) + endif # ARCH_DATA_MODEL +endif # PLATFORM SOLARIS +ifeq ($(PLATFORM), linux) + LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH) + LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH) +endif # PLATFORM LINUX + + +# # Launcher specific files. # FILES_o = $(OBJDIR)/main.$(OBJECT_SUFFIX) diff -r 00e2703dc639 -r 7ef99df651ef make/sun/jawt/Makefile --- a/make/sun/jawt/Makefile Wed Aug 08 18:26:51 2012 +0100 +++ b/make/sun/jawt/Makefile Tue Aug 14 17:11:11 2012 -0400 @@ -31,6 +31,13 @@ include $(BUILDDIR)/common/Defs.gmk # +# libjawt links to other programs, but nothing links to it directly. An RPATH +# entry has been added to the launcher so third-party programs linked against +# it will be able to find it no matter where the JDK or the third-party program +# is located. +# + +# # Files # ifeq ($(PLATFORM), windows) diff -r 00e2703dc639 -r 7ef99df651ef test/tools/launcher/RunpathTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/launcher/RunpathTest.java Tue Aug 14 17:11:11 2012 -0400 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7190813 + * @summary Check for extended RPATHs on *nixes + * @compile -XDignore.symbol.file RunpathTest.java + * @run main RunpathTest + * @author ksrini + */ + +import java.io.File; + +public class RunpathTest extends TestHelper { + + final String elfreaderCmd; + RunpathTest() { + elfreaderCmd = findElfReader(); + } + + final String findElfReader() { + String[] paths = {"/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/ccs/bin"}; + final String cmd = isSolaris ? "elfdump" : "readelf"; + for (String x : paths) { + File p = new File(x); + File e = new File(p, cmd); + if (e.canExecute()) { + return e.getAbsolutePath(); + } + } + System.err.println("Warning: no suitable elf reader!"); + return null; + } + + void elfCheck(String javacmd, String expectedRpath) { + final TestResult tr = doExec(elfreaderCmd, "-d", javacmd); + if (!tr.matches(expectedRpath)) { + System.out.println(tr); + throw new RuntimeException("FAILED: RPATH strings " + + expectedRpath + " not found in " + javaCmd); + } + System.out.println(javacmd + " contains expected RPATHS"); + } + + void testRpath() { + if (isDualMode && is64Bit) { + String expectedRpath = ".*RPATH.*\\$ORIGIN/../../lib/" + getJreArch() + + ":\\$ORIGIN/../../jre/lib/" + getJreArch() + ".*"; + elfCheck(java64Cmd, expectedRpath); + } else { + String expectedRpath = ".*RPATH.*\\$ORIGIN/../lib/" + getJreArch() + + ":\\$ORIGIN/../jre/lib/" + getJreArch() + ".*"; + elfCheck(javaCmd, expectedRpath); + } + } + + public static void main(String... args) throws Exception { + if (isSolaris || isLinux) { + RunpathTest rp = new RunpathTest(); + rp.testRpath(); + } + } +}