components/llvm/patches/010-linker-mapfiles.patch
author xiao qing lu - Sun Microsystems - Beijing China <xiaoqing.lu@oracle.com>
Tue, 12 Jul 2016 19:50:03 -0700
changeset 6403 9d25dbe7eb71
parent 5434 9f55c805ce9d
permissions -rw-r--r--
23209274 Upgrade libsigsegv to 2.10

# 1. Enable the linker map files provided by clang/llvm for symbol
# scope and visibility in shared libraries.
# 2. We must use our own linker map file for compatibility with
# the GNU linkers and GNU Binutils (libbfd).
# Solaris autoconf-based build.
# https://llvm.org/bugs/show_bug.cgi?id=24641
--- Makefile.rules	2015-07-17 19:12:32.515872699 -0700
+++ Makefile.rules	2015-07-17 19:17:40.294355307 -0700
@@ -643,6 +643,7 @@
     endif
     ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
       LD.Flags += -Wl,-z -Wl,discard-unused=sections
+      LD.Flags += -Wl,-M -Wl,$(PROJ_SRC_ROOT)/mapfiles/map.gnu-sections
     endif
   endif
 endif
@@ -655,6 +656,10 @@
   ifneq ($(HOST_OS), Darwin)
     ifdef TOOLNAME
       LD.Flags += $(RPATH) -Wl,'$$ORIGIN/../lib'
+      ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+        LD.Flags += -Wl,-z -Wl,discard-unused=sections
+        LD.Flags += -Wl,-M -Wl,$(PROJ_SRC_ROOT)/mapfiles/map.gnu-sections
+      endif
     endif
   else
     ifneq ($(DARWIN_MAJVERS),4)
@@ -1122,11 +1127,26 @@
 clean-local::
 	-$(Verb) $(RM) -f $(NativeExportsFile)
 else
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+# Solaris ld requires a version script rather than a plain list.
+NativeExportsFile := $(ObjDir)/$(notdir $(EXPORTED_SYMBOL_FILE)).map
+$(NativeExportsFile): $(EXPORTED_SYMBOL_FILE) $(ObjDir)/.dir
+	$(Verb) echo "{" > $@
+	$(Verb) grep -q '[[:alnum:]_]' $< && echo "  global:" >> $@ || :
+	$(Verb) sed -e 's/$$/;/' -e 's/^/    /' < $< >> $@
+ifneq ($(HOST_OS),OpenBSD)
+	$(Verb) echo "  local: *;" >> $@
+endif
+	$(Verb) echo "};" >> $@
+clean-local::
+	-$(Verb) $(RM) -f $(NativeExportsFile)
+else
 # Default behavior: just use the exports file verbatim.
 NativeExportsFile := $(EXPORTED_SYMBOL_FILE)
 endif
 endif
 endif
+endif
 
 # Now add the linker command-line options to use the native export file.
 
@@ -1146,6 +1166,11 @@
 SharedLinkOptions += $(NativeExportsFile)
 endif
 
+# Solaris
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+LLVMLibsOptions += -Wl,-M -Wl,$(NativeExportsFile)
+endif
+
 endif
 
 ###############################################################################
--- /dev/null	2015-07-08 19:15:05.000000000 -0700
+++ mapfiles/map.gnu-sections	2015-07-08 19:13:41.905920797 -0700
@@ -0,0 +1,61 @@
+$mapfile_version 2
+
+# Emulate the rules used by the GNU ld and gold linkers for merging input
+# sections into output sections in executables and shared objects. From
+# Ian Lance Taylor and Cary Coutant.
+
+# gcc 4.3 generates the following sorts of section names when it
+# needs a section name specific to a function:
+#   .text.FN
+#   .rodata.FN
+#   .sdata2.FN
+#   .data.FN
+#   .data.rel.FN
+#   .data.rel.local.FN
+#   .data.rel.ro.FN
+#   .data.rel.ro.local.FN
+#   .sdata.FN
+#   .bss.FN
+#   .sbss.FN
+#   .tdata.FN
+#   .tbss.FN
+#
+# The GNU linker maps all of those to the part before the .FN,
+# except that .data.rel.local.FN is mapped to .data, and
+# .data.rel.ro.local.FN is mapped to .data.rel.ro.  The sections
+# beginning with .data.rel.ro.local are grouped together.
+#
+# For an anonymous namespace, the string FN can contain a '.'.
+#
+# Also of interest: .rodata.strN.N, .rodata.cstN, both of which the
+# GNU linker maps to .rodata.
+
+$if _ET_DYN || _ET_EXEC
+
+LOAD_SEGMENT text {
+	ASSIGN_SECTION {
+		IS_NAME = MATCH(g/.data.rel.local.*/);
+		FLAGS = ALLOC !WRITE;
+		OUTPUT_SECTION { NAME = .data };
+	};
+	ASSIGN_SECTION {
+		IS_NAME = MATCH(r/^\.(text|rodata|sdata2|data\.rel\.ro|data\.rel|data|sdata|bss|sbss|tdata|tbss)\./);
+		FLAGS = ALLOC !WRITE;
+		OUTPUT_SECTION { NAME = MATCHREF(/.${n1}/) };
+	};
+};
+
+LOAD_SEGMENT data {
+	ASSIGN_SECTION {
+		IS_NAME = MATCH(g/.data.rel.local.*/);
+		FLAGS = ALLOC WRITE;
+		OUTPUT_SECTION { NAME = .data };
+	};
+	ASSIGN_SECTION {
+		IS_NAME = MATCH(r/^\.(text|rodata|sdata2|data\.rel\.ro|data\.rel|data|sdata|bss|sbss|tdata|tbss)\./);
+		FLAGS = ALLOC WRITE;
+		OUTPUT_SECTION { NAME = MATCHREF(/.${n1}/) };
+	};
+};
+
+$endif