diff options
author | Ray Donnelly <mingw.android@gmail.com> | 2013-08-27 00:43:26 +0100 |
---|---|---|
committer | Andrew Hsieh <andrewhsieh@google.com> | 2014-10-16 18:31:56 +0800 |
commit | 3e99b0f1d762dd3a7fc4ba93e57b2cc1a59068d3 (patch) | |
tree | d0cd35922b561c28d5aac18522b38dbc9f1eeee3 | |
parent | dc9c8f22c427c2110a7225e6290d86d25fd58415 (diff) | |
download | mclinker-3e99b0f1d762dd3a7fc4ba93e57b2cc1a59068d3.tar.gz |
Add an option --enable-shrink-binary-size to configure.
This option could reduce the LLVM tools by "-fdata-sections, -ffunction-sections"
and "--gc-sections". Note that with --enable-shrink-binary-size, your LLVM tools
might not be able to load plugins (ex: LLVMPolly).
The default is off to make NDK llvm tools support plugin.
This commit mirrors two commits in the Android LLVM git repo, from release_33
branch:
1: Ray Donnelly <mingw.android@gmail.com>
6230037 Fixes for "Shrink binary sizes when cross-compiling."
2: Lai Wei-Chih <Robert.Lai@mediatek.com>
0190585 Add an option --enable-shrink-binary-size to configure.
-rw-r--r-- | configure.ac | 38 | ||||
-rw-r--r-- | m4/link_options.m4 | 128 |
2 files changed, 158 insertions, 8 deletions
diff --git a/configure.ac b/configure.ac index 521d7115..a85d304e 100644 --- a/configure.ac +++ b/configure.ac @@ -9,6 +9,7 @@ #################### # m4 includes m4_include(m4/acx_pthread.m4) +m4_include(m4/link_options.m4) #################### # Autoconf/Automake Initialization @@ -44,17 +45,38 @@ AC_SUBST(MCLD_VERSION) AC_DEFINE_UNQUOTED([MCLD_VERSION], ["$MCLD_VERSION"]) AH_TEMPLATE([MCLD_VERSION], [MCLINKER version]) -#################### -# Languages -if test "$build_alias" != "$host_alias"; then - # To reduce binary size - CFLAGS="-Os -ffunction-sections -fdata-sections -fvisibility=hidden" - CXXFLAGS="-Os -ffunction-sections -fdata-sections -fvisibility=hidden" - LDFLAGS="-Wl,--gc-sections" -fi AC_PROG_CC AC_PROG_CXX +#################### +# --enable-shrink-binary-size : check whether they want to shrink mclinker size: +AC_ARG_ENABLE(shrink-binary-size, AS_HELP_STRING( + --enable-shrink-binary-size,[Shrink mclinker size (default is NO)]),,enableval="no") + +if test ${enableval} = "no" ; then + AC_SUBST(ENABLE_SHRINK_BINARY_SIZE,[0]) +else + AC_SUBST(ENABLE_SHRINK_BINARY_SIZE,[1]) +fi + +if test "$ENABLE_SHRINK_BINARY_SIZE" = "1"; then + #################### + # Compiler flags for binary size reduction + AC_MSG_CHECKING([binary size reduction compiler flags]) + CXX_FLAG_CHECK(DATA_SECTIONS, [-fdata-sections]) + CXX_FLAG_CHECK(FUNCTION_SECTIONS, [-ffunction-sections]) + CXX_FLAG_CHECK(VISIBILITY_INLINES_HIDDEN, [-fvisibility-inlines-hidden]) + CFLAGS="-Os $CFLAGS $DATA_SECTIONS $FUNCTION_SECTIONS $VISIBILITY_INLINES_HIDDEN" + CXXFLAGS="-Os $CXXFLAGS $DATA_SECTIONS $FUNCTION_SECTIONS $VISIBILITY_INLINES_HIDDEN" + + #################### + # Linker flags for binary size reduction + # (cooperative with -ffunction-sections, -fdata-sections) + AC_MSG_CHECKING([binary size reduction linker flags]) + AC_LINK_USE_GC_SECTIONS([GC_SECTIONS]) + LDFLAGS="$LDFLAGS $GC_SECTIONS" +fi + AC_PATH_PROG([FLEX],[flex]) AX_PROG_FLEX_VERSION([2.5.35],[],[AC_MSG_ERROR([Require flex 2.5.35 or later])]) AC_PATH_PROG([BISON],[bison]) diff --git a/m4/link_options.m4 b/m4/link_options.m4 new file mode 100644 index 00000000..023cfe21 --- /dev/null +++ b/m4/link_options.m4 @@ -0,0 +1,128 @@ +# +# Get the linker version string. +# +# This macro is specific to LLVM. +# +AC_DEFUN([AC_LINK_GET_VERSION], + [AC_CACHE_CHECK([for linker version],[llvm_cv_link_version], + [ + version_string="$(ld -v 2>&1 | head -1)" + + # Check for ld64. + if (echo "$version_string" | grep -q "ld64"); then + llvm_cv_link_version=$(echo "$version_string" | sed -e "s#.*ld64-\([^ ]*\)\( (.*)\)\{0,1\}#\1#") + else + llvm_cv_link_version=$(echo "$version_string" | sed -e "s#[^0-9]*\([0-9.]*\).*#\1#") + fi + ]) + AC_DEFINE_UNQUOTED([HOST_LINK_VERSION],"$llvm_cv_link_version", + [Linker version detected at compile time.]) +]) + +# +# Determine if the system can handle the --gc-sections option being passed to the linker. +# +# This macro is specific to LLVM. +# +AC_DEFUN([AC_LINK_USE_GC_SECTIONS], +[AC_CACHE_CHECK([for compiler -Wl,--gc-sections option],[llvm_cv_link_use_gc_sections], +[ AC_LANG_PUSH([C]) + oldcflags="$CFLAGS" + CFLAGS="$CFLAGS -Wl,--gc-sections" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])], + [llvm_cv_link_use_gc_sections=yes],[llvm_cv_link_use_gc_sections=no]) + CFLAGS="$oldcflags" + AC_LANG_POP([C]) +]) +if test "$llvm_cv_link_use_gc_sections" = yes ; then + AC_SUBST($1,[-Wl,--gc-sections]) + fi +]) + +# +# Determine if the system can handle the -R option being passed to the linker. +# +# This macro is specific to LLVM. +# +AC_DEFUN([AC_LINK_USE_R], +[AC_CACHE_CHECK([for compiler -Wl,-R<path> option],[llvm_cv_link_use_r], +[ AC_LANG_PUSH([C]) + oldcflags="$CFLAGS" + CFLAGS="$CFLAGS -Wl,-R." + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])], + [llvm_cv_link_use_r=yes],[llvm_cv_link_use_r=no]) + CFLAGS="$oldcflags" + AC_LANG_POP([C]) +]) +if test "$llvm_cv_link_use_r" = yes ; then + AC_DEFINE([HAVE_LINK_R],[1],[Define if you can use -Wl,-R. to pass -R. to the linker, in order to add the current directory to the dynamic linker search path.]) + fi +]) + +# +# Determine if the system can handle the -R option being passed to the linker. +# +# This macro is specific to LLVM. +# +AC_DEFUN([AC_LINK_EXPORT_DYNAMIC], +[AC_CACHE_CHECK([for compiler -Wl,-export-dynamic option], + [llvm_cv_link_use_export_dynamic], +[ AC_LANG_PUSH([C]) + oldcflags="$CFLAGS" + CFLAGS="$CFLAGS -Wl,-export-dynamic" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])], + [llvm_cv_link_use_export_dynamic=yes],[llvm_cv_link_use_export_dynamic=no]) + CFLAGS="$oldcflags" + AC_LANG_POP([C]) +]) +if test "$llvm_cv_link_use_export_dynamic" = yes ; then + AC_DEFINE([HAVE_LINK_EXPORT_DYNAMIC],[1],[Define if you can use -Wl,-export-dynamic.]) + fi +]) + +# +# Determine if the system can handle the --version-script option being +# passed to the linker. +# +# This macro is specific to LLVM. +# +AC_DEFUN([AC_LINK_VERSION_SCRIPT], +[AC_CACHE_CHECK([for compiler -Wl,--version-script option], + [llvm_cv_link_use_version_script], +[ AC_LANG_PUSH([C]) + oldcflags="$CFLAGS" + + # The following code is from the autoconf manual, + # "11.13: Limitations of Usual Tools". + # Create a temporary directory $tmp in $TMPDIR (default /tmp). + # Use mktemp if possible; otherwise fall back on mkdir, + # with $RANDOM to make collisions less likely. + : ${TMPDIR=/tmp} + { + tmp=` + (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null + ` && + test -n "$tmp" && test -d "$tmp" + } || { + tmp=$TMPDIR/foo$$-$RANDOM + (umask 077 && mkdir "$tmp") + } || exit $? + + echo "{" > "$tmp/export.map" + echo " global: main;" >> "$tmp/export.map" + echo " local: *;" >> "$tmp/export.map" + echo "};" >> "$tmp/export.map" + + CFLAGS="$CFLAGS -Wl,--version-script=$tmp/export.map" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])], + [llvm_cv_link_use_version_script=yes],[llvm_cv_link_use_version_script=no]) + rm "$tmp/export.map" + rmdir "$tmp" + CFLAGS="$oldcflags" + AC_LANG_POP([C]) +]) +if test "$llvm_cv_link_use_version_script" = yes ; then + AC_SUBST(HAVE_LINK_VERSION_SCRIPT,1) + fi +]) + |