From: Carl Worth Date: Thu, 30 May 2013 22:10:15 +0000 (-0700) Subject: Makefile: Automatically generate libfips.sym symbol map X-Git-Url: https://git.cworth.org/git?p=fips;a=commitdiff_plain;h=c063b28a99d7ee825bcc84e00737469049592169 Makefile: Automatically generate libfips.sym symbol map Previously, we had to manually maintain this table of symbols, (hence it was too easy for the list to be stale). Instead, we now generate the list automatically by examining the source code for symbols that are wrapped. --- diff --git a/.gitignore b/.gitignore index f95e49b..9bc128e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ config.h fips libfips-32.so libfips-64.so +libfips.sym *.o *~ diff --git a/Makefile.local b/Makefile.local index c81b076..123de57 100644 --- a/Makefile.local +++ b/Makefile.local @@ -89,6 +89,9 @@ ifeq ($(HAVE_EGL),Yes) libfips_srcs += eglwrap.c endif +libfips.sym: extract-wrapped-symbols $(libfips_srcs) + $(call quiet,extract-wrapped-symbols) ./extract-wrapped-symbols $(libfips_srcs) > $@ + libfips_32_modules = $(libfips_srcs:.c=-32.o) libfips_64_modules = $(libfips_srcs:.c=-64.o) @@ -113,7 +116,7 @@ ifeq ($(MAKECMDGOALS), install) endif SRCS := $(SRCS) $(fips_srcs) $(libfips_srcs) -CLEAN := $(CLEAN) fips $(fips_modules) $(libfips_32_modules) $(libfips_64_modules) +CLEAN := $(CLEAN) fips $(fips_modules) $(libfips_32_modules) $(libfips_64_modules) libfips.sym DISTCLEAN := $(DISTCLEAN) .first-build-message Makefile.config diff --git a/extract-wrapped-symbols b/extract-wrapped-symbols new file mode 100755 index 0000000..2b9f76a --- /dev/null +++ b/extract-wrapped-symbols @@ -0,0 +1,41 @@ +#!/bin/sh + +# Extract symbols from the fips source code for functions that are wrapped. + +# Output is a version script, (suitable to be passed to the linker +# through a compiler flag -f -Wl,--version-script=), which +# indicates that the extracted symbols should be exported from +# libfips, while all other symbols are private. + +# We have two different patterns for identifying wrapped +# functions. The first is a call to a macro ending in "DEFER" (such as +# DEFER or TIMED_DEFER). In this case, the first argument to the macro +# is the name of the wrapped function. + +deferred=`grep 'DEFER[ (]*e*gl' $@ | sed -s 's/.*DEFER *(\([^,)]*\).*/\1/'` + +# The second-case is functions for which we either implement or call +# the underlying "real" function. In these cases, the code uses the +# convention of having a function or a function-pointer with a name of +# the form *wrap_real_ + +wrapped=`grep wrap_real_ $@ | sed -e 's/.*wrap_real_\([a-zA-Z0-9_]*\).*/\1/'` + +# With those two lists collected, all we need is a simple template for +# a version script, along with alphabetic sorting and uniquifying of +# the list, (and adding tabs for nice-looking indentation and ';' +# separators). + +cat <