Library ABI tracking with abigail

Provide two make targets: checkabi and storeabi.

storeabi uses libabigail to generate a reference copy of the ABI for the
public libraries.

checkabi compares such a reference to the compiled version, failing if
they are not compatible.  No ABI is generated for libzpool.so, it is
only used by ztest and zdb and not external consumers.

Co-authored-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Antonio Russo <aerusso@aerusso.net>
Closes #11144
This commit is contained in:
Antonio Russo 2020-11-14 21:35:31 -07:00 committed by Brian Behlendorf
parent e6c59cd171
commit 14c34c3d49
13 changed files with 93 additions and 1 deletions

View File

@ -136,6 +136,13 @@ shellcheck:
echo "skipping shellcheck because shellcheck is not installed"; \ echo "skipping shellcheck because shellcheck is not installed"; \
fi fi
PHONY += checkabi storeabi
checkabi: lib
$(MAKE) -C lib checkabi
storeabi: lib
$(MAKE) -C lib storeabi
PHONY += checkbashisms PHONY += checkbashisms
checkbashisms: checkbashisms:
@if type checkbashisms > /dev/null 2>&1; then \ @if type checkbashisms > /dev/null 2>&1; then \

29
config/Abigail.am Normal file
View File

@ -0,0 +1,29 @@
#
# When performing an ABI check the following options are applied:
#
# --no-unreferenced-symbols: Exclude symbols which are not referenced by
# any debug information. Without this _init() and _fini() are incorrectly
# reported on CentOS7 for libuutil.so.
#
# --headers-dir1: Limit ABI checks to public OpenZFS headers, otherwise
# changes in public system headers are also reported.
#
# --suppressions: Honor a suppressions file for each library to provide
# a mechanism for suppressing harmless warnings.
#
PHONY += checkabi storeabi
checkabi:
for lib in $(lib_LTLIBRARIES) ; do \
abidiff --no-unreferenced-symbols \
--headers-dir1 ../../include \
--suppressions $${lib%.la}.suppr \
$${lib%.la}.abi .libs/$${lib%.la}.so ; \
done
storeabi:
cd .libs ; \
for lib in $(lib_LTLIBRARIES) ; do \
abidw $${lib%.la}.so > ../$${lib%.la}.abi ; \
done

View File

@ -15,4 +15,21 @@ SUBDIRS += libzutil libunicode
# These five libraries, which are installed as the final build product, # These five libraries, which are installed as the final build product,
# incorporate the eight convenience libraries given above. # incorporate the eight convenience libraries given above.
SUBDIRS += libuutil libzfs_core libzfs libzpool libzfsbootenv DISTLIBS = libuutil libzfs_core libzfs libzpool libzfsbootenv
SUBDIRS += $(DISTLIBS)
DISTLIBS += libnvpair
# An ABI is stored for each of these libraries. Note that libzpool.so
# is only linked against by ztest and zdb and no stable ABI is provided.
ABILIBS = libnvpair libuutil libzfs_core libzfs libzfsbootenv
PHONY = checkabi storeabi
checkabi: $(ABILIBS)
set -e ; for dir in $(ABILIBS) ; do \
$(MAKE) -C $$dir checkabi ; \
done
storeabi: $(ABILIBS)
set -e ; for dir in $(ABILIBS) ; do \
$(MAKE) -C $$dir storeabi ; \
done

View File

@ -1,4 +1,5 @@
include $(top_srcdir)/config/Rules.am include $(top_srcdir)/config/Rules.am
PHONY =
VPATH = \ VPATH = \
$(top_srcdir)/module/nvpair \ $(top_srcdir)/module/nvpair \
@ -10,6 +11,8 @@ AM_CFLAGS += $(FRAME_LARGER_THAN) $(LIBTIRPC_CFLAGS)
lib_LTLIBRARIES = libnvpair.la lib_LTLIBRARIES = libnvpair.la
include $(top_srcdir)/config/Abigail.am
USER_C = \ USER_C = \
libnvpair.c \ libnvpair.c \
libnvpair_json.c \ libnvpair_json.c \

View File

@ -0,0 +1,2 @@
[suppress_type]
name = FILE*

View File

@ -1,7 +1,10 @@
include $(top_srcdir)/config/Rules.am include $(top_srcdir)/config/Rules.am
PHONY =
lib_LTLIBRARIES = libuutil.la lib_LTLIBRARIES = libuutil.la
include $(top_srcdir)/config/Abigail.am
USER_C = \ USER_C = \
uu_alloc.c \ uu_alloc.c \
uu_avl.c \ uu_avl.c \

View File

@ -0,0 +1,2 @@
[suppress_type]
name = FILE*

View File

@ -1,4 +1,5 @@
include $(top_srcdir)/config/Rules.am include $(top_srcdir)/config/Rules.am
PHONY =
VPATH = \ VPATH = \
$(top_srcdir)/module/icp \ $(top_srcdir)/module/icp \
@ -13,6 +14,8 @@ pkgconfig_DATA = libzfs.pc
lib_LTLIBRARIES = libzfs.la lib_LTLIBRARIES = libzfs.la
include $(top_srcdir)/config/Abigail.am
USER_C = \ USER_C = \
libzfs_changelist.c \ libzfs_changelist.c \
libzfs_config.c \ libzfs_config.c \

13
lib/libzfs/libzfs.suppr Normal file
View File

@ -0,0 +1,13 @@
[suppress_type]
name = FILE*
[suppress_type]
type_kind = typedef
name = SHA256_CTX
[suppress_type]
type_kind = typedef
name = SHA2_CTX
[suppress_variable]
name = zfs_deleg_perm_tab

View File

@ -1,9 +1,12 @@
include $(top_srcdir)/config/Rules.am include $(top_srcdir)/config/Rules.am
PHONY =
pkgconfig_DATA = libzfs_core.pc pkgconfig_DATA = libzfs_core.pc
lib_LTLIBRARIES = libzfs_core.la lib_LTLIBRARIES = libzfs_core.la
include $(top_srcdir)/config/Abigail.am
USER_C = \ USER_C = \
libzfs_core.c libzfs_core.c

View File

@ -0,0 +1,5 @@
[suppress_type]
name = FILE*
[suppress_type]
name = pthread_cond_t

View File

@ -1,9 +1,12 @@
include $(top_srcdir)/config/Rules.am include $(top_srcdir)/config/Rules.am
PHONY =
pkgconfig_DATA = libzfsbootenv.pc pkgconfig_DATA = libzfsbootenv.pc
lib_LTLIBRARIES = libzfsbootenv.la lib_LTLIBRARIES = libzfsbootenv.la
include $(top_srcdir)/config/Abigail.am
if BUILD_FREEBSD if BUILD_FREEBSD
DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/freebsd/zfs DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/freebsd/zfs
endif endif

View File

@ -0,0 +1,2 @@
[suppress_type]
name = FILE*