# 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