Backport GCC 4.5+ --enable-linker-build-id option.
BUG = NONE
TEST = objdump -s -j .note.gnu.build-id libc.so
R=bradnelson@google.com
Review URL: https://codereview.chromium.org/14859004
diff --git a/ChangeLog b/ChangeLog
index 102d38a..2b2869b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,20 @@
* GCC 4.4.1 released.
+2009-04-30 Paul Pluzhnikov <ppluzhnikov@google.com>
+ Roland McGrath <roland@redhat.com>
+
+ * configure.ac (HAVE_LD_BUILDID): New check for ld --build-id
+ support.
+ (ENABLE_LD_BUILDID): New configuration option.
+ * gcc.c [HAVE_LD_BUILDID and ENABLE_LD_BUILDID]
+ (LINK_BUILDID_SPEC): New macro.
+ (init_spec): If defined, prepend it between LINK_EH_SPEC and
+ link_spec.
+ * doc/install.texi: Document --enable-linker-build-id option.
+ * configure: Rebuild.
+ * config.in: Rebuild.
+
2009-04-25 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
PR bootstrap/39739
diff --git a/gcc/config.in b/gcc/config.in
index 2d03822..dd6944a 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -101,6 +101,12 @@
#endif
+/* Define if gcc should always pass --build-id to linker. */
+#ifndef USED_FOR_TARGET
+#undef ENABLE_LD_BUILDID
+#endif
+
+
/* Define to 1 if translation of program messages to the user's native
language is requested. */
#ifndef USED_FOR_TARGET
@@ -1020,6 +1026,12 @@
#endif
+/* Define if your linker supports --build-id. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_LD_BUILDID
+#endif
+
+
/* Define if your linker supports --demangle option. */
#ifndef USED_FOR_TARGET
#undef HAVE_LD_DEMANGLE
diff --git a/gcc/configure b/gcc/configure
index 9054b98..21530e9 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -1078,6 +1078,8 @@
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-linker-build-id
+ compiler will always pass --build-id to linker
--enable-maintainer-mode
enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer
@@ -24214,6 +24216,56 @@
;;
esac
+echo "$as_me:$LINENO: checking linker --build-id support" >&5
+echo $ECHO_N "checking linker --build-id support... $ECHO_C" >&6
+if test "${gcc_cv_ld_buildid+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gcc_cv_ld_buildid=no
+ if test $in_tree_ld = yes ; then
+ if test "$gcc_cv_gld_major_version" -eq 2 -a \
+ "$gcc_cv_gld_minor_version" -ge 18 -o \
+ "$gcc_cv_gld_major_version" -gt 2 \
+ && test $in_tree_ld_is_elf = yes; then
+ gcc_cv_ld_buildid=yes
+ fi
+ elif test x$gcc_cv_ld != x; then
+ if $gcc_cv_ld --help 2>/dev/null | grep build-id > /dev/null; then
+ gcc_cv_ld_buildid=yes
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: $gcc_cv_ld_buildid" >&5
+echo "${ECHO_T}$gcc_cv_ld_buildid" >&6
+if test x"$gcc_cv_ld_buildid" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LD_BUILDID 1
+_ACEOF
+
+fi
+
+# Check whether --enable-linker-build-id or --disable-linker-build-id was given.
+if test "${enable_linker_build_id+set}" = set; then
+ enableval="$enable_linker_build_id"
+
+else
+ enable_linker_build_id=no
+fi;
+
+if test x"$enable_linker_build_id" = xyes; then
+ if test x"$gcc_cv_ld_buildid" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_LD_BUILDID 1
+_ACEOF
+
+ else
+ { echo "$as_me:$LINENO: WARNING: --build-id is not supported by your linker; --enable-linker-build-id ignored" >&5
+echo "$as_me: WARNING: --build-id is not supported by your linker; --enable-linker-build-id ignored" >&2;}
+ fi
+fi
+
echo "$as_me:$LINENO: checking linker --sysroot support" >&5
echo $ECHO_N "checking linker --sysroot support... $ECHO_C" >&6
if test "${gcc_cv_ld_sysroot+set}" = set; then
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 9e75743..c86d874 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3516,6 +3516,41 @@
;;
esac
+AC_CACHE_CHECK(linker --build-id support,
+ gcc_cv_ld_buildid,
+ [gcc_cv_ld_buildid=no
+ if test $in_tree_ld = yes ; then
+ if test "$gcc_cv_gld_major_version" -eq 2 -a \
+ "$gcc_cv_gld_minor_version" -ge 18 -o \
+ "$gcc_cv_gld_major_version" -gt 2 \
+ && test $in_tree_ld_is_elf = yes; then
+ gcc_cv_ld_buildid=yes
+ fi
+ elif test x$gcc_cv_ld != x; then
+ if $gcc_cv_ld --help 2>/dev/null | grep build-id > /dev/null; then
+ gcc_cv_ld_buildid=yes
+ fi
+ fi])
+if test x"$gcc_cv_ld_buildid" = xyes; then
+ AC_DEFINE(HAVE_LD_BUILDID, 1,
+ [Define if your linker supports --build-id.])
+fi
+
+AC_ARG_ENABLE(linker-build-id,
+[ --enable-linker-build-id
+ compiler will always pass --build-id to linker],
+[],
+enable_linker_build_id=no)
+
+if test x"$enable_linker_build_id" = xyes; then
+ if test x"$gcc_cv_ld_buildid" = xyes; then
+ AC_DEFINE(ENABLE_LD_BUILDID, 1,
+ [Define if gcc should always pass --build-id to linker.])
+ else
+ AC_MSG_WARN(--build-id is not supported by your linker; --enable-linker-build-id ignored)
+ fi
+fi
+
AC_CACHE_CHECK(linker --sysroot support,
gcc_cv_ld_sysroot,
[gcc_cv_ld_sysroot=no
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 56fd99b..9abd591 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1490,6 +1490,14 @@
building runtime libraries. @samp{@var{map}} is a space-separated
list of maps of the form @samp{@var{old}=@var{new}}.
+@item --enable-linker-build-id
+Tells GCC to pass @option{--build-id} option to the linker for all final
+links (links performed without the @option{-r} or @option{--relocatable}
+option), if the linker supports it. If you specify
+@option{--enable-linker-build-id}, but your linker does not
+support @option{--build-id} option, a warning is issued and the
+@option{--enable-linker-build-id} option is ignored. The default is off.
+
@end table
@subheading Cross-Compiler-Specific Options
diff --git a/gcc/gcc.c b/gcc/gcc.c
index ecb671f..6c7f47c 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -717,6 +717,12 @@
#endif
#endif
+#ifndef LINK_BUILDID_SPEC
+# if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
+# define LINK_BUILDID_SPEC "%{!r:--build-id} "
+# endif
+#endif
+
/* -u* was put back because both BSD and SysV seem to support it. */
/* %{static:} simply prevents an error message if the target machine
doesn't handle -static. */
@@ -1832,9 +1838,15 @@
asm_spec = XOBFINISH (&obstack, const char *);
}
#endif
-#ifdef LINK_EH_SPEC
+#if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC
+# ifdef LINK_BUILDID_SPEC
+ /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
+ obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
+# endif
+# ifdef LINK_EH_SPEC
/* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
+# endif
obstack_grow0 (&obstack, link_spec, strlen (link_spec));
link_spec = XOBFINISH (&obstack, const char *);
#endif