8198243: Add build time check for global operator new/delete in object files
Reviewed-by: tbell, kbarrett, dholmes, ihse
--- a/make/autoconf/spec.gmk.in Mon Mar 05 13:18:55 2018 +0000
+++ b/make/autoconf/spec.gmk.in Wed Mar 07 13:26:15 2018 -0800
@@ -513,6 +513,8 @@
NM:=@NM@
GNM:=@GNM@
STRIP:=@STRIP@
+OBJDUMP:=@OBJDUMP@
+CXXFILT:=@CXXFILT@
LIPO:=@LIPO@
INSTALL_NAME_TOOL:=@INSTALL_NAME_TOOL@
--- a/make/autoconf/toolchain.m4 Mon Mar 05 13:18:55 2018 +0000
+++ b/make/autoconf/toolchain.m4 Wed Mar 07 13:26:15 2018 -0800
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, 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
@@ -726,6 +726,14 @@
# bails if argument is missing.
BASIC_FIXUP_EXECUTABLE(OBJDUMP)
fi
+
+ case $TOOLCHAIN_TYPE in
+ gcc|clang|solstudio)
+ BASIC_CHECK_TOOLS(CXXFILT, [c++filt])
+ BASIC_CHECK_NONEMPTY(CXXFILT)
+ BASIC_FIXUP_EXECUTABLE(CXXFILT)
+ ;;
+ esac
])
# Setup the build tools (i.e, the compiler and linker used to build programs
--- a/make/conf/jib-profiles.js Mon Mar 05 13:18:55 2018 +0000
+++ b/make/conf/jib-profiles.js Wed Mar 07 13:26:15 2018 -0800
@@ -765,7 +765,7 @@
var getJibProfilesDependencies = function (input, common) {
var devkit_platform_revisions = {
- linux_x64: "gcc4.9.2-OEL6.4+1.2",
+ linux_x64: "gcc4.9.2-OEL6.4+1.3",
macosx_x64: "Xcode6.3-MacOSX10.9+1.0",
solaris_x64: "SS12u4-Solaris11u1+1.0",
solaris_sparcv9: "SS12u4-Solaris11u1+1.1",
--- a/make/devkit/Tools.gmk Mon Mar 05 13:18:55 2018 +0000
+++ b/make/devkit/Tools.gmk Wed Mar 07 13:26:15 2018 -0800
@@ -562,8 +562,8 @@
ln -s $(TARGET)-$* $@
missing-links := $(addprefix $(PREFIX)/bin/, \
- addr2line ar as c++ c++filt elfedit g++ gcc gprof ld nm objcopy ranlib readelf \
- size strings strip ld.bfd ld.gold dtrace)
+ addr2line ar as c++ c++filt dwp elfedit g++ gcc gcc-$(GCC_VER) gprof ld ld.bfd \
+ ld.gold nm objcopy objdump ranlib readelf size strings strip)
endif
##########################################################################################
--- a/make/hotspot/lib/CompileJvm.gmk Mon Mar 05 13:18:55 2018 +0000
+++ b/make/hotspot/lib/CompileJvm.gmk Wed Mar 07 13:26:15 2018 -0800
@@ -270,3 +270,62 @@
include lib/JvmMapfile.gmk
TARGETS += $(BUILD_LIBJVM)
+
+################################################################################
+# Hotspot disallows the use of global operators 'new' and 'delete'. This build
+# time check helps enforce this requirement. If you trigger this check and the
+# reference is not obvious from the source, GNU objdump can be used to help find
+# the reference if compiled with GCC:
+#
+# objdump -lrdSC <path/to/file.o>
+#
+# -C demangle
+# -d disassemble
+# -r print relocation entries, interspersed with the disassembly
+# -S print source code, intermixed with disassembly
+# -l include filenames and line numbers
+#
+# Search the output for the operator(s) of interest, to see where they are
+# referenced.
+
+ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang solstudio), )
+
+ DEMANGLED_REGEXP := [^:]operator (new|delete)
+
+ # Running c++filt to find offending symbols in all files is too expensive,
+ # especially on Solaris, so use mangled names when looking for symbols.
+ # Save the demangling for when something is actually found.
+ ifeq ($(TOOLCHAIN_TYPE), solstudio)
+ MANGLED_SYMS := \
+ __1c2n6FL_pv_ \
+ __1c2N6FL_pv_ \
+ __1c2k6Fpv_v_ \
+ __1c2K6Fpv_v_ \
+ #
+ UNDEF_PATTERN := UNDEF
+ else
+ MANGLED_SYMS := \
+ _ZdaPv \
+ _ZdlPv \
+ _Znam \
+ _Znwm \
+ #
+ UNDEF_PATTERN := ' U '
+ endif
+
+ define SetupOperatorNewDeleteCheck
+ $1.op_check: $1
+ if [ -n "`$(NM) $$< | $(GREP) $(addprefix -e , $(MANGLED_SYMS)) \
+ | $(GREP) $(UNDEF_PATTERN)`" ]; then \
+ $(ECHO) "$$<: Error: Use of global operators new and delete is not allowed in Hotspot:"; \
+ $(NM) $$< | $(CXXFILT) | $(EGREP) '$(DEMANGLED_REGEXP)' | $(GREP) $(UNDEF_PATTERN); \
+ $(ECHO) "See: $(TOPDIR)/make/hotspot/lib/CompileJvm.gmk"; \
+ exit 1; \
+ fi
+ $(TOUCH) $$@
+
+ TARGETS += $1.op_check
+ endef
+
+ $(foreach o, $(BUILD_LIBJVM_ALL_OBJS), $(eval $(call SetupOperatorNewDeleteCheck,$o)))
+endif