Makefile: Enable linker garbage collection

This patch enables -ffunction-sections, -fdata-sections and
-Wl,--gc-sections for host builds. These flags already get passed by
firmware builds anyway, so having host builds match that behavior should
be a good idea in general. They may also occasionally help save a bit of
code size (though not much since vboot is a library, but I still get
about half a KB out of futility), and they will prevent clang from
omitting relocations for function calls inside the same file, which
means we don't have to splatter test_mockable all over our codebase
anymore. (We still need it for vb2_get_gbb() since that is so small that
both GCC and clang want to inline it, even if they are outputting a
discrete copy anyway.)

(Also add a comment about why GenerateGuid() has nothing do to with this
even though it is also a weak function, and why it is like that.)

BRANCH=None
BUG=chromium:991812
TEST=make runtests with both GCC and clang

Change-Id: Iede9d29e20b99b75a0c86bc7ecb907d2a0e5e3a1
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1754969
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/Makefile b/Makefile
index 708d490..14fc2fa 100644
--- a/Makefile
+++ b/Makefile
@@ -141,7 +141,8 @@
 COMMON_FLAGS := -pipe ${WERROR} -Wall -Wstrict-prototypes -Wtype-limits \
 	-Wundef -Wmissing-prototypes -Wno-trigraphs -Wredundant-decls \
 	-Wwrite-strings -Wstrict-aliasing -Wshadow -Wdate-time \
-	-Wno-address-of-packed-member ${DEBUG_FLAGS}
+	-Wno-address-of-packed-member -ffunction-sections -fdata-sections \
+	${DEBUG_FLAGS}
 
 # Note: FIRMWARE_ARCH is defined by the Chromium OS ebuild.
 ifeq (${FIRMWARE_ARCH}, arm)
@@ -151,7 +152,7 @@
 else ifeq (${FIRMWARE_ARCH}, x86)
 CC ?= i686-pc-linux-gnu-gcc
 # Drop -march=i386 to permit use of SSE instructions
-CFLAGS ?= -ffunction-sections -fvisibility=hidden -fomit-frame-pointer \
+CFLAGS ?= -fvisibility=hidden -fomit-frame-pointer \
 	-fno-toplevel-reorder -fno-dwarf2-cfi-asm -mpreferred-stack-boundary=2 \
 	${FIRMWARE_FLAGS} ${COMMON_FLAGS}
 else ifeq (${FIRMWARE_ARCH}, x86_64)
@@ -164,6 +165,9 @@
 CHROMEOS_ENVIRONMENT = 1
 endif
 
+# Needs -Wl because LD is actually set to CC by default.
+LDFLAGS ?= -Wl,--gc-sections
+
 ifneq (${DEBUG},)
 CFLAGS += -DVBOOT_DEBUG
 endif
diff --git a/cgpt/cgpt_common.c b/cgpt/cgpt_common.c
index db180be..e98a453 100644
--- a/cgpt/cgpt_common.c
+++ b/cgpt/cgpt_common.c
@@ -1086,7 +1086,15 @@
   }
 }
 
-/* Optional */
+/*
+ * This is here because some CGPT functionality is provided in libvboot_host.a
+ * for other host utilities. GenerateGuid() is implemented (in cgpt.c which is
+ * *not* linked into libvboot_host.a) by calling into libuuid. We don't want to
+ * mandate libuuid as a dependency for every utilitity that wants to link
+ * libvboot_host.a, since they usually don't use the functionality that needs
+ * to generate new UUIDs anyway (just other functionality implemented in the
+ * same files).
+ */
 #ifndef HAVE_MACOS
 __attribute__((weak)) int GenerateGuid(Guid *newguid) { return CGPT_FAILED; };
 #endif
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index 01106c0..7f00ddc 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -34,13 +34,6 @@
 struct vb2_context;
 typedef struct VbSharedDataHeader VbSharedDataHeader;
 
-/*
- * Define test_mockable for mocking functions.
- */
-#ifndef test_mockable
-#define test_mockable __attribute__((weak))
-#endif
-
 
 /*****************************************************************************/
 /* Main entry points from firmware into vboot_reference */
diff --git a/firmware/lib20/packed_key.c b/firmware/lib20/packed_key.c
index af888e6..42c6622 100644
--- a/firmware/lib20/packed_key.c
+++ b/firmware/lib20/packed_key.c
@@ -10,7 +10,6 @@
 #include "2rsa.h"
 #include "vb2_common.h"
 
-test_mockable
 vb2_error_t vb2_unpack_key_buffer(struct vb2_public_key *key,
 				  const uint8_t *buf, uint32_t size)
 {
diff --git a/firmware/stub/vboot_api_stub_init.c b/firmware/stub/vboot_api_stub_init.c
index 8fbc31d..7dc4c01 100644
--- a/firmware/stub/vboot_api_stub_init.c
+++ b/firmware/stub/vboot_api_stub_init.c
@@ -23,7 +23,7 @@
 	return (uint64_t)tv.tv_sec * VB_USEC_PER_SEC + (uint64_t)tv.tv_usec;
 }
 
-vb2_error_t test_mockable VbExNvStorageRead(uint8_t *buf)
+vb2_error_t VbExNvStorageRead(uint8_t *buf)
 {
 	return VB2_SUCCESS;
 }