From 14c34c3d49319a0fea937d54167602c43ff9d93f Mon Sep 17 00:00:00 2001 From: Antonio Russo Date: Sat, 14 Nov 2020 21:35:31 -0700 Subject: [PATCH] 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 Signed-off-by: Antonio Russo Closes #11144 --- Makefile.am | 7 +++++++ config/Abigail.am | 29 +++++++++++++++++++++++++++ lib/Makefile.am | 19 +++++++++++++++++- lib/libnvpair/Makefile.am | 3 +++ lib/libnvpair/libnvpair.suppr | 2 ++ lib/libuutil/Makefile.am | 3 +++ lib/libuutil/libuutil.suppr | 2 ++ lib/libzfs/Makefile.am | 3 +++ lib/libzfs/libzfs.suppr | 13 ++++++++++++ lib/libzfs_core/Makefile.am | 3 +++ lib/libzfs_core/libzfs_core.suppr | 5 +++++ lib/libzfsbootenv/Makefile.am | 3 +++ lib/libzfsbootenv/libzfsbootenv.suppr | 2 ++ 13 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 config/Abigail.am create mode 100644 lib/libnvpair/libnvpair.suppr create mode 100644 lib/libuutil/libuutil.suppr create mode 100644 lib/libzfs/libzfs.suppr create mode 100644 lib/libzfs_core/libzfs_core.suppr create mode 100644 lib/libzfsbootenv/libzfsbootenv.suppr diff --git a/Makefile.am b/Makefile.am index 4aaa0ad568..eac1a3e97e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -136,6 +136,13 @@ shellcheck: echo "skipping shellcheck because shellcheck is not installed"; \ fi +PHONY += checkabi storeabi +checkabi: lib + $(MAKE) -C lib checkabi + +storeabi: lib + $(MAKE) -C lib storeabi + PHONY += checkbashisms checkbashisms: @if type checkbashisms > /dev/null 2>&1; then \ diff --git a/config/Abigail.am b/config/Abigail.am new file mode 100644 index 0000000000..599f611942 --- /dev/null +++ b/config/Abigail.am @@ -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 diff --git a/lib/Makefile.am b/lib/Makefile.am index f049288a1a..685c7b6695 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -15,4 +15,21 @@ SUBDIRS += libzutil libunicode # These five libraries, which are installed as the final build product, # 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 diff --git a/lib/libnvpair/Makefile.am b/lib/libnvpair/Makefile.am index f23ac3cdf7..8d5a62980b 100644 --- a/lib/libnvpair/Makefile.am +++ b/lib/libnvpair/Makefile.am @@ -1,4 +1,5 @@ include $(top_srcdir)/config/Rules.am +PHONY = VPATH = \ $(top_srcdir)/module/nvpair \ @@ -10,6 +11,8 @@ AM_CFLAGS += $(FRAME_LARGER_THAN) $(LIBTIRPC_CFLAGS) lib_LTLIBRARIES = libnvpair.la +include $(top_srcdir)/config/Abigail.am + USER_C = \ libnvpair.c \ libnvpair_json.c \ diff --git a/lib/libnvpair/libnvpair.suppr b/lib/libnvpair/libnvpair.suppr new file mode 100644 index 0000000000..f4db8a49e4 --- /dev/null +++ b/lib/libnvpair/libnvpair.suppr @@ -0,0 +1,2 @@ +[suppress_type] + name = FILE* diff --git a/lib/libuutil/Makefile.am b/lib/libuutil/Makefile.am index 4bce1609fc..6f1fb4433e 100644 --- a/lib/libuutil/Makefile.am +++ b/lib/libuutil/Makefile.am @@ -1,7 +1,10 @@ include $(top_srcdir)/config/Rules.am +PHONY = lib_LTLIBRARIES = libuutil.la +include $(top_srcdir)/config/Abigail.am + USER_C = \ uu_alloc.c \ uu_avl.c \ diff --git a/lib/libuutil/libuutil.suppr b/lib/libuutil/libuutil.suppr new file mode 100644 index 0000000000..f4db8a49e4 --- /dev/null +++ b/lib/libuutil/libuutil.suppr @@ -0,0 +1,2 @@ +[suppress_type] + name = FILE* diff --git a/lib/libzfs/Makefile.am b/lib/libzfs/Makefile.am index bfa5b2a1ff..0b0d7b075a 100644 --- a/lib/libzfs/Makefile.am +++ b/lib/libzfs/Makefile.am @@ -1,4 +1,5 @@ include $(top_srcdir)/config/Rules.am +PHONY = VPATH = \ $(top_srcdir)/module/icp \ @@ -13,6 +14,8 @@ pkgconfig_DATA = libzfs.pc lib_LTLIBRARIES = libzfs.la +include $(top_srcdir)/config/Abigail.am + USER_C = \ libzfs_changelist.c \ libzfs_config.c \ diff --git a/lib/libzfs/libzfs.suppr b/lib/libzfs/libzfs.suppr new file mode 100644 index 0000000000..d55b5b7281 --- /dev/null +++ b/lib/libzfs/libzfs.suppr @@ -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 diff --git a/lib/libzfs_core/Makefile.am b/lib/libzfs_core/Makefile.am index fb44f1b190..5f1564399d 100644 --- a/lib/libzfs_core/Makefile.am +++ b/lib/libzfs_core/Makefile.am @@ -1,9 +1,12 @@ include $(top_srcdir)/config/Rules.am +PHONY = pkgconfig_DATA = libzfs_core.pc lib_LTLIBRARIES = libzfs_core.la +include $(top_srcdir)/config/Abigail.am + USER_C = \ libzfs_core.c diff --git a/lib/libzfs_core/libzfs_core.suppr b/lib/libzfs_core/libzfs_core.suppr new file mode 100644 index 0000000000..109d331cfd --- /dev/null +++ b/lib/libzfs_core/libzfs_core.suppr @@ -0,0 +1,5 @@ +[suppress_type] + name = FILE* + +[suppress_type] + name = pthread_cond_t diff --git a/lib/libzfsbootenv/Makefile.am b/lib/libzfsbootenv/Makefile.am index 6b9a8f0137..354be3efa8 100644 --- a/lib/libzfsbootenv/Makefile.am +++ b/lib/libzfsbootenv/Makefile.am @@ -1,9 +1,12 @@ include $(top_srcdir)/config/Rules.am +PHONY = pkgconfig_DATA = libzfsbootenv.pc lib_LTLIBRARIES = libzfsbootenv.la +include $(top_srcdir)/config/Abigail.am + if BUILD_FREEBSD DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/freebsd/zfs endif diff --git a/lib/libzfsbootenv/libzfsbootenv.suppr b/lib/libzfsbootenv/libzfsbootenv.suppr new file mode 100644 index 0000000000..f4db8a49e4 --- /dev/null +++ b/lib/libzfsbootenv/libzfsbootenv.suppr @@ -0,0 +1,2 @@ +[suppress_type] + name = FILE*