From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7814) id 78F333858D37; Tue, 27 Sep 2022 02:50:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 78F333858D37 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1664247016; bh=T9f3aJgeUM44ArEZhrejoSnr1VNycNEePu60xp2Uc/M=; h=From:To:Subject:Date:From; b=uynYdXL1ztuduVO35QuLhNZ83vYgyGxCWmtNli4Yvf6tBQB4SAU+5VioiN0QbQ11z CW9QQeLdc+Un/iG9cXBbUVsi7VO1g+nxPWXRcpCyJrmZcp/yHn/qUVX+CAR9LONKMY 4n1b2/GutrWm+Yz+BAwabJcVbjJvNnX7kUoxVMaw= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Fangrui Song To: bfd-cvs@sourceware.org, gdb-cvs@sourceware.org Subject: [binutils-gdb] binutils, gdb: support zstd compressed debug sections X-Act-Checkin: binutils-gdb X-Git-Author: Fangrui Song X-Git-Refname: refs/heads/master X-Git-Oldrev: e122316b7ce78b999db944d7b524e11d642e2a49 X-Git-Newrev: 2cac01e3ffff74898c54fa5e6418817f5578adb6 Message-Id: <20220927025016.78F333858D37@sourceware.org> Date: Tue, 27 Sep 2022 02:50:16 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D2cac01e3ffff= 74898c54fa5e6418817f5578adb6 commit 2cac01e3ffff74898c54fa5e6418817f5578adb6 Author: Fangrui Song Date: Mon Sep 26 19:50:13 2022 -0700 binutils, gdb: support zstd compressed debug sections =20 PR29397 PR29563: Add new configure option --with-zstd which defaults to auto. If pkgconfig/libzstd.pc is found, define HAVE_ZSTD and support zstd compressed debug sections for most tools. =20 * bfd: for addr2line, objdump --dwarf, gdb, etc * gas: support --compress-debug-sections=3Dzstd * ld: support ELFCOMPRESS_ZSTD input and --compress-debug-sections=3Dzs= td * objcopy: support ELFCOMPRESS_ZSTD input for --decompress-debug-sections and --compress-debug-sections=3Dzstd * gdb: support ELFCOMPRESS_ZSTD input. The bfd change references zstd symbols, so gdb has to link against -lzstd in this patch. =20 If zstd is not supported, ELFCOMPRESS_ZSTD input triggers an error. We can avoid HAVE_ZSTD if binutils-gdb imports zstd/ like zlib/, but this is too heavyweight, so don't do it for now. =20 ``` % ld/ld-new a.o ld/ld-new: a.o: section .debug_abbrev is compressed with zstd, but BFD = is not built with zstd support ... =20 % ld/ld-new a.o --compress-debug-sections=3Dzstd ld/ld-new: --compress-debug-sections=3Dzstd: ld is not built with zstd = support =20 % binutils/objcopy --compress-debug-sections=3Dzstd a.o b.o binutils/objcopy: --compress-debug-sections=3Dzstd: binutils is not bui= lt with zstd support =20 % binutils/objcopy b.o --decompress-debug-sections binutils/objcopy: zstd.o: section .debug_abbrev is compressed with zstd= , but BFD is not built with zstd support ... ``` Diff: --- bfd/Makefile.am | 4 +- bfd/Makefile.in | 13 +- bfd/aclocal.m4 | 2 + bfd/bfd-in.h | 3 +- bfd/bfd-in2.h | 11 +- bfd/bfd.c | 26 +- bfd/compress.c | 72 +++-- bfd/config.in | 3 + bfd/configure | 268 +++++++++++++++++- bfd/configure.ac | 3 +- bfd/elf.c | 12 + bfd/elfxx-target.h | 6 +- bfd/section.c | 3 +- binutils/Makefile.in | 5 +- binutils/NEWS | 6 + binutils/aclocal.m4 | 1 + binutils/config.in | 3 + binutils/configure | 136 +++++++++- binutils/configure.ac | 3 +- binutils/doc/binutils.texi | 16 +- binutils/objcopy.c | 19 +- binutils/testsuite/binutils-all/compress.exp | 44 +++ config/zstd.m4 | 23 ++ configure | 10 + configure.ac | 3 + gas/Makefile.am | 4 +- gas/Makefile.in | 13 +- gas/NEWS | 3 + gas/aclocal.m4 | 2 + gas/as.c | 13 +- gas/compress-debug.c | 60 ++++- gas/compress-debug.h | 10 +- gas/config.in | 3 + gas/configure | 269 +++++++++++++++++- gas/configure.ac | 3 +- gas/doc/as.texi | 11 +- gas/write.c | 36 +-- gdb/Makefile.in | 8 +- gdb/NEWS | 2 + gdb/acinclude.m4 | 3 +- gdb/config.in | 3 + gdb/configure | 137 +++++++++- gdb/configure.ac | 4 +- ld/Makefile.am | 5 +- ld/Makefile.in | 11 +- ld/NEWS | 3 + ld/aclocal.m4 | 1 + ld/config.in | 3 + ld/configure | 390 ++++++++++++++++++-----= ---- ld/configure.ac | 6 +- ld/emultempl/elf.em | 9 + ld/ld.texi | 5 + ld/ldmain.c | 8 +- ld/lexsup.c | 4 +- ld/testsuite/ld-bootstrap/bootstrap.exp | 4 + ld/testsuite/ld-elf/compress.exp | 16 ++ 56 files changed, 1490 insertions(+), 254 deletions(-) diff --git a/bfd/Makefile.am b/bfd/Makefile.am index a5652b2a9c7..98a487b7fcd 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -57,7 +57,7 @@ ZLIBINC =3D @zlibinc@ =20 WARN_CFLAGS =3D @WARN_CFLAGS@ NO_WERROR =3D @NO_WERROR@ -AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) +AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS) AM_CPPFLAGS =3D -DBINDIR=3D'"$(bindir)"' -DLIBDIR=3D'"$(libdir)"' @LARGEFI= LE_CPPFLAGS@ if PLUGINS bfdinclude_HEADERS +=3D $(INCDIR)/plugin-api.h @@ -776,7 +776,7 @@ ofiles: stamp-ofiles ; @true libbfd_la_SOURCES =3D $(BFD32_LIBS_CFILES) EXTRA_libbfd_la_SOURCES =3D $(CFILES) libbfd_la_DEPENDENCIES =3D $(OFILES) ofiles -libbfd_la_LIBADD =3D `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) +libbfd_la_LIBADD =3D `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) $(ZSTD_= LIBS) libbfd_la_LDFLAGS +=3D -release `cat libtool-soversion` @SHARED_LDFLAGS@ =20 # libtool will build .libs/libbfd.a. We create libbfd.a in the build diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 83d686529a0..3c9ebf38f83 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -122,10 +122,12 @@ am__aclocal_m4_deps =3D $(top_srcdir)/../config/acx.m= 4 \ $(top_srcdir)/../config/lead-dot.m4 \ $(top_srcdir)/../config/nls.m4 \ $(top_srcdir)/../config/override.m4 \ + $(top_srcdir)/../config/pkg.m4 \ $(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/progtest.m4 \ - $(top_srcdir)/../config/zlib.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/../config/zlib.m4 \ + $(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \ $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/bfd.m4 $(top_srcdir)/warning.m4 \ @@ -399,6 +401,9 @@ PACKAGE_URL =3D @PACKAGE_URL@ PACKAGE_VERSION =3D @PACKAGE_VERSION@ PATH_SEPARATOR =3D @PATH_SEPARATOR@ PKGVERSION =3D @PKGVERSION@ +PKG_CONFIG =3D @PKG_CONFIG@ +PKG_CONFIG_LIBDIR =3D @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH =3D @PKG_CONFIG_PATH@ POSUB =3D @POSUB@ RANLIB =3D @RANLIB@ REPORT_BUGS_TEXI =3D @REPORT_BUGS_TEXI@ @@ -416,6 +421,8 @@ WARN_CFLAGS =3D @WARN_CFLAGS@ WARN_CFLAGS_FOR_BUILD =3D @WARN_CFLAGS_FOR_BUILD@ WARN_WRITE_STRINGS =3D @WARN_WRITE_STRINGS@ XGETTEXT =3D @XGETTEXT@ +ZSTD_CFLAGS =3D @ZSTD_CFLAGS@ +ZSTD_LIBS =3D @ZSTD_LIBS@ abs_builddir =3D @abs_builddir@ abs_srcdir =3D @abs_srcdir@ abs_top_builddir =3D @abs_top_builddir@ @@ -520,7 +527,7 @@ libbfd_la_LDFLAGS =3D $(am__append_1) -release `cat lib= tool-soversion` \ # case both are empty. ZLIB =3D @zlibdir@ -lz ZLIBINC =3D @zlibinc@ -AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) +AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS) AM_CPPFLAGS =3D -DBINDIR=3D'"$(bindir)"' -DLIBDIR=3D'"$(libdir)"' \ @LARGEFILE_CPPFLAGS@ @HDEFINES@ @COREFLAG@ @TDEFINES@ \ $(CSEARCH) $(CSWITCHES) $(HAVEVECS) @INCINTL@ @@ -1199,7 +1206,7 @@ OFILES =3D $(BFD_BACKENDS) $(BFD_MACHINES) @COREFILE@= @bfd64_libs@ libbfd_la_SOURCES =3D $(BFD32_LIBS_CFILES) EXTRA_libbfd_la_SOURCES =3D $(CFILES) libbfd_la_DEPENDENCIES =3D $(OFILES) ofiles -libbfd_la_LIBADD =3D `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) +libbfd_la_LIBADD =3D `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) $(ZSTD_= LIBS) =20 # libtool will build .libs/libbfd.a. We create libbfd.a in the build # directory so that we don't have to convert all the programs that use diff --git a/bfd/aclocal.m4 b/bfd/aclocal.m4 index 0f8aa1d4518..09b849dfc87 100644 --- a/bfd/aclocal.m4 +++ b/bfd/aclocal.m4 @@ -1176,10 +1176,12 @@ m4_include([../config/largefile.m4]) m4_include([../config/lead-dot.m4]) m4_include([../config/nls.m4]) m4_include([../config/override.m4]) +m4_include([../config/pkg.m4]) m4_include([../config/plugins.m4]) m4_include([../config/po.m4]) m4_include([../config/progtest.m4]) m4_include([../config/zlib.m4]) +m4_include([../config/zstd.m4]) m4_include([../libtool.m4]) m4_include([../ltoptions.m4]) m4_include([../ltsugar.m4]) diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 8605056aefe..4765ea80536 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -342,7 +342,8 @@ enum compressed_debug_section_type COMPRESS_DEBUG_NONE =3D 0, COMPRESS_DEBUG =3D 1 << 0, COMPRESS_DEBUG_GNU_ZLIB =3D COMPRESS_DEBUG | 1 << 1, - COMPRESS_DEBUG_GABI_ZLIB =3D COMPRESS_DEBUG | 1 << 2 + COMPRESS_DEBUG_GABI_ZLIB =3D COMPRESS_DEBUG | 1 << 2, + COMPRESS_DEBUG_ZSTD =3D COMPRESS_DEBUG | 1 << 3 }; =20 /* This structure is used to keep track of stabs in sections diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 79fcc4eb912..5c80956c79c 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -349,7 +349,8 @@ enum compressed_debug_section_type COMPRESS_DEBUG_NONE =3D 0, COMPRESS_DEBUG =3D 1 << 0, COMPRESS_DEBUG_GNU_ZLIB =3D COMPRESS_DEBUG | 1 << 1, - COMPRESS_DEBUG_GABI_ZLIB =3D COMPRESS_DEBUG | 1 << 2 + COMPRESS_DEBUG_GABI_ZLIB =3D COMPRESS_DEBUG | 1 << 2, + COMPRESS_DEBUG_ZSTD =3D COMPRESS_DEBUG | 1 << 3 }; =20 /* This structure is used to keep track of stabs in sections @@ -962,7 +963,8 @@ typedef struct bfd_section unsigned int compress_status : 2; #define COMPRESS_SECTION_NONE 0 #define COMPRESS_SECTION_DONE 1 -#define DECOMPRESS_SECTION_SIZED 2 +#define DECOMPRESS_SECTION_ZLIB 2 +#define DECOMPRESS_SECTION_ZSTD 3 =20 /* The following flags are used by the ELF linker. */ =20 @@ -6637,12 +6639,14 @@ struct bfd #define BFD_ARCHIVE_FULL_PATH 0x100000 =20 #define BFD_CLOSED_BY_CACHE 0x200000 + /* Compress sections in this BFD with SHF_COMPRESSED zstd. */ +#define BFD_COMPRESS_ZSTD 0x400000 =20 /* Flags bits to be saved in bfd_preserve_save. */ #define BFD_FLAGS_SAVED \ (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ | BFD_PLUGIN | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON \ - | BFD_USE_ELF_STT_COMMON) + | BFD_USE_ELF_STT_COMMON | BFD_COMPRESS_ZSTD) =20 /* Flags bits which are for BFD use only. */ #define BFD_FLAGS_FOR_BFD_USE_MASK \ @@ -7271,6 +7275,7 @@ void bfd_update_compression_header =20 bool bfd_check_compression_header (bfd *abfd, bfd_byte *contents, asection *sec, + unsigned int *ch_type, bfd_size_type *uncompressed_size, unsigned int *uncompressed_alignment_power); =20 diff --git a/bfd/bfd.c b/bfd/bfd.c index 0a21db11fd6..5f2033bee7a 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -177,12 +177,15 @@ CODE_FRAGMENT .#define BFD_ARCHIVE_FULL_PATH 0x100000 . .#define BFD_CLOSED_BY_CACHE 0x200000 + +. {* Compress sections in this BFD with SHF_COMPRESSED zstd. *} +.#define BFD_COMPRESS_ZSTD 0x400000 . . {* Flags bits to be saved in bfd_preserve_save. *} .#define BFD_FLAGS_SAVED \ . (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ . | BFD_PLUGIN | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON \ -. | BFD_USE_ELF_STT_COMMON) +. | BFD_USE_ELF_STT_COMMON | BFD_COMPRESS_ZSTD) . . {* Flags bits which are for BFD use only. *} .#define BFD_FLAGS_FOR_BFD_USE_MASK \ @@ -2500,6 +2503,9 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *c= ontents, { const struct elf_backend_data *bed =3D get_elf_backend_data (abfd); struct bfd_elf_section_data * esd =3D elf_section_data (sec); + const unsigned int ch_type =3D abfd->flags & BFD_COMPRESS_ZSTD + ? ELFCOMPRESS_ZSTD + : ELFCOMPRESS_ZLIB; =20 /* Set the SHF_COMPRESSED bit. */ elf_section_flags (sec) |=3D SHF_COMPRESSED; @@ -2507,7 +2513,7 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *c= ontents, if (bed->s->elfclass =3D=3D ELFCLASS32) { Elf32_External_Chdr *echdr =3D (Elf32_External_Chdr *) contents; - bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type); + bfd_put_32 (abfd, ch_type, &echdr->ch_type); bfd_put_32 (abfd, sec->size, &echdr->ch_size); bfd_put_32 (abfd, 1u << sec->alignment_power, &echdr->ch_addralign); @@ -2518,7 +2524,7 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *c= ontents, else { Elf64_External_Chdr *echdr =3D (Elf64_External_Chdr *) contents; - bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type); + bfd_put_32 (abfd, ch_type, &echdr->ch_type); bfd_put_32 (abfd, 0, &echdr->ch_reserved); bfd_put_64 (abfd, sec->size, &echdr->ch_size); bfd_put_64 (abfd, UINT64_C (1) << sec->alignment_power, @@ -2553,14 +2559,15 @@ bfd_update_compression_header (bfd *abfd, bfd_byte = *contents, SYNOPSIS bool bfd_check_compression_header (bfd *abfd, bfd_byte *contents, asection *sec, + unsigned int *ch_type, bfd_size_type *uncompressed_size, unsigned int *uncompressed_alignment_power); =20 DESCRIPTION - Check the compression header at CONTENTS of SEC in ABFD and - store the uncompressed size in UNCOMPRESSED_SIZE and the - uncompressed data alignment in UNCOMPRESSED_ALIGNMENT_POWER - if the compression header is valid. + Check the compression header at CONTENTS of SEC in ABFD and store the + ch_type in CH_TYPE, uncompressed size in UNCOMPRESSED_SIZE, and the + uncompressed data alignment in UNCOMPRESSED_ALIGNMENT_POWER if the + compression header is valid. =20 RETURNS Return TRUE if the compression header is valid. @@ -2569,6 +2576,7 @@ RETURNS bool bfd_check_compression_header (bfd *abfd, bfd_byte *contents, asection *sec, + unsigned int *ch_type, bfd_size_type *uncompressed_size, unsigned int *uncompressed_alignment_power) { @@ -2591,7 +2599,9 @@ bfd_check_compression_header (bfd *abfd, bfd_byte *co= ntents, chdr.ch_size =3D bfd_get_64 (abfd, &echdr->ch_size); chdr.ch_addralign =3D bfd_get_64 (abfd, &echdr->ch_addralign); } - if (chdr.ch_type =3D=3D ELFCOMPRESS_ZLIB + *ch_type =3D chdr.ch_type; + if ((chdr.ch_type =3D=3D ELFCOMPRESS_ZLIB + || chdr.ch_type =3D=3D ELFCOMPRESS_ZSTD) && chdr.ch_addralign =3D=3D (chdr.ch_addralign & -chdr.ch_addralign)) { *uncompressed_size =3D chdr.ch_size; diff --git a/bfd/compress.c b/bfd/compress.c index b2e39826e38..0e75b687013 100644 --- a/bfd/compress.c +++ b/bfd/compress.c @@ -20,18 +20,31 @@ =20 #include "sysdep.h" #include +#ifdef HAVE_ZSTD +#include +#endif #include "bfd.h" +#include "elf-bfd.h" #include "libbfd.h" #include "safe-ctype.h" =20 #define MAX_COMPRESSION_HEADER_SIZE 24 =20 static bool -decompress_contents (bfd_byte *compressed_buffer, +decompress_contents (bool is_zstd, bfd_byte *compressed_buffer, bfd_size_type compressed_size, bfd_byte *uncompressed_buffer, bfd_size_type uncompressed_size) { + if (is_zstd) + { +#ifdef HAVE_ZSTD + size_t ret =3D ZSTD_decompress (uncompressed_buffer, uncompressed_si= ze, + compressed_buffer, compressed_size); + return !ZSTD_isError (ret); +#endif + } + z_stream strm; int rc; =20 @@ -69,7 +82,7 @@ decompress_contents (bfd_byte *compressed_buffer, } =20 /* Compress data of the size specified in @var{uncompressed_size} - and pointed to by @var{uncompressed_buffer} using zlib and store + and pointed to by @var{uncompressed_buffer} using zlib/zstd and store as the contents field. This function assumes the contents field was allocated using bfd_malloc() or equivalent. =20 @@ -150,9 +163,10 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec, sec->size =3D orig_uncompressed_size; if (decompress) { - if (!decompress_contents (uncompressed_buffer - + orig_compression_header_size, - zlib_size, buffer, buffer_size)) + if (!decompress_contents ( + sec->compress_status =3D=3D DECOMPRESS_SECTION_ZSTD, + uncompressed_buffer + orig_compression_header_size, + zlib_size, buffer, buffer_size)) { bfd_set_error (bfd_error_bad_value); bfd_release (abfd, buffer); @@ -175,10 +189,23 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec, } else { - if (compress ((Bytef*) buffer + header_size, - &compressed_size, - (const Bytef*) uncompressed_buffer, - uncompressed_size) !=3D Z_OK) + if (abfd->flags & BFD_COMPRESS_ZSTD) + { +#if HAVE_ZSTD + compressed_size =3D ZSTD_compress ( + buffer + header_size, compressed_size, uncompressed_buffer, + uncompressed_size, ZSTD_CLEVEL_DEFAULT); + if (ZSTD_isError (compressed_size)) + { + bfd_release (abfd, buffer); + bfd_set_error (bfd_error_bad_value); + return 0; + } +#endif + } + else if (compress ((Bytef *)buffer + header_size, &compressed_size, + (const Bytef *)uncompressed_buffer, uncompressed_size) + !=3D Z_OK) { bfd_release (abfd, buffer); bfd_set_error (bfd_error_bad_value); @@ -237,6 +264,7 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, = bfd_byte **ptr) bfd_size_type save_rawsize; bfd_byte *compressed_buffer; unsigned int compression_header_size; + const unsigned int compress_status =3D sec->compress_status; =20 if (abfd->direction !=3D write_direction && sec->rawsize !=3D 0) sz =3D sec->rawsize; @@ -248,7 +276,7 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, = bfd_byte **ptr) return true; } =20 - switch (sec->compress_status) + switch (compress_status) { case COMPRESS_SECTION_NONE: if (p =3D=3D NULL) @@ -298,7 +326,8 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, = bfd_byte **ptr) *ptr =3D p; return true; =20 - case DECOMPRESS_SECTION_SIZED: + case DECOMPRESS_SECTION_ZLIB: + case DECOMPRESS_SECTION_ZSTD: /* Read in the full compressed section contents. */ compressed_buffer =3D (bfd_byte *) bfd_malloc (sec->compressed_size); if (compressed_buffer =3D=3D NULL) @@ -316,7 +345,7 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, = bfd_byte **ptr) /* Restore rawsize and size. */ sec->rawsize =3D save_rawsize; sec->size =3D save_size; - sec->compress_status =3D DECOMPRESS_SECTION_SIZED; + sec->compress_status =3D compress_status; if (!ret) goto fail_compressed; =20 @@ -330,8 +359,10 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec,= bfd_byte **ptr) /* Set header size to the zlib header size if it is a SHF_COMPRESSED section. */ compression_header_size =3D 12; - if (!decompress_contents (compressed_buffer + compression_header_siz= e, - sec->compressed_size - compression_header_size, p, sz)) + bool is_zstd =3D compress_status =3D=3D DECOMPRESS_SECTION_ZSTD; + if (!decompress_contents ( + is_zstd, compressed_buffer + compression_header_size, + sec->compressed_size - compression_header_size, p, sz)) { bfd_set_error (bfd_error_bad_value); if (p !=3D *ptr) @@ -381,7 +412,8 @@ DESCRIPTION void bfd_cache_section_contents (asection *sec, void *contents) { - if (sec->compress_status =3D=3D DECOMPRESS_SECTION_SIZED) + if (sec->compress_status =3D=3D DECOMPRESS_SECTION_ZLIB + || sec->compress_status =3D=3D DECOMPRESS_SECTION_ZSTD) sec->compress_status =3D COMPRESS_SECTION_DONE; sec->contents =3D contents; sec->flags |=3D SEC_IN_MEMORY; @@ -418,6 +450,7 @@ bfd_is_section_compressed_with_header (bfd *abfd, sec_p= tr sec, int compression_header_size; int header_size; unsigned int saved =3D sec->compress_status; + unsigned int ch_type; bool compressed; =20 *uncompressed_align_pow_p =3D 0; @@ -448,7 +481,7 @@ bfd_is_section_compressed_with_header (bfd *abfd, sec_p= tr sec, { if (compression_header_size !=3D 0) { - if (!bfd_check_compression_header (abfd, header, sec, + if (!bfd_check_compression_header (abfd, header, sec, &ch_type, uncompressed_size_p, uncompressed_align_pow_p)) compression_header_size =3D -1; @@ -507,7 +540,7 @@ SYNOPSIS DESCRIPTION Record compressed section size, update section size with decompressed size and set compress_status to - DECOMPRESS_SECTION_SIZED. + DECOMPRESS_SECTION_{ZLIB,ZSTD}. =20 Return @code{FALSE} if the section is not a valid compressed section. Otherwise, return @code{TRUE}. @@ -521,6 +554,7 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr = sec) int header_size; bfd_size_type uncompressed_size; unsigned int uncompressed_alignment_power =3D 0; + unsigned int ch_type; z_stream strm; =20 compression_header_size =3D bfd_get_compression_header_size (abfd, sec); @@ -550,6 +584,7 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr = sec) uncompressed_size =3D bfd_getb64 (header + 4); } else if (!bfd_check_compression_header (abfd, header, sec, + &ch_type, &uncompressed_size, &uncompressed_alignment_power)) { @@ -569,7 +604,8 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr = sec) sec->compressed_size =3D sec->size; sec->size =3D uncompressed_size; bfd_set_section_alignment (sec, uncompressed_alignment_power); - sec->compress_status =3D DECOMPRESS_SECTION_SIZED; + sec->compress_status =3D (ch_type =3D=3D ELFCOMPRESS_ZSTD + ? DECOMPRESS_SECTION_ZSTD : DECOMPRESS_SECTION_ZLIB); =20 return true; } diff --git a/bfd/config.in b/bfd/config.in index f54a3cacbea..a59304e0a66 100644 --- a/bfd/config.in +++ b/bfd/config.in @@ -232,6 +232,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H =20 +/* Define to 1 if zstd is enabled. */ +#undef HAVE_ZSTD + /* Define to the sub-directory in which libtool stores uninstalled librari= es. */ #undef LT_OBJDIR diff --git a/bfd/configure b/bfd/configure index 075d2ee0a1b..d905a7bf7a8 100755 --- a/bfd/configure +++ b/bfd/configure @@ -652,6 +652,11 @@ TDEFINES SHARED_LIBADD SHARED_LDFLAGS LIBM +ZSTD_LIBS +ZSTD_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG zlibinc zlibdir EXEEXT_FOR_BUILD @@ -839,6 +844,7 @@ enable_maintainer_mode enable_install_libbfd enable_nls with_system_zlib +with_zstd ' ac_precious_vars=3D'build_alias host_alias @@ -848,7 +854,12 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP' +CPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +ZSTD_CFLAGS +ZSTD_LIBS' =20 =20 # Initialize some variables set by options. @@ -1511,6 +1522,8 @@ Optional Packages: Binutils" --with-bugurl=3DURL Direct users to URL to report a bug --with-system-zlib use installed libz + --with-zstd support zstd compressed debug sections + (default=3Dauto) =20 Some influential environment variables: CC C compiler command @@ -1521,6 +1534,13 @@ Some influential environment variables: CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + ZSTD_CFLAGS C compiler flags for ZSTD, overriding pkg-config + ZSTD_LIBS linker flags for ZSTD, overriding pkg-config =20 Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -11086,7 +11106,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11089 "configure" +#line 11109 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -11192,7 +11212,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11195 "configure" +#line 11215 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -12995,7 +13015,7 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h ;; esac =20 -# Link in zlib if we can. This allows us to read compressed debug section= s. +# Link in zlib/zstd if we can. This allows us to read compressed debug se= ctions. # This is used only by compress.c. =20 # Use the system's zlib library. @@ -13015,6 +13035,246 @@ fi =20 =20 =20 + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" !=3D "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be = a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=3D$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG=3D"$PKG_CONFIG" # Let the user override the test w= ith a path. + ;; + *) + as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=3D$as_save_IFS + test -z "$as_dir" && as_dir=3D. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 + break 2 + fi +done + done +IFS=3D$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=3D$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=3D$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name wi= th args. +set dummy pkg-config; ac_word=3D$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG=3D"$ac_pt_PKG_CONFIG" # Let the user overrid= e the test with a path. + ;; + *) + as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=3D$as_save_IFS + test -z "$as_dir" && as_dir=3D. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 + break 2 + fi +done + done +IFS=3D$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=3D$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" =3D x; then + PKG_CONFIG=3D"" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not pr= efixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triple= t" >&2;} +ac_tool_warned=3Dyes ;; +esac + PKG_CONFIG=3D$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG=3D"$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=3D0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least = version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... "= >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG=3D"" + fi +fi + + +# Check whether --with-zstd was given. +if test "${with_zstd+set}" =3D set; then : + withval=3D$with_zstd; +else + with_zstd=3Dauto +fi + + +if test "$with_zstd" !=3D no; then + +pkg_failed=3Dno +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd" >&5 +$as_echo_n "checking for libzstd... " >&6; } + +if test -n "$ZSTD_CFLAGS"; then + pkg_cv_ZSTD_CFLAGS=3D"$ZSTD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_CFLAGS=3D`$PKG_CONFIG --cflags "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi +if test -n "$ZSTD_LIBS"; then + pkg_cv_ZSTD_LIBS=3D"$ZSTD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_LIBS=3D`$PKG_CONFIG --libs "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi + +if test $pkg_failed =3D no; then + pkg_save_LDFLAGS=3D"$LDFLAGS" + LDFLAGS=3D"$LDFLAGS $pkg_cv_ZSTD_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + pkg_failed=3Dyes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=3D$pkg_save_LDFLAGS +fi + + + +if test $pkg_failed =3D yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=3Dyes +else + _pkg_short_errors_supported=3Dno +fi + if test $_pkg_short_errors_supported =3D yes; then + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --short-errors --print-errors --cf= lags --libs "libzstd" 2>&1` + else + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --print-errors --cflags --libs "li= bzstd" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ZSTD_PKG_ERRORS" >&5 + + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +elif test $pkg_failed =3D untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +else + ZSTD_CFLAGS=3D$pkg_cv_ZSTD_CFLAGS + ZSTD_LIBS=3D$pkg_cv_ZSTD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +$as_echo "#define HAVE_ZSTD 1" >>confdefs.h + + +fi +fi + + save_CFLAGS=3D"$CFLAGS" CFLAGS=3D"$CFLAGS -Werror" { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for hid= den visibility" >&5 diff --git a/bfd/configure.ac b/bfd/configure.ac index 28f3d1afce6..7a0ad0ffe33 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -230,9 +230,10 @@ AC_CHECK_DECLS([basename, ffs, stpcpy, asprintf, vaspr= intf, strnlen]) =20 BFD_BINARY_FOPEN =20 -# Link in zlib if we can. This allows us to read compressed debug section= s. +# Link in zlib/zstd if we can. This allows us to read compressed debug se= ctions. # This is used only by compress.c. AM_ZLIB +AC_ZSTD =20 save_CFLAGS=3D"$CFLAGS" CFLAGS=3D"$CFLAGS -Werror" diff --git a/bfd/elf.c b/bfd/elf.c index 396b56db024..d496c1b2983 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1260,6 +1260,18 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, abfd, name); return false; } +#ifndef HAVE_ZSTD + if (newsect->compress_status =3D=3D DECOMPRESS_SECTION_ZSTD) + { + _bfd_error_handler + /* xgettext:c-format */ + (_ ("%pB: section %s is compressed with zstd, but BFD " + "is not built with zstd support"), + abfd, name); + newsect->compress_status =3D COMPRESS_SECTION_NONE; + return false; + } +#endif } =20 if (abfd->is_linker_input) diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index feaba84bf2e..ca600bb5ddf 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -989,7 +989,8 @@ const bfd_target TARGET_BIG_SYM =3D /* object_flags: mask of all file flags */ (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS - | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON), + | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD | BFD_CONVERT_ELF_COMMON + | BFD_USE_ELF_STT_COMMON), =20 /* section_flags: mask of all section flags */ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY @@ -1093,7 +1094,8 @@ const bfd_target TARGET_LITTLE_SYM =3D /* object_flags: mask of all file flags */ (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS - | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON), + | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD | BFD_CONVERT_ELF_COMMON + | BFD_USE_ELF_STT_COMMON), =20 /* section_flags: mask of all section flags */ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY diff --git a/bfd/section.c b/bfd/section.c index c7a02d729f2..614570e976e 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -392,7 +392,8 @@ CODE_FRAGMENT . unsigned int compress_status : 2; .#define COMPRESS_SECTION_NONE 0 .#define COMPRESS_SECTION_DONE 1 -.#define DECOMPRESS_SECTION_SIZED 2 +.#define DECOMPRESS_SECTION_ZLIB 2 +.#define DECOMPRESS_SECTION_ZSTD 3 . . {* The following flags are used by the ELF linker. *} . diff --git a/binutils/Makefile.in b/binutils/Makefile.in index 78d32b350e3..6de4e239408 100644 --- a/binutils/Makefile.in +++ b/binutils/Makefile.in @@ -156,7 +156,8 @@ am__aclocal_m4_deps =3D $(top_srcdir)/../bfd/acinclude.= m4 \ $(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/progtest.m4 \ - $(top_srcdir)/../config/zlib.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/../config/zlib.m4 \ + $(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \ $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../bfd/version.m4 \ @@ -575,6 +576,8 @@ WARN_WRITE_STRINGS =3D @WARN_WRITE_STRINGS@ XGETTEXT =3D @XGETTEXT@ YACC =3D `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir= )/../bison/; else echo @YACC@; fi` YFLAGS =3D -d +ZSTD_CFLAGS =3D @ZSTD_CFLAGS@ +ZSTD_LIBS =3D @ZSTD_LIBS@ abs_builddir =3D @abs_builddir@ abs_srcdir =3D @abs_srcdir@ abs_top_builddir =3D @abs_top_builddir@ diff --git a/binutils/NEWS b/binutils/NEWS index 8c2c416c17e..83c73d0660a 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -1,5 +1,11 @@ -*- text -*- =20 +* objcopy --decompress-debug-sections now supports zstd compressed debug + sections. The new option --compress-debug-sections=3Dzstd compresses de= bug + sections with zstd. + +* addr2line and objdump --dwarf now support zstd compressed debug sections. + * The dlltool program now accepts --deterministic-libraries and --non-deterministic-libraries as command line options to control whether= or not it generates deterministic output libraries. If neither of these op= tions diff --git a/binutils/aclocal.m4 b/binutils/aclocal.m4 index a877fa7f873..28271f56279 100644 --- a/binutils/aclocal.m4 +++ b/binutils/aclocal.m4 @@ -1205,6 +1205,7 @@ m4_include([../config/plugins.m4]) m4_include([../config/po.m4]) m4_include([../config/progtest.m4]) m4_include([../config/zlib.m4]) +m4_include([../config/zstd.m4]) m4_include([../libtool.m4]) m4_include([../ltoptions.m4]) m4_include([../ltsugar.m4]) diff --git a/binutils/config.in b/binutils/config.in index c5fb919aa95..bee8c07e2f7 100644 --- a/binutils/config.in +++ b/binutils/config.in @@ -157,6 +157,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H =20 +/* Define to 1 if zstd is enabled. */ +#undef HAVE_ZSTD + /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST =20 diff --git a/binutils/configure b/binutils/configure index 4c0c391e9d5..0d6bde7b4a5 100755 --- a/binutils/configure +++ b/binutils/configure @@ -650,6 +650,8 @@ LTLIBICONV LIBICONV MSGPACK_LIBS MSGPACK_CFLAGS +ZSTD_LIBS +ZSTD_CFLAGS zlibinc zlibdir DEMANGLER_NAME @@ -832,6 +834,7 @@ enable_build_warnings enable_nls enable_maintainer_mode with_system_zlib +with_zstd with_msgpack enable_rpath with_libiconv_prefix @@ -853,6 +856,8 @@ DEBUGINFOD_CFLAGS DEBUGINFOD_LIBS YACC YFLAGS +ZSTD_CFLAGS +ZSTD_LIBS MSGPACK_CFLAGS MSGPACK_LIBS' =20 @@ -1517,6 +1522,8 @@ Optional Packages: --with-debuginfod Enable debuginfo lookups with debuginfod (auto/yes/no) --with-system-zlib use installed libz + --with-zstd support zstd compressed debug sections + (default=3Dauto) --with-msgpack Enable msgpack support (auto/yes/no) --with-gnu-ld assume the C compiler uses GNU ld default=3Dno --with-libiconv-prefix[=3DDIR] search for libiconv in DIR/include and D= IR/lib @@ -1547,6 +1554,8 @@ Some influential environment variables: YFLAGS The list of arguments that will be passed by default to $YAC= C. This script will default YFLAGS to the empty string to avoid= a default value of `-d' given by some make applications. + ZSTD_CFLAGS C compiler flags for ZSTD, overriding pkg-config + ZSTD_LIBS linker flags for ZSTD, overriding pkg-config MSGPACK_CFLAGS C compiler flags for MSGPACK, overriding pkg-config MSGPACK_LIBS @@ -10804,7 +10813,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10807 "configure" +#line 10816 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -10910,7 +10919,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10913 "configure" +#line 10922 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -13468,7 +13477,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF =20 =20 -# Link in zlib if we can. This allows us to read compressed debug +# Link in zlib/zstd if we can. This allows us to read compressed debug # sections. This is used only by readelf.c (objdump uses bfd for # reading compressed sections). =20 @@ -13490,6 +13499,127 @@ fi =20 =20 =20 +# Check whether --with-zstd was given. +if test "${with_zstd+set}" =3D set; then : + withval=3D$with_zstd; +else + with_zstd=3Dauto +fi + + +if test "$with_zstd" !=3D no; then : + +pkg_failed=3Dno +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd" >&5 +$as_echo_n "checking for libzstd... " >&6; } + +if test -n "$ZSTD_CFLAGS"; then + pkg_cv_ZSTD_CFLAGS=3D"$ZSTD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_CFLAGS=3D`$PKG_CONFIG --cflags "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi +if test -n "$ZSTD_LIBS"; then + pkg_cv_ZSTD_LIBS=3D"$ZSTD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_LIBS=3D`$PKG_CONFIG --libs "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi + +if test $pkg_failed =3D no; then + pkg_save_LDFLAGS=3D"$LDFLAGS" + LDFLAGS=3D"$LDFLAGS $pkg_cv_ZSTD_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + pkg_failed=3Dyes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=3D$pkg_save_LDFLAGS +fi + + + +if test $pkg_failed =3D yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=3Dyes +else + _pkg_short_errors_supported=3Dno +fi + if test $_pkg_short_errors_supported =3D yes; then + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --short-errors --print-errors --cf= lags --libs "libzstd" 2>&1` + else + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --print-errors --cflags --libs "li= bzstd" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ZSTD_PKG_ERRORS" >&5 + + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +elif test $pkg_failed =3D untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +else + ZSTD_CFLAGS=3D$pkg_cv_ZSTD_CFLAGS + ZSTD_LIBS=3D$pkg_cv_ZSTD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +$as_echo "#define HAVE_ZSTD 1" >>confdefs.h + + +fi + +fi + + + case "${host}" in *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*) =20 diff --git a/binutils/configure.ac b/binutils/configure.ac index 0798d84f4d1..9b75396d07e 100644 --- a/binutils/configure.ac +++ b/binutils/configure.ac @@ -265,10 +265,11 @@ fi =20 AC_CHECK_DECLS([asprintf, environ, getc_unlocked, stpcpy, strnlen]) =20 -# Link in zlib if we can. This allows us to read compressed debug +# Link in zlib/zstd if we can. This allows us to read compressed debug # sections. This is used only by readelf.c (objdump uses bfd for # reading compressed sections). AM_ZLIB +AC_ZSTD =20 BFD_BINARY_FOPEN =20 diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 1499db5728c..34a4164eb94 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -2159,21 +2159,23 @@ ELF ABI. Note - if compression would actually make= a section @itemx --compress-debug-sections=3Dzlib @itemx --compress-debug-sections=3Dzlib-gnu @itemx --compress-debug-sections=3Dzlib-gabi +@itemx --compress-debug-sections=3Dzstd For ELF files, these options control how DWARF debug sections are compressed. @option{--compress-debug-sections=3Dnone} is equivalent to @option{--decompress-debug-sections}. @option{--compress-debug-sections=3Dzlib} and @option{--compress-debug-sections=3Dzlib-gabi} are equivalent to @option{--compress-debug-sections}. -@option{--compress-debug-sections=3Dzlib-gnu} compresses DWARF debug -sections using zlib. The debug sections are renamed to begin with -@samp{.zdebug} instead of @samp{.debug}. Note - if compression would -actually make a section @emph{larger}, then it is not compressed nor -renamed. +@option{--compress-debug-sections=3Dzlib-gnu} compresses DWARF debug secti= ons +using the obsoleted zlib-gnu format. The debug sections are renamed to be= gin +with @samp{.zdebug}. +@option{--compress-debug-sections=3Dzstd} compresses DWARF debug +sections using zstd. Note - if compression would actually make a section +@emph{larger}, then it is not compressed nor renamed. =20 @item --decompress-debug-sections -Decompress DWARF debug sections using zlib. The original section -names of the compressed sections are restored. +Decompress DWARF debug sections. For a @samp{.zdebug} section, the origin= al +name is restored. =20 @item --elf-stt-common=3Dyes @itemx --elf-stt-common=3Dno diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 43261756a42..fc668f00bbc 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -232,7 +232,8 @@ static enum compress_zlib =3D compress | 1 << 1, compress_gnu_zlib =3D compress | 1 << 2, compress_gabi_zlib =3D compress | 1 << 3, - decompress =3D 1 << 4 + compress_zstd =3D compress | 1 << 4, + decompress =3D 1 << 5 } do_debug_sections =3D nothing; =20 /* Whether to generate ELF common symbols with the STT_COMMON type. */ @@ -678,8 +679,8 @@ copy_usage (FILE *stream, int exit_status) \n\ --subsystem [:]\n\ Set PE subsystem to [& = ]\n\ - --compress-debug-sections[=3D{none|zlib|zlib-gnu|zlib-gabi}]\n\ - Compress DWARF debug sections using zli= b\n\ + --compress-debug-sections[=3D{none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\ + Compress DWARF debug sections\n\ --decompress-debug-sections Decompress DWARF debug sections using z= lib\n\ --elf-stt-common=3D[yes|no] Generate ELF common symbols with STT_= COMMON\n\ type\n\ @@ -2659,7 +2660,8 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_inf= o_type *input_arch) if ((do_debug_sections & compress) !=3D 0 && do_debug_sections !=3D compress) { - non_fatal (_("--compress-debug-sections=3D[zlib|zlib-gnu|zlib-gabi] is = unsupported on `%s'"), + non_fatal (_ ("--compress-debug-sections=3D[zlib|zlib-gnu|zlib-gabi|" + "zstd] is unsupported on `%s'"), bfd_get_archive_filename (ibfd)); return false; } @@ -3807,6 +3809,13 @@ copy_file (const char *input_filename, const char *o= utput_filename, int ofd, if (do_debug_sections !=3D compress_gnu_zlib) ibfd->flags |=3D BFD_COMPRESS_GABI; break; + case compress_zstd: + ibfd->flags |=3D BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZST= D; +#ifndef HAVE_ZSTD + fatal (_ ("--compress-debug-sections=3Dzstd: binutils is not built w= ith " + "zstd support")); +#endif + break; case decompress: ibfd->flags |=3D BFD_DECOMPRESS; break; @@ -5469,6 +5478,8 @@ copy_main (int argc, char *argv[]) do_debug_sections =3D compress_gnu_zlib; else if (strcasecmp (optarg, "zlib-gabi") =3D=3D 0) do_debug_sections =3D compress_gabi_zlib; + else if (strcasecmp (optarg, "zstd") =3D=3D 0) + do_debug_sections =3D compress_zstd; else fatal (_("unrecognized --compress-debug-sections type `%s'"), optarg); diff --git a/binutils/testsuite/binutils-all/compress.exp b/binutils/testsu= ite/binutils-all/compress.exp index c88da74a987..4e74c824664 100644 --- a/binutils/testsuite/binutils-all/compress.exp +++ b/binutils/testsuite/binutils-all/compress.exp @@ -576,6 +576,50 @@ if { [regexp_diff objdump.out $srcdir/$subdir/dw2-3gab= i.W] } then { pass "$testname" } =20 +if { [binutils_assemble_flags $srcdir/$subdir/dw2-1.S ${compressedfile}zst= d.o --compress-debug-sections=3Dzstd] } then { + set testname "objcopy compress debug sections with zstd" + set got [binutils_run $OBJCOPY "--compress-debug-sections=3Dzstd ${tes= tfile}.o ${copyfile}zstd.o"] + if ![string match "" $got] then { + fail "objcopy ($testname)" + return + } + send_log "cmp ${compressedfile}zstd.o ${copyfile}zstd.o\n" + verbose "cmp ${compressedfile}zstd.o ${copyfile}zstd.o" + set src1 ${compressedfile}zstd.o + set src2 ${copyfile}zstd.o + set status [remote_exec build cmp "${src1} ${src2}"] + set exec_output [lindex $status 1] + set exec_output [prune_warnings $exec_output] + if ![string match "" $exec_output] then { + send_log "$exec_output\n" + verbose "$exec_output" 1 + fail "objcopy ($testname)" + } else { + pass "objcopy ($testname)" + } + + set testname "objcopy decompress compressed debug sections with zstd" + set got [binutils_run $OBJCOPY "--decompress-debug-sections ${compress= edfile}zstd.o ${copyfile}zstd.o"] + if ![string match "" $got] then { + fail "objcopy ($testname)" + return + } + send_log "cmp ${testfile}.o ${copyfile}zstd.o\n" + verbose "cmp ${testfile}.o ${copyfile}zstd.o" + set src1 ${testfile}.o + set src2 ${copyfile}zstd.o + set status [remote_exec build cmp "${src1} ${src2}"] + set exec_output [lindex $status 1] + set exec_output [prune_warnings $exec_output] + if ![string match "" $exec_output] then { + send_log "$exec_output\n" + verbose "$exec_output" 1 + fail "objcopy ($testname)" + } else { + pass "objcopy ($testname)" + } +} + proc convert_test { testname as_flags objcop_flags } { global srcdir global subdir diff --git a/config/zstd.m4 b/config/zstd.m4 new file mode 100644 index 00000000000..6da4db68c58 --- /dev/null +++ b/config/zstd.m4 @@ -0,0 +1,23 @@ +dnl Copyright (C) 2022 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Enable features using the zstd library. +AC_DEFUN([AC_ZSTD], [ +AC_ARG_WITH(zstd, + [AS_HELP_STRING([--with-zstd], [support zstd compressed debug sections (= default=3Dauto)])], + [], [with_zstd=3Dauto]) + +AS_IF([test "$with_zstd" !=3D no], + [PKG_CHECK_MODULES(ZSTD, [libzstd], [ + AC_DEFINE(HAVE_ZSTD, 1, [Define to 1 if zstd is enabled.]) + ], [ + if test "$with_zstd" =3D yes; then + AC_MSG_ERROR([--with-zstd was given, but pkgconfig/libzstd.pc is not= found]) + fi + ]) + ]) +]) diff --git a/configure b/configure index d75f47a1e95..f14e0efd675 100755 --- a/configure +++ b/configure @@ -785,6 +785,7 @@ ac_user_opts=3D' enable_option_checking with_build_libsubdir with_system_zlib +with_zstd enable_as_accelerator_for enable_offload_targets enable_gold @@ -1567,6 +1568,8 @@ Optional Packages: --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=3Dno) --with-build-libsubdir=3DDIR Directory where to find libraries for buil= d system --with-system-zlib use installed libz + --with-zstd Support zstd compressed debug sections + (default=3Dauto) --with-mpc=3DPATH specify prefix directory for installed MPC pac= kage. Equivalent to --with-mpc-include=3DPATH/include = plus --with-mpc-lib=3DPATH/lib @@ -2925,6 +2928,13 @@ if test x$with_system_zlib =3D xyes ; then noconfigdirs=3D"$noconfigdirs zlib" fi =20 + +# Check whether --with-zstd was given. +if test "${with_zstd+set}" =3D set; then : + withval=3D$with_zstd; +fi + + # Don't compile the bundled readline/libreadline.a if --with-system-readli= ne # is provided. if test x$with_system_readline =3D xyes ; then diff --git a/configure.ac b/configure.ac index ae18d436aca..0152c69292e 100644 --- a/configure.ac +++ b/configure.ac @@ -246,6 +246,9 @@ if test x$with_system_zlib =3D xyes ; then noconfigdirs=3D"$noconfigdirs zlib" fi =20 +AC_ARG_WITH(zstd, +[AS_HELP_STRING([--with-zstd], [Support zstd compressed debug sections (de= fault=3Dauto)])]) + # Don't compile the bundled readline/libreadline.a if --with-system-readli= ne # is provided. if test x$with_system_readline =3D xyes ; then diff --git a/gas/Makefile.am b/gas/Makefile.am index bd597398671..5f0f24abf8d 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -42,7 +42,7 @@ am__skipyacc =3D =20 WARN_CFLAGS =3D @WARN_CFLAGS@ @WARN_WRITE_STRINGS@ NO_WERROR =3D @NO_WERROR@ -AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) +AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS) =20 TARG_CPU =3D @target_cpu_type@ TARG_CPU_C =3D $(srcdir)/config/tc-@target_cpu_type@.c @@ -407,7 +407,7 @@ STAGESTUFF =3D *.@OBJEXT@ $(noinst_PROGRAMS) =20 as_new_SOURCES =3D $(GAS_CFILES) as_new_LDADD =3D $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ - $(extra_objects) $(GASLIBS) $(LIBINTL) $(LIBM) $(ZLIB) + $(extra_objects) $(GASLIBS) $(LIBINTL) $(LIBM) $(ZLIB) $(ZSTD_LIBS) as_new_DEPENDENCIES =3D $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ $(extra_objects) $(GASLIBS) $(LIBINTL_DEP) EXTRA_as_new_SOURCES =3D $(CFILES) $(HFILES) $(TARGET_CPU_CFILES) \ diff --git a/gas/Makefile.in b/gas/Makefile.in index c57d78f82c4..5a4dd702252 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -140,10 +140,12 @@ am__aclocal_m4_deps =3D $(top_srcdir)/../bfd/acinclud= e.m4 \ $(top_srcdir)/../config/lead-dot.m4 \ $(top_srcdir)/../config/nls.m4 \ $(top_srcdir)/../config/override.m4 \ + $(top_srcdir)/../config/pkg.m4 \ $(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/progtest.m4 \ - $(top_srcdir)/../config/zlib.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/../config/zlib.m4 \ + $(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \ $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/../bfd/version.m4 \ @@ -429,6 +431,9 @@ PACKAGE_TARNAME =3D @PACKAGE_TARNAME@ PACKAGE_URL =3D @PACKAGE_URL@ PACKAGE_VERSION =3D @PACKAGE_VERSION@ PATH_SEPARATOR =3D @PATH_SEPARATOR@ +PKG_CONFIG =3D @PKG_CONFIG@ +PKG_CONFIG_LIBDIR =3D @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH =3D @PKG_CONFIG_PATH@ POSUB =3D @POSUB@ RANLIB =3D @RANLIB@ SED =3D @SED@ @@ -443,6 +448,8 @@ WARN_WRITE_STRINGS =3D @WARN_WRITE_STRINGS@ XGETTEXT =3D @XGETTEXT@ YACC =3D `if [ -f ../bison/bison ] ; then echo ../bison/bison -y -L../biso= n/bison ; else echo @YACC@ ; fi` YFLAGS =3D @YFLAGS@ +ZSTD_CFLAGS =3D @ZSTD_CFLAGS@ +ZSTD_LIBS =3D @ZSTD_LIBS@ abs_builddir =3D @abs_builddir@ abs_srcdir =3D @abs_srcdir@ abs_top_builddir =3D @abs_top_builddir@ @@ -524,7 +531,7 @@ ZLIBINC =3D @zlibinc@ # maintainer mode is disabled. Avoid this. am__skiplex =3D=20 am__skipyacc =3D=20 -AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) +AM_CFLAGS =3D $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS) TARG_CPU =3D @target_cpu_type@ TARG_CPU_C =3D $(srcdir)/config/tc-@target_cpu_type@.c TARG_CPU_O =3D config/tc-@target_cpu_type@.@OBJEXT@ @@ -874,7 +881,7 @@ GASLIBS =3D @OPCODES_LIB@ ../bfd/libbfd.la ../libiberty= /libiberty.a STAGESTUFF =3D *.@OBJEXT@ $(noinst_PROGRAMS) as_new_SOURCES =3D $(GAS_CFILES) as_new_LDADD =3D $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ - $(extra_objects) $(GASLIBS) $(LIBINTL) $(LIBM) $(ZLIB) + $(extra_objects) $(GASLIBS) $(LIBINTL) $(LIBM) $(ZLIB) $(ZSTD_LIBS) =20 as_new_DEPENDENCIES =3D $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ $(extra_objects) $(GASLIBS) $(LIBINTL_DEP) diff --git a/gas/NEWS b/gas/NEWS index d61cdb9edd4..9a8b726b942 100644 --- a/gas/NEWS +++ b/gas/NEWS @@ -1,5 +1,8 @@ -*- text -*- =20 +* gas now supports --compress-debug-sections=3Dzstd to compress + debug sections with zstd. + Changes in 2.39: =20 * Remove (rudimentary) support for the x86-64 sub-architectures Intel L1OM= and diff --git a/gas/aclocal.m4 b/gas/aclocal.m4 index 70183124da7..722030c776f 100644 --- a/gas/aclocal.m4 +++ b/gas/aclocal.m4 @@ -1196,10 +1196,12 @@ m4_include([../config/lcmessage.m4]) m4_include([../config/lead-dot.m4]) m4_include([../config/nls.m4]) m4_include([../config/override.m4]) +m4_include([../config/pkg.m4]) m4_include([../config/plugins.m4]) m4_include([../config/po.m4]) m4_include([../config/progtest.m4]) m4_include([../config/zlib.m4]) +m4_include([../config/zstd.m4]) m4_include([../libtool.m4]) m4_include([../ltoptions.m4]) m4_include([../ltsugar.m4]) diff --git a/gas/as.c b/gas/as.c index 6268779cf90..35ad6b3ab3b 100644 --- a/gas/as.c +++ b/gas/as.c @@ -252,14 +252,14 @@ Options:\n\ --alternate initially turn on alternate macro syntax\n")); #ifdef DEFAULT_FLAG_COMPRESS_DEBUG fprintf (stream, _("\ - --compress-debug-sections[=3D{none|zlib|zlib-gnu|zlib-gabi}]\n\ + --compress-debug-sections[=3D{none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\ compress DWARF debug sections using zlib [defaul= t]\n")); fprintf (stream, _("\ --nocompress-debug-sections\n\ don't compress DWARF debug sections\n")); #else fprintf (stream, _("\ - --compress-debug-sections[=3D{none|zlib|zlib-gnu|zlib-gabi}]\n\ + --compress-debug-sections[=3D{none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\ compress DWARF debug sections using zlib\n")); fprintf (stream, _("\ --nocompress-debug-sections\n\ @@ -736,6 +736,15 @@ This program has absolutely no warranty.\n")); flag_compress_debug =3D COMPRESS_DEBUG_GNU_ZLIB; else if (strcasecmp (optarg, "zlib-gabi") =3D=3D 0) flag_compress_debug =3D COMPRESS_DEBUG_GABI_ZLIB; + else if (strcasecmp (optarg, "zstd") =3D=3D 0) + { +#ifdef HAVE_ZSTD + flag_compress_debug =3D COMPRESS_DEBUG_ZSTD; +#else + as_fatal (_ ("--compress-debug-sections=3Dzstd: gas is not " + "built with zstd support")); +#endif + } else as_fatal (_("Invalid --compress-debug-sections option: `%s'"), optarg); diff --git a/gas/compress-debug.c b/gas/compress-debug.c index c80dbeec4e7..3cd175f6e57 100644 --- a/gas/compress-debug.c +++ b/gas/compress-debug.c @@ -21,14 +21,23 @@ #include "config.h" #include #include +#if HAVE_ZSTD +#include +#endif #include "ansidecl.h" #include "compress-debug.h" =20 /* Initialize the compression engine. */ =20 -struct z_stream_s * -compress_init (void) +void * +compress_init (bool use_zstd) { + if (use_zstd) { +#if HAVE_ZSTD + return ZSTD_createCCtx (); +#endif + } + static struct z_stream_s strm; =20 strm.zalloc =3D NULL; @@ -42,22 +51,37 @@ compress_init (void) from the engine goes into the current frag on the obstack. */ =20 int -compress_data (struct z_stream_s *strm, const char **next_in, - int *avail_in, char **next_out, int *avail_out) +compress_data (bool use_zstd, void *ctx, const char **next_in, int *avail_= in, + char **next_out, int *avail_out) { - int out_size =3D 0; - int x; + if (use_zstd) + { +#if HAVE_ZSTD + ZSTD_outBuffer ob =3D { *next_out, *avail_out, 0 }; + ZSTD_inBuffer ib =3D { *next_in, *avail_in, 0 }; + size_t ret =3D ZSTD_compressStream2 (ctx, &ob, &ib, ZSTD_e_continue); + *next_in +=3D ib.pos; + *avail_in -=3D ib.pos; + *next_out +=3D ob.pos; + *avail_out -=3D ob.pos; + if (ZSTD_isError (ret)) + return -1; + return (int)ob.pos; +#endif + } + + struct z_stream_s *strm =3D ctx; =20 strm->next_in =3D (Bytef *) (*next_in); strm->avail_in =3D *avail_in; strm->next_out =3D (Bytef *) (*next_out); strm->avail_out =3D *avail_out; =20 - x =3D deflate (strm, Z_NO_FLUSH); + int x =3D deflate (strm, Z_NO_FLUSH); if (x !=3D Z_OK) return -1; =20 - out_size =3D *avail_out - strm->avail_out; + int out_size =3D *avail_out - strm->avail_out; *next_in =3D (char *) (strm->next_in); *avail_in =3D strm->avail_in; *next_out =3D (char *) (strm->next_out); @@ -71,10 +95,28 @@ compress_data (struct z_stream_s *strm, const char **ne= xt_in, needed. */ =20 int -compress_finish (struct z_stream_s *strm, char **next_out, +compress_finish (bool use_zstd, void *ctx, char **next_out, int *avail_out, int *out_size) { + if (use_zstd) + { +#if HAVE_ZSTD + ZSTD_outBuffer ob =3D { *next_out, *avail_out, 0 }; + ZSTD_inBuffer ib =3D { 0 }; + size_t ret =3D ZSTD_compressStream2 (ctx, &ob, &ib, ZSTD_e_end); + *out_size =3D ob.pos; + *next_out +=3D ob.pos; + *avail_out -=3D ob.pos; + if (ZSTD_isError (ret)) + return -1; + if (ret =3D=3D 0) + ZSTD_freeCCtx (ctx); + return ret ? 1 : 0; +#endif + } + int x; + struct z_stream_s *strm =3D ctx; =20 strm->avail_in =3D 0; strm->next_out =3D (Bytef *) (*next_out); diff --git a/gas/compress-debug.h b/gas/compress-debug.h index 0183e269fef..87de0f8444e 100644 --- a/gas/compress-debug.h +++ b/gas/compress-debug.h @@ -21,19 +21,19 @@ #ifndef COMPRESS_DEBUG_H #define COMPRESS_DEBUG_H =20 +#include + struct z_stream_s; =20 /* Initialize the compression engine. */ -extern struct z_stream_s * -compress_init (void); +extern void *compress_init (bool); =20 /* Stream the contents of a frag to the compression engine. Output from the engine goes into the current frag on the obstack. */ -extern int -compress_data (struct z_stream_s *, const char **, int *, char **, int *); +extern int compress_data (bool, void *, const char **, int *, char **, int= *); =20 /* Finish the compression and consume the remaining compressed output. */ extern int -compress_finish (struct z_stream_s *, char **, int *, int *); +compress_finish (bool, void *, char **, int *, int *); =20 #endif /* COMPRESS_DEBUG_H */ diff --git a/gas/config.in b/gas/config.in index e243fd277ee..0d1668a3eac 100644 --- a/gas/config.in +++ b/gas/config.in @@ -134,6 +134,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H =20 +/* Define to 1 if zstd is enabled. */ +#undef HAVE_ZSTD + /* Using i386 COFF? */ #undef I386COFF =20 diff --git a/gas/configure b/gas/configure index d0449a1d7ab..02cded59b6a 100755 --- a/gas/configure +++ b/gas/configure @@ -633,6 +633,11 @@ ac_subst_vars=3D'am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS +ZSTD_LIBS +ZSTD_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG zlibinc zlibdir LIBM @@ -817,6 +822,7 @@ with_cpu enable_nls enable_maintainer_mode with_system_zlib +with_zstd ' ac_precious_vars=3D'build_alias host_alias @@ -828,7 +834,12 @@ LIBS CPPFLAGS CPP YACC -YFLAGS' +YFLAGS +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +ZSTD_CFLAGS +ZSTD_LIBS' =20 =20 # Initialize some variables set by options. @@ -1493,6 +1504,8 @@ Optional Packages: --with-cpu=3DCPU default cpu variant is CPU (currently only sup= ported on ARC) --with-system-zlib use installed libz + --with-zstd support zstd compressed debug sections + (default=3Dauto) =20 Some influential environment variables: CC C compiler command @@ -1509,6 +1522,13 @@ Some influential environment variables: YFLAGS The list of arguments that will be passed by default to $YAC= C. This script will default YFLAGS to the empty string to avoid= a default value of `-d' given by some make applications. + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + ZSTD_CFLAGS C compiler flags for ZSTD, overriding pkg-config + ZSTD_LIBS linker flags for ZSTD, overriding pkg-config =20 Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -10702,7 +10722,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10705 "configure" +#line 10725 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -10808,7 +10828,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10811 "configure" +#line 10831 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -13945,7 +13965,7 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h ;; esac =20 -# Link in zlib if we can. This allows us to write compressed debug sectio= ns. +# Link in zlib/zstd if we can. This allows us to write compressed debug s= ections. =20 # Use the system's zlib library. zlibdir=3D"-L\$(top_builddir)/../zlib" @@ -13964,6 +13984,247 @@ fi =20 =20 =20 + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" !=3D "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be = a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=3D$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG=3D"$PKG_CONFIG" # Let the user override the test w= ith a path. + ;; + *) + as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=3D$as_save_IFS + test -z "$as_dir" && as_dir=3D. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 + break 2 + fi +done + done +IFS=3D$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=3D$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=3D$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name wi= th args. +set dummy pkg-config; ac_word=3D$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG=3D"$ac_pt_PKG_CONFIG" # Let the user overrid= e the test with a path. + ;; + *) + as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=3D$as_save_IFS + test -z "$as_dir" && as_dir=3D. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 + break 2 + fi +done + done +IFS=3D$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=3D$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" =3D x; then + PKG_CONFIG=3D"" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not pr= efixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triple= t" >&2;} +ac_tool_warned=3Dyes ;; +esac + PKG_CONFIG=3D$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG=3D"$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=3D0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least = version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... "= >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG=3D"" + fi +fi + + +# Check whether --with-zstd was given. +if test "${with_zstd+set}" =3D set; then : + withval=3D$with_zstd; +else + with_zstd=3Dauto +fi + + +if test "$with_zstd" !=3D no; then : + +pkg_failed=3Dno +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd" >&5 +$as_echo_n "checking for libzstd... " >&6; } + +if test -n "$ZSTD_CFLAGS"; then + pkg_cv_ZSTD_CFLAGS=3D"$ZSTD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_CFLAGS=3D`$PKG_CONFIG --cflags "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi +if test -n "$ZSTD_LIBS"; then + pkg_cv_ZSTD_LIBS=3D"$ZSTD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_LIBS=3D`$PKG_CONFIG --libs "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi + +if test $pkg_failed =3D no; then + pkg_save_LDFLAGS=3D"$LDFLAGS" + LDFLAGS=3D"$LDFLAGS $pkg_cv_ZSTD_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + pkg_failed=3Dyes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=3D$pkg_save_LDFLAGS +fi + + + +if test $pkg_failed =3D yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=3Dyes +else + _pkg_short_errors_supported=3Dno +fi + if test $_pkg_short_errors_supported =3D yes; then + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --short-errors --print-errors --cf= lags --libs "libzstd" 2>&1` + else + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --print-errors --cflags --libs "li= bzstd" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ZSTD_PKG_ERRORS" >&5 + + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +elif test $pkg_failed =3D untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +else + ZSTD_CFLAGS=3D$pkg_cv_ZSTD_CFLAGS + ZSTD_LIBS=3D$pkg_cv_ZSTD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +$as_echo "#define HAVE_ZSTD 1" >>confdefs.h + + +fi + +fi + + # Support for VMS timestamps via cross compile =20 if test "$ac_cv_header_time_h" =3D yes; then diff --git a/gas/configure.ac b/gas/configure.ac index 21795a82bdd..e6f3298cb3e 100644 --- a/gas/configure.ac +++ b/gas/configure.ac @@ -1004,8 +1004,9 @@ AC_CHECK_DECLS([asprintf, mempcpy, stpcpy]) =20 BFD_BINARY_FOPEN =20 -# Link in zlib if we can. This allows us to write compressed debug sectio= ns. +# Link in zlib/zstd if we can. This allows us to write compressed debug s= ections. AM_ZLIB +AC_ZSTD =20 # Support for VMS timestamps via cross compile =20 diff --git a/gas/doc/as.texi b/gas/doc/as.texi index e915893da86..01f49434021 100644 --- a/gas/doc/as.texi +++ b/gas/doc/as.texi @@ -711,16 +711,19 @@ given section @emph{larger} then it is not compressed. @itemx --compress-debug-sections=3Dzlib @itemx --compress-debug-sections=3Dzlib-gnu @itemx --compress-debug-sections=3Dzlib-gabi +@itemx --compress-debug-sections=3Dzstd These options control how DWARF debug sections are compressed. @option{--compress-debug-sections=3Dnone} is equivalent to @option{--nocompress-debug-sections}. @option{--compress-debug-sections=3Dzlib} and @option{--compress-debug-sections=3Dzlib-gabi} are equivalent to @option{--compress-debug-sections}. -@option{--compress-debug-sections=3Dzlib-gnu} compresses DWARF debug -sections using zlib. The debug sections are renamed to begin with -@samp{.zdebug}. Note if compression would make a given section -@emph{larger} then it is not compressed nor renamed. +@option{--compress-debug-sections=3Dzlib-gnu} compresses DWARF debug secti= ons +using the obsoleted zlib-gnu format. The debug sections are renamed to be= gin +with @samp{.zdebug}. +@option{--compress-debug-sections=3Dzstd} compresses DWARF debug +sections using zstd. Note - if compression would actually make a section +@emph{larger}, then it is not compressed nor renamed. =20 @end ifset =20 diff --git a/gas/write.c b/gas/write.c index f76bbdb706e..0e49df7c03f 100644 --- a/gas/write.c +++ b/gas/write.c @@ -1413,7 +1413,7 @@ write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *s= ec, } =20 static int -compress_frag (struct z_stream_s *strm, const char *contents, int in_size, +compress_frag (bool use_zstd, void *ctx, const char *contents, int in_size, fragS **last_newf, struct obstack *ob) { int out_size; @@ -1442,10 +1442,10 @@ compress_frag (struct z_stream_s *strm, const char = *contents, int in_size, as_fatal (_("can't extend frag")); next_out =3D obstack_next_free (ob); obstack_blank_fast (ob, avail_out); - out_size =3D compress_data (strm, &contents, &in_size, - &next_out, &avail_out); + out_size =3D compress_data (use_zstd, ctx, &contents, &in_size, &nex= t_out, + &avail_out); if (out_size < 0) - return -1; + return -1; =20 f->fr_fix +=3D out_size; total_out_size +=3D out_size; @@ -1471,7 +1471,6 @@ compress_debug (bfd *abfd, asection *sec, void *xxx A= TTRIBUTE_UNUSED) const char *section_name; char *compressed_name; char *header; - struct z_stream_s *strm; int x; flagword flags =3D bfd_section_flags (sec); unsigned int header_size, compression_header_size; @@ -1485,20 +1484,21 @@ compress_debug (bfd *abfd, asection *sec, void *xxx= ATTRIBUTE_UNUSED) if (!startswith (section_name, ".debug_")) return; =20 - strm =3D compress_init (); - if (strm =3D=3D NULL) + bool use_zstd =3D abfd->flags & BFD_COMPRESS_ZSTD; + void *ctx =3D compress_init (use_zstd); + if (ctx =3D=3D NULL) return; =20 - if (flag_compress_debug =3D=3D COMPRESS_DEBUG_GABI_ZLIB) + if (flag_compress_debug =3D=3D COMPRESS_DEBUG_GNU_ZLIB) { - compression_header_size - =3D bfd_get_compression_header_size (stdoutput, NULL); - header_size =3D compression_header_size; + compression_header_size =3D 0; + header_size =3D 12; } else { - compression_header_size =3D 0; - header_size =3D 12; + compression_header_size + =3D bfd_get_compression_header_size (stdoutput, NULL); + header_size =3D compression_header_size; } =20 /* Create a new frag to contain the compression header. */ @@ -1531,7 +1531,7 @@ compress_debug (bfd *abfd, asection *sec, void *xxx A= TTRIBUTE_UNUSED) gas_assert (f->fr_type =3D=3D rs_fill); if (f->fr_fix) { - out_size =3D compress_frag (strm, f->fr_literal, f->fr_fix, + out_size =3D compress_frag (use_zstd, ctx, f->fr_literal, f->fr_fix, &last_newf, ob); if (out_size < 0) return; @@ -1545,8 +1545,8 @@ compress_debug (bfd *abfd, asection *sec, void *xxx A= TTRIBUTE_UNUSED) { while (count--) { - out_size =3D compress_frag (strm, fill_literal, (int) fill_size, - &last_newf, ob); + out_size =3D compress_frag (use_zstd, ctx, fill_literal, + (int)fill_size, &last_newf, ob); if (out_size < 0) return; compressed_size +=3D out_size; @@ -1579,7 +1579,7 @@ compress_debug (bfd *abfd, asection *sec, void *xxx A= TTRIBUTE_UNUSED) as_fatal (_("can't extend frag")); next_out =3D obstack_next_free (ob); obstack_blank_fast (ob, avail_out); - x =3D compress_finish (strm, &next_out, &avail_out, &out_size); + x =3D compress_finish (use_zstd, ctx, &next_out, &avail_out, &out_si= ze); if (x < 0) return; =20 @@ -2540,6 +2540,8 @@ write_object_file (void) { if (flag_compress_debug =3D=3D COMPRESS_DEBUG_GABI_ZLIB) stdoutput->flags |=3D BFD_COMPRESS | BFD_COMPRESS_GABI; + else if (flag_compress_debug =3D=3D COMPRESS_DEBUG_ZSTD) + stdoutput->flags |=3D BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZST= D; else stdoutput->flags |=3D BFD_COMPRESS; bfd_map_over_sections (stdoutput, compress_debug, (char *) 0); diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 2598b81d205..c528ee5aa80 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -173,6 +173,9 @@ BFD_CFLAGS =3D -I$(BFD_DIR) -I$(BFD_SRC) ZLIB =3D @zlibdir@ -lz ZLIBINC =3D @zlibinc@ =20 +ZSTD_CFLAGS =3D @ZSTD_CFLAGS@ +ZSTD_LIBS =3D @ZSTD_LIBS@ + # Where is the decnumber library? Typically in ../libdecnumber. LIBDECNUMBER_DIR =3D ../libdecnumber LIBDECNUMBER =3D $(LIBDECNUMBER_DIR)/libdecnumber.a @@ -625,7 +628,7 @@ INTERNAL_CPPFLAGS =3D $(CPPFLAGS) @GUILE_CPPFLAGS@ @PYT= HON_CPPFLAGS@ \ INTERNAL_CFLAGS_BASE =3D \ $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \ $(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) $(ZLIBINC) \ - $(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \ + $(ZSTD_CFLAGS) $(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \ $(INTL_CFLAGS) $(INCGNU) $(INCSUPPORT) $(LIBBACKTRACE_INC) \ $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) $(SRCHIGH_CFLAGS) \ $(TOP_CFLAGS) $(PTHREAD_CFLAGS) $(DEBUGINFOD_CFLAGS) @@ -647,7 +650,7 @@ INTERNAL_LDFLAGS =3D \ # Libraries and corresponding dependencies for compiling gdb. # XM_CLIBS, defined in *config files, have host-dependent libs. # LIBIBERTY appears twice on purpose. -CLIBS =3D $(SIM) $(READLINE) $(OPCODES) $(LIBCTF) $(BFD) $(ZLIB) \ +CLIBS =3D $(SIM) $(READLINE) $(OPCODES) $(LIBCTF) $(BFD) $(ZLIB) $(ZSTD_LI= BS) \ $(LIBSUPPORT) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \ $(XM_CLIBS) $(GDBTKLIBS) $(LIBBACKTRACE_LIB) \ @LIBS@ @GUILE_LIBS@ @PYTHON_LIBS@ \ @@ -2298,6 +2301,7 @@ aclocal_m4_deps =3D \ ../config/lcmessage.m4 \ ../config/codeset.m4 \ ../config/zlib.m4 \ + ../config/zstd.m4 \ ../config/ax_pthread.m4 =20 $(srcdir)/aclocal.m4: @MAINTAINER_MODE_TRUE@ $(aclocal_m4_deps) diff --git a/gdb/NEWS b/gdb/NEWS index 9619842bc03..1457c99ff04 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -57,6 +57,8 @@ =20 * The Windows native target now supports target async. =20 +* gdb now supports zstd compressed debug sections (ELFCOMPRESS_ZSTD) for E= LF. + * New commands =20 maintenance set ignore-prologue-end-flag on|off diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 index 95ff2b6f35e..28846119dcb 100644 --- a/gdb/acinclude.m4 +++ b/gdb/acinclude.m4 @@ -43,6 +43,7 @@ m4_include([../config/lib-link.m4]) m4_include([../config/iconv.m4]) =20 m4_include([../config/zlib.m4]) +m4_include([../config/zstd.m4]) =20 m4_include([../gdbsupport/common.m4]) =20 @@ -233,7 +234,7 @@ AC_DEFUN([GDB_AC_CHECK_BFD], [ # always want our bfd. CFLAGS=3D"-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" ZLIBDIR=3D`echo $zlibdir | sed 's,\$(top_builddir)/,,g'` - LDFLAGS=3D"-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS" + LDFLAGS=3D"-L../bfd -L../libiberty $ZLIBDIR $ZSTD_LIBS $LDFLAGS" intl=3D`echo $LIBINTL | sed 's,${top_builddir}/,,g'` LIBS=3D"-lbfd -liberty -lz $intl $LIBS" AC_CACHE_CHECK( diff --git a/gdb/config.in b/gdb/config.in index a4975c68aad..e13a409ec2d 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -589,6 +589,9 @@ /* Define to 1 if you have the `XML_StopParser' function. */ #undef HAVE_XML_STOPPARSER =20 +/* Define to 1 if zstd is enabled. */ +#undef HAVE_ZSTD + /* Define to 1 if your system has the _etext variable. */ #undef HAVE__ETEXT =20 diff --git a/gdb/configure b/gdb/configure index 4dbd0c3b13c..9c7a37a623e 100755 --- a/gdb/configure +++ b/gdb/configure @@ -747,6 +747,8 @@ READLINE_DEPS READLINE LTLIBICONV LIBICONV +ZSTD_LIBS +ZSTD_CFLAGS zlibinc zlibdir MIG @@ -893,6 +895,7 @@ enable_codesign with_pkgversion with_bugurl with_system_zlib +with_zstd with_gnu_ld enable_rpath with_libiconv_prefix @@ -961,6 +964,8 @@ DEBUGINFOD_CFLAGS DEBUGINFOD_LIBS YACC YFLAGS +ZSTD_CFLAGS +ZSTD_LIBS XMKMF' ac_subdirs_all=3D'testsuite gdbtk' @@ -1641,6 +1646,8 @@ Optional Packages: --with-pkgversion=3DPKG Use PKG in the version string in place of "GDB" --with-bugurl=3DURL Direct users to URL to report a bug --with-system-zlib use installed libz + --with-zstd support zstd compressed debug sections + (default=3Dauto) --with-gnu-ld assume the C compiler uses GNU ld default=3Dno --with-libiconv-prefix[=3DDIR] search for libiconv in DIR/include and D= IR/lib --without-libiconv-prefix don't search for libiconv in includedir an= d libdir @@ -1721,6 +1728,8 @@ Some influential environment variables: YFLAGS The list of arguments that will be passed by default to $YAC= C. This script will default YFLAGS to the empty string to avoid= a default value of `-d' given by some make applications. + ZSTD_CFLAGS C compiler flags for ZSTD, overriding pkg-config + ZSTD_LIBS linker flags for ZSTD, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System =20 Use these variables to override the choices made by `configure' or to help @@ -8242,7 +8251,8 @@ if test "$ac_res" !=3D no; then : fi =20 =20 -# Link in zlib if we can. This allows us to read compressed debug section= s. +# Link in zlib/zstd if we can. This allows us to read compressed debug +# sections. =20 # Use the system's zlib library. zlibdir=3D"-L\$(top_builddir)/../zlib" @@ -8262,6 +8272,127 @@ fi =20 =20 =20 +# Check whether --with-zstd was given. +if test "${with_zstd+set}" =3D set; then : + withval=3D$with_zstd; +else + with_zstd=3Dauto +fi + + +if test "$with_zstd" !=3D no; then : + +pkg_failed=3Dno +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd" >&5 +$as_echo_n "checking for libzstd... " >&6; } + +if test -n "$ZSTD_CFLAGS"; then + pkg_cv_ZSTD_CFLAGS=3D"$ZSTD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_CFLAGS=3D`$PKG_CONFIG --cflags "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi +if test -n "$ZSTD_LIBS"; then + pkg_cv_ZSTD_LIBS=3D"$ZSTD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --pri= nt-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=3D$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? =3D $ac_status" >&5 + test $ac_status =3D 0; }; then + pkg_cv_ZSTD_LIBS=3D`$PKG_CONFIG --libs "libzstd" 2>/dev/null` + test "x$?" !=3D "x0" && pkg_failed=3Dyes +else + pkg_failed=3Dyes +fi + else + pkg_failed=3Duntried +fi + +if test $pkg_failed =3D no; then + pkg_save_LDFLAGS=3D"$LDFLAGS" + LDFLAGS=3D"$LDFLAGS $pkg_cv_ZSTD_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + pkg_failed=3Dyes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=3D$pkg_save_LDFLAGS +fi + + + +if test $pkg_failed =3D yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=3Dyes +else + _pkg_short_errors_supported=3Dno +fi + if test $_pkg_short_errors_supported =3D yes; then + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --short-errors --print-errors --cf= lags --libs "libzstd" 2>&1` + else + ZSTD_PKG_ERRORS=3D`$PKG_CONFIG --print-errors --cflags --libs "li= bzstd" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ZSTD_PKG_ERRORS" >&5 + + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +elif test $pkg_failed =3D untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "$with_zstd" =3D yes; then + as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is n= ot found" "$LINENO" 5 + fi + +else + ZSTD_CFLAGS=3D$pkg_cv_ZSTD_CFLAGS + ZSTD_LIBS=3D$pkg_cv_ZSTD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +$as_echo "#define HAVE_ZSTD 1" >>confdefs.h + + +fi + +fi + + + if test "X$prefix" =3D "XNONE"; then acl_final_prefix=3D"$ac_default_prefix" else @@ -17281,7 +17412,7 @@ WIN32LIBS=3D"$WIN32LIBS $WIN32APILIBS" # always want our bfd. CFLAGS=3D"-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" ZLIBDIR=3D`echo $zlibdir | sed 's,\$(top_builddir)/,,g'` - LDFLAGS=3D"-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS" + LDFLAGS=3D"-L../bfd -L../libiberty $ZLIBDIR $ZSTD_LIBS $LDFLAGS" intl=3D`echo $LIBINTL | sed 's,${top_builddir}/,,g'` LIBS=3D"-lbfd -liberty -lz $intl $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF support in BFD= " >&5 @@ -17396,7 +17527,7 @@ fi # always want our bfd. CFLAGS=3D"-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" ZLIBDIR=3D`echo $zlibdir | sed 's,\$(top_builddir)/,,g'` - LDFLAGS=3D"-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS" + LDFLAGS=3D"-L../bfd -L../libiberty $ZLIBDIR $ZSTD_LIBS $LDFLAGS" intl=3D`echo $LIBINTL | sed 's,${top_builddir}/,,g'` LIBS=3D"-lbfd -liberty -lz $intl $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O support in = BFD" >&5 diff --git a/gdb/configure.ac b/gdb/configure.ac index 215a91c5b27..fceb80e8c9d 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -460,8 +460,10 @@ AC_SEARCH_LIBS(gethostbyname, nsl) # Some systems (e.g. Solaris) have `socketpair' in libsocket. AC_SEARCH_LIBS(socketpair, socket) =20 -# Link in zlib if we can. This allows us to read compressed debug section= s. +# Link in zlib/zstd if we can. This allows us to read compressed debug +# sections. AM_ZLIB +AC_ZSTD =20 AM_ICONV =20 diff --git a/ld/Makefile.am b/ld/Makefile.am index d31021c13e2..bbe25f3aca2 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -45,7 +45,7 @@ ELF_CLFAGS=3D-DELF_LIST_OPTIONS=3D@elf_list_options@ \ -DELF_PLT_UNWIND_LIST_OPTIONS=3D@elf_plt_unwind_list_options@ WARN_CFLAGS =3D @WARN_CFLAGS@ NO_WERROR =3D @NO_WERROR@ -AM_CFLAGS =3D $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) +AM_CFLAGS =3D $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) $(ZSTD_CFLAGS) =20 # We put the scripts in the directory $(scriptdir)/ldscripts. # We can't put the scripts in $(datadir) because the SEARCH_DIR @@ -959,7 +959,8 @@ ld_new_SOURCES =3D ldgram.y ldlex-wrapper.c lexsup.c ld= lang.c mri.c ldctor.c ldmai ldbuildid.c ld_new_DEPENDENCIES =3D $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) \ $(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL_DEP) $(JANSSON_LIBS) -ld_new_LDADD =3D $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBC= TF) $(LIBIBERTY) $(LIBINTL) $(ZLIB) $(JANSSON_LIBS) +ld_new_LDADD =3D $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBC= TF) \ + $(LIBIBERTY) $(LIBINTL) $(ZLIB) $(ZSTD_LIBS) $(JANSSON_LIBS) =20 # Dependency tracking for the generated emulation files. EXTRA_ld_new_SOURCES +=3D $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOUR= CES) diff --git a/ld/Makefile.in b/ld/Makefile.in index ee0c98f65b0..400eed2717e 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -126,7 +126,8 @@ am__aclocal_m4_deps =3D $(top_srcdir)/../bfd/acinclude.= m4 \ $(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/progtest.m4 \ - $(top_srcdir)/../config/zlib.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/../config/zlib.m4 \ + $(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \ $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../bfd/version.m4 $(top_srcdir)/configure.ac @@ -477,6 +478,8 @@ WARN_WRITE_STRINGS =3D @WARN_WRITE_STRINGS@ XGETTEXT =3D @XGETTEXT@ YACC =3D `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir= )/../bison/; else echo @YACC@; fi` YFLAGS =3D -d +ZSTD_CFLAGS =3D @ZSTD_CFLAGS@ +ZSTD_LIBS =3D @ZSTD_LIBS@ abs_builddir =3D @abs_builddir@ abs_srcdir =3D @abs_srcdir@ abs_top_builddir =3D @abs_top_builddir@ @@ -564,7 +567,7 @@ ELF_CLFAGS =3D -DELF_LIST_OPTIONS=3D@elf_list_options@ \ -DELF_SHLIB_LIST_OPTIONS=3D@elf_shlib_list_options@ \ -DELF_PLT_UNWIND_LIST_OPTIONS=3D@elf_plt_unwind_list_options@ =20 -AM_CFLAGS =3D $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) +AM_CFLAGS =3D $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) $(ZSTD_CFLAGS) =20 # We put the scripts in the directory $(scriptdir)/ldscripts. # We can't put the scripts in $(datadir) because the SEARCH_DIR @@ -1011,7 +1014,9 @@ ld_new_SOURCES =3D ldgram.y ldlex-wrapper.c lexsup.c = ldlang.c mri.c ldctor.c ldmai ld_new_DEPENDENCIES =3D $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) \ $(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL_DEP) $(JANSSON_LIBS) =20 -ld_new_LDADD =3D $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBC= TF) $(LIBIBERTY) $(LIBINTL) $(ZLIB) $(JANSSON_LIBS) +ld_new_LDADD =3D $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBC= TF) \ + $(LIBIBERTY) $(LIBINTL) $(ZLIB) $(ZSTD_LIBS) $(JANSSON_LIBS) + # # # Build a dummy plugin using libtool. diff --git a/ld/NEWS b/ld/NEWS index 355752e6b24..dfe2690d9f2 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,8 @@ -*- text -*- =20 +* ld now supports zstd compressed debug sections. The new option + --compress-debug-sections=3Dzstd compresses debug sections with zstd. + Changes in 2.39: =20 * The ELF linker will now generate a warning message if the stack is made diff --git a/ld/aclocal.m4 b/ld/aclocal.m4 index d20c542eed5..893e973e4f2 100644 --- a/ld/aclocal.m4 +++ b/ld/aclocal.m4 @@ -1203,6 +1203,7 @@ m4_include([../config/plugins.m4]) m4_include([../config/po.m4]) m4_include([../config/progtest.m4]) m4_include([../config/zlib.m4]) +m4_include([../config/zstd.m4]) m4_include([../libtool.m4]) m4_include([../ltoptions.m4]) m4_include([../ltsugar.m4]) diff --git a/ld/config.in b/ld/config.in index 0ccd79d59cd..3916740eee4 100644 --- a/ld/config.in +++ b/ld/config.in @@ -162,6 +162,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H =20 +/* Define to 1 if zstd is enabled. */ +#undef HAVE_ZSTD + /* Define to the sub-directory in which libtool stores uninstalled librari= es. */ #undef LT_OBJDIR diff --git a/ld/configure b/ld/configure index 4efe3ef5dfc..9dd3ed5f1e7 100755 --- a/ld/configure +++ b/ld/configure @@ -646,6 +646,8 @@ elf_plt_unwind_list_options elf_shlib_list_options elf_list_options STRINGIFY +ZSTD_LIBS +ZSTD_CFLAGS zlibinc zlibdir NATIVE_LIB_DIRS @@ -679,9 +681,6 @@ WARN_CFLAGS_FOR_BUILD WARN_CFLAGS JANSSON_LIBS JANSSON_CFLAGS -PKG_CONFIG_LIBDIR -PKG_CONFIG_PATH -PKG_CONFIG enable_libctf ENABLE_LIBCTF_FALSE ENABLE_LIBCTF_TRUE @@ -711,6 +710,9 @@ LD FGREP SED LIBTOOL +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG EGREP CPP GREP @@ -855,6 +857,7 @@ enable_werror enable_build_warnings enable_nls with_system_zlib +with_zstd ' ac_precious_vars=3D'build_alias host_alias @@ -868,14 +871,16 @@ CXX CXXFLAGS CCC CPP -CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR +CXXCPP JANSSON_CFLAGS JANSSON_LIBS YACC -YFLAGS' +YFLAGS +ZSTD_CFLAGS +ZSTD_LIBS' =20 =20 # Initialize some variables set by options. @@ -1552,6 +1557,8 @@ Optional Packages: --with-lib-path=3Ddir1:dir2... set default LIB_PATH --with-sysroot=3DDIR Search for usr/lib et al within DIR. --with-system-zlib use installed libz + --with-zstd support zstd compressed debug sections + (default=3Dauto) =20 Some influential environment variables: CC C compiler command @@ -1564,12 +1571,12 @@ Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor - CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path + CXXCPP C++ preprocessor JANSSON_CFLAGS C compiler flags for JANSSON, overriding pkg-config JANSSON_LIBS @@ -1580,6 +1587,8 @@ Some influential environment variables: YFLAGS The list of arguments that will be passed by default to $YAC= C. This script will default YFLAGS to the empty string to avoid= a default value of `-d' given by some make applications. + ZSTD_CFLAGS C compiler flags for ZSTD, overriding pkg-config + ZSTD_LIBS linker flags for ZSTD, overriding pkg-config =20 Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -5388,6 +5397,126 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6= ; } =20 =20 =20 + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" !=3D "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be = a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=3D$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG=3D"$PKG_CONFIG" # Let the user override the test w= ith a path. + ;; + *) + as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=3D$as_save_IFS + test -z "$as_dir" && as_dir=3D. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 + break 2 + fi +done + done +IFS=3D$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=3D$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=3D$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name wi= th args. +set dummy pkg-config; ac_word=3D$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG=3D"$ac_pt_PKG_CONFIG" # Let the user overrid= e the test with a path. + ;; + *) + as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=3D$as_save_IFS + test -z "$as_dir" && as_dir=3D. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 + break 2 + fi +done + done +IFS=3D$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=3D$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" =3D x; then + PKG_CONFIG=3D"" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not pr= efixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triple= t" >&2;} +ac_tool_warned=3Dyes ;; +esac + PKG_CONFIG=3D$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG=3D"$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=3D0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least = version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... "= >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG=3D"" + fi +fi + case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cop= e well with whitespace in \`pwd\`" >&5 @@ -11491,7 +11620,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11494 "configure" +#line 11623 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -11597,7 +11726,7 @@ else lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 lt_status=3D$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11600 "configure" +#line 11729 "configure" #include "confdefs.h" =20 #if HAVE_DLFCN_H @@ -15585,126 +15714,6 @@ else fi =20 =20 - - - - - - - -if test "x$ac_cv_env_PKG_CONFIG_set" !=3D "xset"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be = a program name with args. -set dummy ${ac_tool_prefix}pkg-config; ac_word=3D$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKG_CONFIG=3D"$PKG_CONFIG" # Let the user override the test w= ith a path. - ;; - *) - as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=3D$as_save_IFS - test -z "$as_dir" && as_dir=3D. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 - break 2 - fi -done - done -IFS=3D$as_save_IFS - - ;; -esac -fi -PKG_CONFIG=3D$ac_cv_path_PKG_CONFIG -if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_PKG_CONFIG"; then - ac_pt_PKG_CONFIG=3D$PKG_CONFIG - # Extract the first word of "pkg-config", so it can be a program name wi= th args. -set dummy pkg-config; ac_word=3D$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_PKG_CONFIG=3D"$ac_pt_PKG_CONFIG" # Let the user overrid= e the test with a path. - ;; - *) - as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=3D$as_save_IFS - test -z "$as_dir" && as_dir=3D. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG=3D"$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_= ext" >&5 - break 2 - fi -done - done -IFS=3D$as_save_IFS - - ;; -esac -fi -ac_pt_PKG_CONFIG=3D$ac_cv_path_ac_pt_PKG_CONFIG -if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_PKG_CONFIG" =3D x; then - PKG_CONFIG=3D"" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not pr= efixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triple= t" >&2;} -ac_tool_warned=3Dyes ;; -esac - PKG_CONFIG=3D$ac_pt_PKG_CONFIG - fi -else - PKG_CONFIG=3D"$ac_cv_path_PKG_CONFIG" -fi - -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=3D0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least = version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... "= >&6; } - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - PKG_CONFIG=3D"" - fi -fi if test "x$enable_jansson" !=3D "xno"; then : =20 pkg_failed=3Dno @@ -17041,8 +17050,8 @@ $as_echo "#define HAVE_DECL_GETOPT 1" >>confdefs.h =20 fi =20 -# Link in zlib if we can. This allows us to read and write -# compressed CTF sections. +# Link in zlib/zstd if we can. This allows us to read and write +# compressed [...] [diff truncated at 100000 bytes]