From d681b22ed77274a805c6c8e81925c18eeb57a968 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Tue, 11 Mar 2014 17:58:08 +0000 Subject: [PATCH] automake: ask the linker to do garbage collection By doing GC the linker removes all the symbols that are not referenced and/or used by the final library. This results in a saving of ~100K up-to ~600K per (stripped) binary (classic vs gallium drivers). If interested one can ask the compiler to print the sections that are removed using -Wl,--print-gc-sections. v2: Check if ld supports the flag before using it. Signed-off-by: Emil Velikov Acked-by: Matt Turner (v1) --- configure.ac | 16 ++++++++++++++++ src/egl/main/Makefile.am | 1 + src/egl/wayland/wayland-egl/Makefile.am | 1 + src/gallium/Automake.inc | 4 ++++ src/gallium/targets/egl-static/Makefile.am | 1 + src/gallium/targets/gbm/Makefile.am | 1 + src/gallium/targets/libgl-xlib/Makefile.am | 1 + src/gallium/targets/opencl/Makefile.am | 1 + src/gallium/targets/osmesa/Makefile.am | 1 + src/gallium/targets/pipe-loader/Makefile.am | 1 + src/gallium/targets/xa/Makefile.am | 1 + src/gbm/Makefile.am | 1 + src/glx/Makefile.am | 1 + src/mapi/es1api/Makefile.am | 1 + src/mapi/es2api/Makefile.am | 1 + src/mapi/shared-glapi/Makefile.am | 1 + src/mapi/vgapi/Makefile.am | 1 + src/mesa/drivers/dri/Makefile.am | 1 + src/mesa/drivers/osmesa/Makefile.am | 1 + src/mesa/drivers/x11/Makefile.am | 1 + 20 files changed, 38 insertions(+) diff --git a/configure.ac b/configure.ac index 3055de67a7e..af1b0d1fa40 100644 --- a/configure.ac +++ b/configure.ac @@ -315,6 +315,22 @@ if test "x$enable_debug" = xyes; then fi fi +dnl +dnl Check if linker supports garbage collection +dnl +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";], + [AC_MSG_RESULT([no]) + GC_SECTIONS="";]) +LDFLAGS=$save_LDFLAGS + +AC_SUBST([GC_SECTIONS]) + dnl dnl compatibility symlinks dnl diff --git a/src/egl/main/Makefile.am b/src/egl/main/Makefile.am index 57c9ccd6abb..e4c2539f73c 100644 --- a/src/egl/main/Makefile.am +++ b/src/egl/main/Makefile.am @@ -77,6 +77,7 @@ libEGL_la_LDFLAGS = \ -no-undefined \ -version-number 1:0 \ -Wl,-Bsymbolic \ + $(GC_SECTIONS) \ -Wl,--no-undefined if HAVE_EGL_PLATFORM_X11 diff --git a/src/egl/wayland/wayland-egl/Makefile.am b/src/egl/wayland/wayland-egl/Makefile.am index 3c2673a6486..d3fe11769ec 100644 --- a/src/egl/wayland/wayland-egl/Makefile.am +++ b/src/egl/wayland/wayland-egl/Makefile.am @@ -11,6 +11,7 @@ libwayland_egl_la_SOURCES = wayland-egl.c libwayland_egl_la_LDFLAGS = \ -no-undefined \ -version-info 1 \ + $(GC_SECTIONS) \ -Wl,--no-undefined TESTS = wayland-egl-symbols-check diff --git a/src/gallium/Automake.inc b/src/gallium/Automake.inc index 1151f916bef..56f1433a0f8 100644 --- a/src/gallium/Automake.inc +++ b/src/gallium/Automake.inc @@ -57,6 +57,7 @@ GALLIUM_DRI_LINKER_FLAGS = \ -shared \ -module \ -avoid-version \ + $(GC_SECTIONS) \ -Wl,--version-script=$(DRI_VERSION_SCRIPT) GALLIUM_VDPAU_LINKER_FLAGS = \ @@ -65,6 +66,7 @@ GALLIUM_VDPAU_LINKER_FLAGS = \ -no-undefined \ -version-number $(VDPAU_MAJOR):$(VDPAU_MINOR) \ -export-symbols-regex $(VDPAU_EXPORTS) \ + $(GC_SECTIONS) \ -Wl,--no-undefined GALLIUM_XVMC_LINKER_FLAGS = \ @@ -73,6 +75,7 @@ GALLIUM_XVMC_LINKER_FLAGS = \ -no-undefined \ -version-number $(XVMC_MAJOR):$(XVMC_MINOR) \ -export-symbols-regex '^XvMC' \ + $(GC_SECTIONS) \ -Wl,--no-undefined GALLIUM_OMX_LINKER_FLAGS = \ @@ -80,6 +83,7 @@ GALLIUM_OMX_LINKER_FLAGS = \ -module \ -no-undefined \ -export-symbols-regex $(EXPORTS) \ + $(GC_SECTIONS) \ -Wl,--no-undefined GALLIUM_VDPAU_LIB_DEPS = \ diff --git a/src/gallium/targets/egl-static/Makefile.am b/src/gallium/targets/egl-static/Makefile.am index 55eb3baaa06..58ecf697ce9 100644 --- a/src/gallium/targets/egl-static/Makefile.am +++ b/src/gallium/targets/egl-static/Makefile.am @@ -48,6 +48,7 @@ AM_LDFLAGS = \ -module \ -no-undefined \ -avoid-version \ + $(GC_SECTIONS) \ -Wl,--no-undefined \ -Wl,--version-script=$(top_srcdir)/src/gallium/targets/egl-static/egl.link diff --git a/src/gallium/targets/gbm/Makefile.am b/src/gallium/targets/gbm/Makefile.am index c109ddbb463..22b4826391e 100644 --- a/src/gallium/targets/gbm/Makefile.am +++ b/src/gallium/targets/gbm/Makefile.am @@ -70,6 +70,7 @@ gbm_gallium_drm_la_LDFLAGS = \ -module \ -no-undefined \ -avoid-version \ + $(GC_SECTIONS) \ -Wl,--no-undefined if HAVE_MESA_LLVM diff --git a/src/gallium/targets/libgl-xlib/Makefile.am b/src/gallium/targets/libgl-xlib/Makefile.am index d7aec7b5b50..ef3d23ebcd9 100644 --- a/src/gallium/targets/libgl-xlib/Makefile.am +++ b/src/gallium/targets/libgl-xlib/Makefile.am @@ -47,6 +47,7 @@ libGL_la_SOURCES = xlib.c libGL_la_LDFLAGS = \ -no-undefined \ -version-number $(GL_MAJOR):$(GL_MINOR):$(GL_TINY) \ + $(GC_SECTIONS) \ -Wl,--no-undefined libGL_la_LIBADD = \ diff --git a/src/gallium/targets/opencl/Makefile.am b/src/gallium/targets/opencl/Makefile.am index b401d10d7a7..aae31ff3366 100644 --- a/src/gallium/targets/opencl/Makefile.am +++ b/src/gallium/targets/opencl/Makefile.am @@ -6,6 +6,7 @@ lib@OPENCL_LIBNAME@_la_LDFLAGS = \ $(LLVM_LDFLAGS) \ -no-undefined \ -version-number 1:0 \ + $(GC_SECTIONS) \ -Wl,--no-undefined diff --git a/src/gallium/targets/osmesa/Makefile.am b/src/gallium/targets/osmesa/Makefile.am index 651fc5d2b45..559135cc5fe 100644 --- a/src/gallium/targets/osmesa/Makefile.am +++ b/src/gallium/targets/osmesa/Makefile.am @@ -43,6 +43,7 @@ lib@OSMESA_LIB@_la_LDFLAGS = \ -module \ -no-undefined \ -version-number @OSMESA_VERSION@ \ + $(GC_SECTIONS) \ -Wl,--no-undefined diff --git a/src/gallium/targets/pipe-loader/Makefile.am b/src/gallium/targets/pipe-loader/Makefile.am index 00823fe5bdd..fa463addcc5 100644 --- a/src/gallium/targets/pipe-loader/Makefile.am +++ b/src/gallium/targets/pipe-loader/Makefile.am @@ -49,6 +49,7 @@ AM_LDFLAGS = \ -module \ -no-undefined \ -avoid-version \ + $(GC_SECTIONS) \ -Wl,--no-undefined \ -Wl,--version-script=$(top_srcdir)/src/gallium/targets/pipe-loader/pipe.link diff --git a/src/gallium/targets/xa/Makefile.am b/src/gallium/targets/xa/Makefile.am index 214c51df883..21f29cfa65e 100644 --- a/src/gallium/targets/xa/Makefile.am +++ b/src/gallium/targets/xa/Makefile.am @@ -67,6 +67,7 @@ endif libxatracker_la_LDFLAGS = \ -no-undefined \ -version-number $(XA_MAJOR):$(XA_MINOR):$(XA_TINY) \ + $(GC_SECTIONS) \ -Wl,--no-undefined if HAVE_MESA_LLVM diff --git a/src/gbm/Makefile.am b/src/gbm/Makefile.am index c71a974015b..ea06ce1607d 100644 --- a/src/gbm/Makefile.am +++ b/src/gbm/Makefile.am @@ -22,6 +22,7 @@ libgbm_la_SOURCES = \ libgbm_la_LDFLAGS = \ -no-undefined \ -version-info 1:0 \ + $(GC_SECTIONS) \ -Wl,--no-undefined libgbm_la_LIBADD = \ diff --git a/src/glx/Makefile.am b/src/glx/Makefile.am index 0c99c0709d6..aa7666aa93c 100644 --- a/src/glx/Makefile.am +++ b/src/glx/Makefile.am @@ -112,6 +112,7 @@ GL_LDFLAGS = \ -no-undefined \ -version-number 1:2 \ -Wl,-Bsymbolic \ + $(GC_SECTIONS) \ -Wl,--no-undefined lib@GL_LIB@_la_SOURCES = diff --git a/src/mapi/es1api/Makefile.am b/src/mapi/es1api/Makefile.am index b9581184a96..febb137eafa 100644 --- a/src/mapi/es1api/Makefile.am +++ b/src/mapi/es1api/Makefile.am @@ -47,6 +47,7 @@ libGLESv1_CM_la_LIBADD = $(GLESv1_CM_LIB_DEPS) libGLESv1_CM_la_LDFLAGS = \ -no-undefined \ -version-number 1:1 \ + $(GC_SECTIONS) \ -Wl,--no-undefined if HAVE_SHARED_GLAPI diff --git a/src/mapi/es2api/Makefile.am b/src/mapi/es2api/Makefile.am index 1fb6d7c9604..e694a36e5d3 100644 --- a/src/mapi/es2api/Makefile.am +++ b/src/mapi/es2api/Makefile.am @@ -51,6 +51,7 @@ libGLESv2_la_LIBADD = $(GLESv2_LIB_DEPS) libGLESv2_la_LDFLAGS = \ -no-undefined \ -version-number 2 \ + $(GC_SECTIONS) \ -Wl,--no-undefined if HAVE_SHARED_GLAPI diff --git a/src/mapi/shared-glapi/Makefile.am b/src/mapi/shared-glapi/Makefile.am index 7e1068fdfec..33a939a90f9 100644 --- a/src/mapi/shared-glapi/Makefile.am +++ b/src/mapi/shared-glapi/Makefile.am @@ -11,6 +11,7 @@ libglapi_la_SOURCES = $(MAPI_GLAPI_FILES) libglapi_la_LIBADD = $(PTHREAD_LIBS) $(SELINUX_LIBS) libglapi_la_LDFLAGS = \ -no-undefined \ + $(GC_SECTIONS) \ -Wl,--no-undefined include $(GLAPI)/gen/glapi_gen.mk diff --git a/src/mapi/vgapi/Makefile.am b/src/mapi/vgapi/Makefile.am index f85addc7c31..f946b9bb6f9 100644 --- a/src/mapi/vgapi/Makefile.am +++ b/src/mapi/vgapi/Makefile.am @@ -47,6 +47,7 @@ libOpenVG_la_LIBADD = $(VG_LIB_DEPS) libOpenVG_la_LDFLAGS = \ -no-undefined \ -version-number 1 \ + $(GC_SECTIONS) \ -Wl,--no-undefined vgapi_tmp.h: $(srcdir)/vgapi.csv $(top_srcdir)/src/mapi/mapi_abi.py diff --git a/src/mesa/drivers/dri/Makefile.am b/src/mesa/drivers/dri/Makefile.am index 17ac76be11f..f1fee122cb7 100644 --- a/src/mesa/drivers/dri/Makefile.am +++ b/src/mesa/drivers/dri/Makefile.am @@ -53,6 +53,7 @@ mesa_dri_drivers_la_SOURCES = mesa_dri_drivers_la_LDFLAGS = \ -module -avoid-version -shared \ -Wl,-Bsymbolic \ + $(GC_SECTIONS) \ $() mesa_dri_drivers_la_LIBADD = \ ../../libmesa.la \ diff --git a/src/mesa/drivers/osmesa/Makefile.am b/src/mesa/drivers/osmesa/Makefile.am index cfab70216ac..b133fd67922 100644 --- a/src/mesa/drivers/osmesa/Makefile.am +++ b/src/mesa/drivers/osmesa/Makefile.am @@ -39,6 +39,7 @@ lib@OSMESA_LIB@_la_LDFLAGS = \ -module \ -no-undefined \ -version-number @OSMESA_VERSION@ \ + $(GC_SECTIONS) \ -Wl,--no-undefined diff --git a/src/mesa/drivers/x11/Makefile.am b/src/mesa/drivers/x11/Makefile.am index 4c63d59a57c..2b38ad31101 100644 --- a/src/mesa/drivers/x11/Makefile.am +++ b/src/mesa/drivers/x11/Makefile.am @@ -64,6 +64,7 @@ lib@GL_LIB@_la_LIBADD = \ lib@GL_LIB@_la_LDFLAGS = \ -no-undefined \ -version-number $(GL_MAJOR):$(GL_MINOR):$(GL_PATCH) \ + $(GC_SECTIONS) \ -Wl,--no-undefined include $(top_srcdir)/install-lib-links.mk -- 2.30.2