diff options
author | Alex Deymo <deymo@chromium.org> | 2014-08-29 01:07:48 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-09-02 20:25:22 +0000 |
commit | e08ee28548934e933733babf0bc0c418142d095d (patch) | |
tree | b630ca1f2c498a0b53ffafad712a9efeb1939567 /Makefile | |
parent | b8ff397674fb98c1d7eea864e7fa571369675131 (diff) | |
download | vboot-e08ee28548934e933733babf0bc0c418142d095d.tar.gz |
Remove futility linker script.
The futility.lds linker script was used to generate a table with
all the symbols in a specific section called .futil_cmds listed
in order under the symbol "futil_cmds". This allows the source files
to define a command and let the linker figure out the list of
compiled commands. Nevertheless, passing this linker script
makes the linker leave a gap of about 2MiB in the output ELF file.
Instead of mess up with linker scripts just to generate a table of
commands, this patch generates such table in the Makefile looking
at the included sources and compiling that table. The result is a
futility binary of about 88 KiB instead of the 2.1 MiB required
originally.
This patch also adds sys-boot/chromeos-u-boot to the list of ebuilds
tested by emerge_test.sh.
BUG=chromium:408926
BRANCH=None
TEST=BOARD=link ./emerge_test.sh
TEST=BOARD=daisy_spring ./emerge_test.sh
TEST=`readelf -S futility` shows no gap.
TEST=/usr/bin/futility shows no difference in the help output.
Change-Id: I9c0febc76140b404d48aa13e7f948e8ea77a41b5
Reviewed-on: https://chromium-review.googlesource.com/215496
Tested-by: Alex Deymo <deymo@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Commit-Queue: Alex Deymo <deymo@chromium.org>
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 48 |
1 files changed, 38 insertions, 10 deletions
@@ -551,10 +551,13 @@ FUTIL_SRCS += \ futility/cmd_vb2_verify_fw.c endif -FUTIL_LDS = futility/futility.lds +# List of commands built in futility and futility_s. +FUTIL_STATIC_CMD_LIST = ${BUILD}/gen/futility_static_cmds.c +FUTIL_CMD_LIST = ${BUILD}/gen/futility_cmds.c -FUTIL_STATIC_OBJS = ${FUTIL_STATIC_SRCS:%.c=${BUILD}/%.o} -FUTIL_OBJS = ${FUTIL_SRCS:%.c=${BUILD}/%.o} +FUTIL_STATIC_OBJS = ${FUTIL_STATIC_SRCS:%.c=${BUILD}/%.o} \ + ${FUTIL_STATIC_CMD_LIST:%.c=%.o} +FUTIL_OBJS = ${FUTIL_SRCS:%.c=${BUILD}/%.o} ${FUTIL_CMD_LIST:%.c=%.o} ALL_OBJS += ${FUTIL_OBJS} @@ -880,12 +883,12 @@ signing_install: ${SIGNING_SCRIPTS} ${SIGNING_SCRIPTS_DEV} ${SIGNING_COMMON} .PHONY: futil futil: ${FUTIL_STATIC_BIN} ${FUTIL_BIN} -${FUTIL_STATIC_BIN}: ${FUTIL_LDS} ${FUTIL_STATIC_OBJS} ${UTILLIB} +${FUTIL_STATIC_BIN}: ${FUTIL_STATIC_OBJS} ${UTILLIB} @$(PRINTF) " LD $(subst ${BUILD}/,,$@)\n" ${Q}${LD} -o $@ ${CFLAGS} ${LDFLAGS} -static $^ ${LDLIBS} ${FUTIL_BIN}: LDLIBS += ${CRYPTO_LIBS} -${FUTIL_BIN}: ${FUTIL_LDS} ${FUTIL_OBJS} ${UTILLIB} +${FUTIL_BIN}: ${FUTIL_OBJS} ${UTILLIB} @$(PRINTF) " LD $(subst ${BUILD}/,,$@)\n" ${Q}${LD} -o $@ ${CFLAGS} ${LDFLAGS} $^ ${LDLIBS} @@ -942,6 +945,10 @@ ${BUILD}/%.o: %.c @$(PRINTF) " CC $(subst ${BUILD}/,,$@)\n" ${Q}${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $< +${BUILD}/%.o: ${BUILD}/%.c + @$(PRINTF) " CC $(subst ${BUILD}/,,$@)\n" + ${Q}${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $< + # Rules to recompile a single source file for library and test # TODO: is there a tidier way to do this? ${BUILD}/%_for_lib.o: CFLAGS += -DFOR_LIBRARY @@ -962,11 +969,6 @@ ${BUILD}/%.o: %.cc # ---------------------------------------------------------------------------- # Here are the special tweaks to the generic rules. -# Because we play some clever linker script games to add new commands without -# changing any header files, futility must be linked with ld.bfd, not gold. -${FUTIL_BIN}: LDFLAGS += -fuse-ld=bfd -${FUTIL_STATIC_BIN}: LDFLAGS += -fuse-ld=bfd - # Some utilities need external crypto functions CRYPTO_LIBS := $(shell ${PKG_CONFIG} --libs libcrypto) @@ -1029,6 +1031,32 @@ ${TLCL_TEST_BINS}: OBJS += ${BUILD}/tests/tpm_lite/tlcl_tests.o ${TLCL_TEST_BINS}: ${BUILD}/tests/tpm_lite/tlcl_tests.o ALL_OBJS += ${BUILD}/tests/tpm_lite/tlcl_tests.o +# ---------------------------------------------------------------------------- +# Here are the special rules that don't fit in the generic rules. + +# Generates the list of commands defined in futility by running grep in the +# source files looking for the DECLARE_FUTIL_COMMAND() macro usage. +${FUTIL_STATIC_CMD_LIST}: ${FUTIL_STATIC_SRCS} +${FUTIL_CMD_LIST}: ${FUTIL_SRCS} +${FUTIL_CMD_LIST} ${FUTIL_STATIC_CMD_LIST}: + @$(PRINTF) " GEN $(subst ${BUILD}/,,$@)\n" + ${Q}rm -f $@ $@_t $@_commands + ${Q}mkdir -p ${BUILD}/gen + ${Q}grep -hoRE '^DECLARE_FUTIL_COMMAND\([^,]+' $^ -R \ + | sed 's/DECLARE_FUTIL_COMMAND(\(.*\)/_CMD(\1)/' \ + | sort >>$@_commands + ${Q}echo '#define _CMD(NAME) extern const struct' \ + 'futil_cmd_t __cmd_##NAME;' >> $@_t + ${Q}cat $@_commands >> $@_t + ${Q}echo '#undef _CMD' >> $@_t + ${Q}echo '#define _CMD(NAME) &__cmd_##NAME,' >> $@_t + ${Q}echo 'const struct futil_cmd_t *const futil_cmds[] = {' >> $@_t + ${Q}cat $@_commands >> $@_t + ${Q}echo '0}; /* null-terminated */' >> $@_t + ${Q}echo '#undef _CMD' >> $@_t + ${Q}mv $@_t $@ + ${Q}rm -f $@_commands + ############################################################################## # Targets that exist just to run tests |