Petr Šabata 4c6e63
commit c5b0a640f0f7d2a195b822bcd88bb379476dbb97
Petr Šabata 4c6e63
Author: Mark Wielaard <mark@klomp.org>
Petr Šabata 4c6e63
Date:   Fri Sep 18 12:49:29 2020 +0200
Petr Šabata 4c6e63
Petr Šabata 4c6e63
    zstd support
Petr Šabata 4c6e63
Petr Šabata 4c6e63
diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in
Petr Šabata 4c6e63
index 95f63f5a..37af1b07 100644
Petr Šabata 4c6e63
--- a/config/elfutils.spec.in
Petr Šabata 4c6e63
+++ b/config/elfutils.spec.in
Petr Šabata 4c6e63
@@ -24,6 +24,7 @@ BuildRequires: flex
Petr Šabata 4c6e63
 BuildRequires: zlib-devel
Petr Šabata 4c6e63
 BuildRequires: bzip2-devel
Petr Šabata 4c6e63
 BuildRequires: xz-devel
Petr Šabata 4c6e63
+BuildRequires: libzstd-devel
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 # For debuginfod
Petr Šabata 4c6e63
 BuildRequires: pkgconfig(libmicrohttpd) >= 0.9.33
Petr Šabata 4c6e63
@@ -33,6 +34,7 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 # For tests need to bunzip2 test files.
Petr Šabata 4c6e63
 BuildRequires: bzip2
Petr Šabata 4c6e63
+BuildRequires: zstd
Petr Šabata 4c6e63
 # For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss
Petr Šabata 4c6e63
 BuildRequires: iproute
Petr Šabata 4c6e63
 BuildRequires: bsdtar
Petr Šabata 4c6e63
diff --git a/config/libdw.pc.in b/config/libdw.pc.in
Petr Šabata 4c6e63
index 3fc283db..2e83a432 100644
Petr Šabata 4c6e63
--- a/config/libdw.pc.in
Petr Šabata 4c6e63
+++ b/config/libdw.pc.in
Petr Šabata 4c6e63
@@ -17,6 +17,6 @@ Requires: libelf = @VERSION@
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 # We support various compressed ELF images, but don't export any of the
Petr Šabata 4c6e63
 # data structures or functions.  zlib (gz) is always required, bzip2 (bz2)
Petr Šabata 4c6e63
-# and lzma (xz) are optional.  But bzip2 doesn't have a pkg-config file.
Petr Šabata 4c6e63
-Requires.private: zlib @LIBLZMA@
Petr Šabata 4c6e63
+# lzma (xz) and zstd () are optional. But bzip2 doesn't have a pkg-config file.
Petr Šabata 4c6e63
+Requires.private: zlib @LIBLZMA@ @LIBZSTD@
Petr Šabata 4c6e63
 Libs.private: @BZ2_LIB@
Petr Šabata 4c6e63
diff --git a/configure.ac b/configure.ac
Petr Šabata 4c6e63
index bf833872..1b794df3 100644
Petr Šabata 4c6e63
--- a/configure.ac
Petr Šabata 4c6e63
+++ b/configure.ac
Petr Šabata 4c6e63
@@ -397,8 +397,8 @@ eu_ZIPLIB(zlib,ZLIB,z,gzdirect,gzip)
Petr Šabata 4c6e63
 AS_IF([test "x$with_zlib" = xno], [AC_MSG_ERROR([zlib not found but is required])])
Petr Šabata 4c6e63
 LIBS="$save_LIBS"
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
-dnl Test for bzlib and xz/lzma, gives BZLIB/LZMALIB .am
Petr Šabata 4c6e63
-dnl conditional and config.h USE_BZLIB/USE_LZMALIB #define.
Petr Šabata 4c6e63
+dnl Test for bzlib and xz/lzma/zstd, gives BZLIB/LZMALIB/ZSTD .am
Petr Šabata 4c6e63
+dnl conditional and config.h USE_BZLIB/USE_LZMALIB/USE_ZSTD #define.
Petr Šabata 4c6e63
 save_LIBS="$LIBS"
Petr Šabata 4c6e63
 LIBS=
Petr Šabata 4c6e63
 eu_ZIPLIB(bzlib,BZLIB,bz2,BZ2_bzdopen,bzip2)
Petr Šabata 4c6e63
@@ -408,6 +408,9 @@ AC_SUBST([BZ2_LIB])
Petr Šabata 4c6e63
 eu_ZIPLIB(lzma,LZMA,lzma,lzma_auto_decoder,[LZMA (xz)])
Petr Šabata 4c6e63
 AS_IF([test "x$with_lzma" = xyes], [LIBLZMA="liblzma"], [LIBLZMA=""])
Petr Šabata 4c6e63
 AC_SUBST([LIBLZMA])
Petr Šabata 4c6e63
+eu_ZIPLIB(zstd,ZSTD,zstd,ZSTD_decompress,[ZSTD (zst)])
Petr Šabata 4c6e63
+AS_IF([test "x$with_zstd" = xyes], [LIBZSTD="libzstd"], [LIBLZSTD=""])
Petr Šabata 4c6e63
+AC_SUBST([LIBZSTD])
Petr Šabata 4c6e63
 zip_LIBS="$LIBS"
Petr Šabata 4c6e63
 LIBS="$save_LIBS"
Petr Šabata 4c6e63
 AC_SUBST([zip_LIBS])
Petr Šabata 4c6e63
@@ -677,6 +680,10 @@ if test "$HAVE_BUNZIP2" = "no"; then
Petr Šabata 4c6e63
   AC_MSG_WARN([No bunzip2, needed to run make check])
Petr Šabata 4c6e63
 fi
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
+# For tests that need to use zstd compression
Petr Šabata 4c6e63
+AC_CHECK_PROG(HAVE_ZSTD, zstd, yes, no)
Petr Šabata 4c6e63
+AM_CONDITIONAL([HAVE_ZSTD],[test "x$HAVE_ZSTD" = "xyes"])
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
 # Look for libcurl for libdebuginfod minimum version as per rhel7.
Petr Šabata 4c6e63
 AC_ARG_ENABLE([libdebuginfod],AC_HELP_STRING([--enable-libdebuginfod], [Build debuginfod client library (can be =dummy)]))
Petr Šabata 4c6e63
 AS_IF([test "x$enable_libdebuginfod" != "xno"], [
Petr Šabata 4c6e63
@@ -742,6 +749,7 @@ AC_MSG_NOTICE([
Petr Šabata 4c6e63
     gzip support                       : ${with_zlib}
Petr Šabata 4c6e63
     bzip2 support                      : ${with_bzlib}
Petr Šabata 4c6e63
     lzma/xz support                    : ${with_lzma}
Petr Šabata 4c6e63
+    zstd support                       : ${with_zstd}
Petr Šabata 4c6e63
     libstdc++ demangle support         : ${enable_demangler}
Petr Šabata 4c6e63
     File textrel check                 : ${enable_textrelcheck}
Petr Šabata 4c6e63
     Symbol versioning                  : ${enable_symbol_versioning}
Petr Šabata 4c6e63
@@ -759,6 +767,7 @@ AC_MSG_NOTICE([
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
   EXTRA TEST FEATURES (used with make check)
Petr Šabata 4c6e63
     have bunzip2 installed (required)  : ${HAVE_BUNZIP2}
Petr Šabata 4c6e63
+    have zstd installed                : ${HAVE_ZSTD}
Petr Šabata 4c6e63
     debug branch prediction            : ${use_debugpred}
Petr Šabata 4c6e63
     gprof support                      : ${use_gprof}
Petr Šabata 4c6e63
     gcov support                       : ${use_gcov}
Petr Šabata 4c6e63
diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am
Petr Šabata 4c6e63
index 1de05492..a0013e41 100644
Petr Šabata 4c6e63
--- a/libdwfl/Makefile.am
Petr Šabata 4c6e63
+++ b/libdwfl/Makefile.am
Petr Šabata 4c6e63
@@ -78,6 +78,9 @@ endif
Petr Šabata 4c6e63
 if LZMA
Petr Šabata 4c6e63
 libdwfl_a_SOURCES += lzma.c
Petr Šabata 4c6e63
 endif
Petr Šabata 4c6e63
+if ZSTD
Petr Šabata 4c6e63
+libdwfl_a_SOURCES += zstd.c
Petr Šabata 4c6e63
+endif
Petr Šabata 4c6e63
 if LIBDEBUGINFOD
Petr Šabata 4c6e63
 libdwfl_a_SOURCES += debuginfod-client.c
Petr Šabata 4c6e63
 endif
Petr Šabata 4c6e63
diff --git a/libdwfl/gzip.c b/libdwfl/gzip.c
Petr Šabata 4c6e63
index e9988cc2..ba8ecfba 100644
Petr Šabata 4c6e63
--- a/libdwfl/gzip.c
Petr Šabata 4c6e63
+++ b/libdwfl/gzip.c
Petr Šabata 4c6e63
@@ -48,6 +48,12 @@
Petr Šabata 4c6e63
 # define inflateInit(z)	lzma_auto_decoder (z, 1 << 30, 0)
Petr Šabata 4c6e63
 # define do_inflate(z)	lzma_code (z, LZMA_RUN)
Petr Šabata 4c6e63
 # define inflateEnd(z)	lzma_end (z)
Petr Šabata 4c6e63
+#elif defined ZSTD
Petr Šabata 4c6e63
+# define USE_INFLATE	1
Petr Šabata 4c6e63
+# include <zstd.h>
Petr Šabata 4c6e63
+# define unzip		__libdw_unzstd
Petr Šabata 4c6e63
+# define DWFL_E_ZLIB	DWFL_E_ZSTD
Petr Šabata 4c6e63
+# define MAGIC		"\x28\xb5\x2f\xfd"
Petr Šabata 4c6e63
 #elif defined BZLIB
Petr Šabata 4c6e63
 # define USE_INFLATE	1
Petr Šabata 4c6e63
 # include <bzlib.h>
Petr Šabata 4c6e63
@@ -119,6 +125,7 @@ fail (struct unzip_state *state, Dwfl_Error failure)
Petr Šabata 4c6e63
   return failure;
Petr Šabata 4c6e63
 }
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
+#ifndef ZSTD
Petr Šabata 4c6e63
 static inline Dwfl_Error
Petr Šabata 4c6e63
 zlib_fail (struct unzip_state *state, int result)
Petr Šabata 4c6e63
 {
Petr Šabata 4c6e63
@@ -132,6 +139,7 @@ zlib_fail (struct unzip_state *state, int result)
Petr Šabata 4c6e63
       return fail (state, DWFL_E_ZLIB);
Petr Šabata 4c6e63
     }
Petr Šabata 4c6e63
 }
Petr Šabata 4c6e63
+#endif
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 #if !USE_INFLATE
Petr Šabata 4c6e63
 static Dwfl_Error
Petr Šabata 4c6e63
@@ -197,7 +205,7 @@ unzip (int fd, off_t start_offset,
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 	  ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, start_offset);
Petr Šabata 4c6e63
 	  if (unlikely (n < 0))
Petr Šabata 4c6e63
-	    return zlib_fail (&state, Z (ERRNO));
Petr Šabata 4c6e63
+	    return fail (&state, DWFL_E_ERRNO);
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 	  state.input_pos = n;
Petr Šabata 4c6e63
 	  mapped = state.input_buffer;
Petr Šabata 4c6e63
@@ -223,7 +231,74 @@ unzip (int fd, off_t start_offset,
Petr Šabata 4c6e63
     /* Not a compressed file.  */
Petr Šabata 4c6e63
     return DWFL_E_BADELF;
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
-#if USE_INFLATE
Petr Šabata 4c6e63
+#ifdef ZSTD
Petr Šabata 4c6e63
+  /* special case for libzstd since it is slightly different from the
Petr Šabata 4c6e63
+     API provided by bzlib and liblzma.  */
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+  void *next_in = mapped;
Petr Šabata 4c6e63
+  size_t avail_in = state.mapped_size;
Petr Šabata 4c6e63
+  void *next_out = NULL;
Petr Šabata 4c6e63
+  size_t avail_out = 0;
Petr Šabata 4c6e63
+  size_t total_out = 0;
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+  size_t result;
Petr Šabata 4c6e63
+  ZSTD_DCtx *dctx = ZSTD_createDCtx();
Petr Šabata 4c6e63
+  if (dctx == NULL)
Petr Šabata 4c6e63
+    return fail (&state, DWFL_E_NOMEM);
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+  do
Petr Šabata 4c6e63
+    {
Petr Šabata 4c6e63
+      if (avail_in == 0 && state.input_buffer != NULL)
Petr Šabata 4c6e63
+	{
Petr Šabata 4c6e63
+	  ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE,
Petr Šabata 4c6e63
+				   start_offset + state.input_pos);
Petr Šabata 4c6e63
+	  if (unlikely (n < 0))
Petr Šabata 4c6e63
+	    {
Petr Šabata 4c6e63
+	      ZSTD_freeDCtx (dctx);
Petr Šabata 4c6e63
+	      return fail (&state, DWFL_E_ERRNO);
Petr Šabata 4c6e63
+	    }
Petr Šabata 4c6e63
+	  next_in = state.input_buffer;
Petr Šabata 4c6e63
+	  avail_in = n;
Petr Šabata 4c6e63
+	  state.input_pos += n;
Petr Šabata 4c6e63
+	}
Petr Šabata 4c6e63
+      if (avail_out == 0)
Petr Šabata 4c6e63
+	{
Petr Šabata 4c6e63
+	  ptrdiff_t pos = (void *) next_out - state.buffer;
Petr Šabata 4c6e63
+	  if (!bigger_buffer (&state, avail_in))
Petr Šabata 4c6e63
+	    {
Petr Šabata 4c6e63
+	      ZSTD_freeDCtx (dctx);
Petr Šabata 4c6e63
+	      return fail (&state, DWFL_E_NOMEM);
Petr Šabata 4c6e63
+	    }
Petr Šabata 4c6e63
+	  next_out = state.buffer + pos;
Petr Šabata 4c6e63
+	  avail_out = state.size - pos;
Petr Šabata 4c6e63
+	}
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+      ZSTD_inBuffer input = { next_in, avail_in, 0 };
Petr Šabata 4c6e63
+      ZSTD_outBuffer output = { next_out, avail_out, 0 };
Petr Šabata 4c6e63
+      result = ZSTD_decompressStream (dctx, &output, &input);
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+      if (! ZSTD_isError (result))
Petr Šabata 4c6e63
+	{
Petr Šabata 4c6e63
+	  total_out += output.pos;
Petr Šabata 4c6e63
+	  next_out += output.pos;
Petr Šabata 4c6e63
+	  avail_out -= output.pos;
Petr Šabata 4c6e63
+	  next_in += input.pos;
Petr Šabata 4c6e63
+	  avail_in -= input.pos;
Petr Šabata 4c6e63
+	}
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+      if (result == 0)
Petr Šabata 4c6e63
+	break;
Petr Šabata 4c6e63
+    }
Petr Šabata 4c6e63
+  while (avail_in > 0 && ! ZSTD_isError (result));
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+  ZSTD_freeDCtx (dctx);
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+  if (ZSTD_isError (result))
Petr Šabata 4c6e63
+    return fail (&state, DWFL_E_ZSTD);
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+  smaller_buffer (&state, total_out);
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+#elif USE_INFLATE
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
   /* This style actually only works with bzlib and liblzma.
Petr Šabata 4c6e63
      The stupid zlib interface has nothing to grok the
Petr Šabata 4c6e63
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
Petr Šabata 4c6e63
index ad6779ad..4c6fcb28 100644
Petr Šabata 4c6e63
--- a/libdwfl/libdwflP.h
Petr Šabata 4c6e63
+++ b/libdwfl/libdwflP.h
Petr Šabata 4c6e63
@@ -61,6 +61,7 @@ typedef struct Dwfl_Process Dwfl_Process;
Petr Šabata 4c6e63
   DWFL_ERROR (ZLIB, N_("gzip decompression failed"))			      \
Petr Šabata 4c6e63
   DWFL_ERROR (BZLIB, N_("bzip2 decompression failed"))			      \
Petr Šabata 4c6e63
   DWFL_ERROR (LZMA, N_("LZMA decompression failed"))			      \
Petr Šabata 4c6e63
+  DWFL_ERROR (ZSTD, N_("zstd decompression failed"))			      \
Petr Šabata 4c6e63
   DWFL_ERROR (UNKNOWN_MACHINE, N_("no support library found for machine"))    \
Petr Šabata 4c6e63
   DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file"))		      \
Petr Šabata 4c6e63
   DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type"))		      \
Petr Šabata 4c6e63
@@ -612,6 +613,10 @@ extern Dwfl_Error __libdw_unlzma (int fd, off_t start_offset,
Petr Šabata 4c6e63
 				  void *mapped, size_t mapped_size,
Petr Šabata 4c6e63
 				  void **whole, size_t *whole_size)
Petr Šabata 4c6e63
   internal_function;
Petr Šabata 4c6e63
+extern Dwfl_Error __libdw_unzstd (int fd, off_t start_offset,
Petr Šabata 4c6e63
+				  void *mapped, size_t mapped_size,
Petr Šabata 4c6e63
+				  void **whole, size_t *whole_size)
Petr Šabata 4c6e63
+  internal_function;
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
 /* Skip the image header before a file image: updates *START_OFFSET.  */
Petr Šabata 4c6e63
 extern Dwfl_Error __libdw_image_header (int fd, off_t *start_offset,
Petr Šabata 4c6e63
diff --git a/libdwfl/open.c b/libdwfl/open.c
Petr Šabata 4c6e63
index 35fc5283..77bd2bd9 100644
Petr Šabata 4c6e63
--- a/libdwfl/open.c
Petr Šabata 4c6e63
+++ b/libdwfl/open.c
Petr Šabata 4c6e63
@@ -44,6 +44,10 @@
Petr Šabata 4c6e63
 # define __libdw_unlzma(...)	DWFL_E_BADELF
Petr Šabata 4c6e63
 #endif
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
+#if !USE_ZSTD
Petr Šabata 4c6e63
+# define __libdw_unzstd(...)	DWFL_E_BADELF
Petr Šabata 4c6e63
+#endif
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
 /* Consumes and replaces *ELF only on success.  */
Petr Šabata 4c6e63
 static Dwfl_Error
Petr Šabata 4c6e63
 decompress (int fd __attribute__ ((unused)), Elf **elf)
Petr Šabata 4c6e63
@@ -64,6 +68,8 @@ decompress (int fd __attribute__ ((unused)), Elf **elf)
Petr Šabata 4c6e63
     error = __libdw_bunzip2 (fd, offset, mapped, mapped_size, &buffer, &size);
Petr Šabata 4c6e63
   if (error == DWFL_E_BADELF)
Petr Šabata 4c6e63
     error = __libdw_unlzma (fd, offset, mapped, mapped_size, &buffer, &size);
Petr Šabata 4c6e63
+  if (error == DWFL_E_BADELF)
Petr Šabata 4c6e63
+    error = __libdw_unzstd (fd, offset, mapped, mapped_size, &buffer, &size);
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
   if (error == DWFL_E_NOERROR)
Petr Šabata 4c6e63
     {
Petr Šabata 4c6e63
diff --git a/libdwfl/zstd.c b/libdwfl/zstd.c
Petr Šabata 4c6e63
new file mode 100644
Petr Šabata 4c6e63
index 00000000..dc4d5238
Petr Šabata 4c6e63
--- /dev/null
Petr Šabata 4c6e63
+++ b/libdwfl/zstd.c
Petr Šabata 4c6e63
@@ -0,0 +1,4 @@
Petr Šabata 4c6e63
+/* libzstd is pretty close to zlib and bzlib.  */
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+#define ZSTD
Petr Šabata 4c6e63
+#include "gzip.c"
Petr Šabata 4c6e63
diff --git a/tests/Makefile.am b/tests/Makefile.am
Petr Šabata 4c6e63
index 4629ce64..9d0707da 100644
Petr Šabata 4c6e63
--- a/tests/Makefile.am
Petr Šabata 4c6e63
+++ b/tests/Makefile.am
Petr Šabata 4c6e63
@@ -204,6 +204,10 @@ if LZMA
Petr Šabata 4c6e63
 TESTS += run-readelf-s.sh run-dwflsyms.sh
Petr Šabata 4c6e63
 endif
Petr Šabata 4c6e63
 
Petr Šabata 4c6e63
+if HAVE_ZSTD
Petr Šabata 4c6e63
+TESTS += run-readelf-compressed-zstd.sh
Petr Šabata 4c6e63
+endif
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
 if HAVE_LIBASM
Petr Šabata 4c6e63
 check_PROGRAMS += $(asm_TESTS)
Petr Šabata 4c6e63
 TESTS += $(asm_TESTS) run-disasm-bpf.sh
Petr Šabata 4c6e63
@@ -256,6 +260,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
Petr Šabata 4c6e63
 	     run-nm-syms.sh testfilesyms32.bz2 testfilesyms64.bz2 \
Petr Šabata 4c6e63
 	     run-nm-self.sh run-readelf-self.sh run-readelf-info-plus.sh \
Petr Šabata 4c6e63
 	     run-readelf-compressed.sh \
Petr Šabata 4c6e63
+	     run-readelf-compressed-zstd.sh \
Petr Šabata 4c6e63
 	     run-readelf-const-values.sh testfile-const-values.debug.bz2 \
Petr Šabata 4c6e63
 	     run-addrcfi.sh run-dwarfcfi.sh \
Petr Šabata 4c6e63
 	     testfile11-debugframe.bz2 testfile12-debugframe.bz2 \
Petr Šabata 4c6e63
diff --git a/tests/run-readelf-compressed-zstd.sh b/tests/run-readelf-compressed-zstd.sh
Petr Šabata 4c6e63
new file mode 100755
Petr Šabata 4c6e63
index 00000000..96208092
Petr Šabata 4c6e63
--- /dev/null
Petr Šabata 4c6e63
+++ b/tests/run-readelf-compressed-zstd.sh
Petr Šabata 4c6e63
@@ -0,0 +1,39 @@
Petr Šabata 4c6e63
+#! /bin/sh
Petr Šabata 4c6e63
+# Copyright (C) 2018 Red Hat, Inc.
Petr Šabata 4c6e63
+# This file is part of elfutils.
Petr Šabata 4c6e63
+#
Petr Šabata 4c6e63
+# This file is free software; you can redistribute it and/or modify
Petr Šabata 4c6e63
+# it under the terms of the GNU General Public License as published by
Petr Šabata 4c6e63
+# the Free Software Foundation; either version 3 of the License, or
Petr Šabata 4c6e63
+# (at your option) any later version.
Petr Šabata 4c6e63
+#
Petr Šabata 4c6e63
+# elfutils is distributed in the hope that it will be useful, but
Petr Šabata 4c6e63
+# WITHOUT ANY WARRANTY; without even the implied warranty of
Petr Šabata 4c6e63
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Petr Šabata 4c6e63
+# GNU General Public License for more details.
Petr Šabata 4c6e63
+#
Petr Šabata 4c6e63
+# You should have received a copy of the GNU General Public License
Petr Šabata 4c6e63
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+. $srcdir/test-subr.sh
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+if ! grep -q -F '#define USE_ZSTD' ${abs_top_builddir}/config.h; then
Petr Šabata 4c6e63
+  echo "elfutils built without zstd support"
Petr Šabata 4c6e63
+  exit 77
Petr Šabata 4c6e63
+fi
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+# See run-strip-reloc.sh
Petr Šabata 4c6e63
+testfiles hello_i386.ko
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+tempfiles hello_i386.ko.zst readelf.out.1 readelf.out.2
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+testrun ${abs_top_builddir}/src/readelf -a hello_i386.ko > readelf.out.1
Petr Šabata 4c6e63
+zstd hello_i386.ko
Petr Šabata 4c6e63
+testrun ${abs_top_builddir}/src/readelf -a hello_i386.ko.zst > readelf.out.2
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+diff -u readelf.out.1 readelf.out.2
Petr Šabata 4c6e63
+if [ $? != 0 ]; then
Petr Šabata 4c6e63
+  exit 1;
Petr Šabata 4c6e63
+fi
Petr Šabata 4c6e63
+
Petr Šabata 4c6e63
+exit 0