summaryrefslogtreecommitdiff
path: root/configure.ac
diff options
context:
space:
mode:
authorEmil Velikov <emil.l.velikov@gmail.com>2021-11-21 17:38:38 +0000
committerEmil Velikov <emil.l.velikov@gmail.com>2021-11-21 19:28:46 +0000
commitfc0758237548328941fa7a9699510d6f357896ed (patch)
tree219948ee477a74f694468f9af9bc127d2471c152 /configure.ac
parent3beea10fceea4d58958aaafcdbcf1264b667613f (diff)
downloadlibarchive-fc0758237548328941fa7a9699510d6f357896ed.tar.gz
autotools: enable -fdata/function-sections and --gc-sections
Analogue to the parent cmake commit, with linker flag detection. The former two split the functions and data into separate sections within the object file. Which makes it easier for the latter to properly garbage collect and discard unused sections. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Diffstat (limited to 'configure.ac')
-rw-r--r--configure.ac16
1 files changed, 16 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index cb89c3ee..c8295e4a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -540,6 +540,22 @@ fi
# Checks for supported compiler flags
AX_APPEND_COMPILE_FLAGS([-Wall -Wformat -Wformat-security])
+# Place the functions and data into separate sections, allowing the linker
+# to garbage collect the unused ones.
+save_LDFLAGS=$LDFLAGS
+LDFLAGS="$LDFLAGS -Wl,--gc-sections"
+AC_MSG_CHECKING([whether ld supports --gc-sections])
+AC_LINK_IFELSE(
+ [AC_LANG_SOURCE([static char UnusedFunc() { return 5; } int main() { return 0;}])],
+ [AC_MSG_RESULT([yes])
+ GC_SECTIONS="-Wl,--gc-sections";
+ AX_APPEND_COMPILE_FLAGS([-ffunction-sections -fdata-sections])],
+ [AC_MSG_RESULT([no])
+ GC_SECTIONS="";])
+LDFLAGS=$save_LDFLAGS
+
+AC_SUBST(GC_SECTIONS)
+
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
# la_TYPE_UID_T defaults to "int", which is incorrect for MinGW