binutils, gdb: support zstd compressed debug sections

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.

* bfd: for addr2line, objdump --dwarf, gdb, etc
* gas: support --compress-debug-sections=zstd
* ld: support ELFCOMPRESS_ZSTD input and --compress-debug-sections=zstd
* objcopy: support ELFCOMPRESS_ZSTD input for
  --decompress-debug-sections and --compress-debug-sections=zstd
* gdb: support ELFCOMPRESS_ZSTD input.  The bfd change references zstd
  symbols, so gdb has to link against -lzstd in this patch.

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.

```
% 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
...

% ld/ld-new a.o --compress-debug-sections=zstd
ld/ld-new: --compress-debug-sections=zstd: ld is not built with zstd support

% binutils/objcopy --compress-debug-sections=zstd a.o b.o
binutils/objcopy: --compress-debug-sections=zstd: binutils is not built with zstd support

% 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
...
```
This commit is contained in:
Fangrui Song 2022-09-26 19:50:13 -07:00 committed by Fangrui Song
parent e122316b7c
commit 2cac01e3ff
56 changed files with 1490 additions and 254 deletions

View file

@ -57,7 +57,7 @@ ZLIBINC = @zlibinc@
WARN_CFLAGS = @WARN_CFLAGS@ WARN_CFLAGS = @WARN_CFLAGS@
NO_WERROR = @NO_WERROR@ NO_WERROR = @NO_WERROR@
AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS)
AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"' @LARGEFILE_CPPFLAGS@ AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"' @LARGEFILE_CPPFLAGS@
if PLUGINS if PLUGINS
bfdinclude_HEADERS += $(INCDIR)/plugin-api.h bfdinclude_HEADERS += $(INCDIR)/plugin-api.h
@ -776,7 +776,7 @@ ofiles: stamp-ofiles ; @true
libbfd_la_SOURCES = $(BFD32_LIBS_CFILES) libbfd_la_SOURCES = $(BFD32_LIBS_CFILES)
EXTRA_libbfd_la_SOURCES = $(CFILES) EXTRA_libbfd_la_SOURCES = $(CFILES)
libbfd_la_DEPENDENCIES = $(OFILES) ofiles libbfd_la_DEPENDENCIES = $(OFILES) ofiles
libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) $(ZSTD_LIBS)
libbfd_la_LDFLAGS += -release `cat libtool-soversion` @SHARED_LDFLAGS@ libbfd_la_LDFLAGS += -release `cat libtool-soversion` @SHARED_LDFLAGS@
# libtool will build .libs/libbfd.a. We create libbfd.a in the build # libtool will build .libs/libbfd.a. We create libbfd.a in the build

View file

@ -122,10 +122,12 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
$(top_srcdir)/../config/lead-dot.m4 \ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/nls.m4 \ $(top_srcdir)/../config/nls.m4 \
$(top_srcdir)/../config/override.m4 \ $(top_srcdir)/../config/override.m4 \
$(top_srcdir)/../config/pkg.m4 \
$(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/plugins.m4 \
$(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/po.m4 \
$(top_srcdir)/../config/progtest.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)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
$(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
$(top_srcdir)/bfd.m4 $(top_srcdir)/warning.m4 \ $(top_srcdir)/bfd.m4 $(top_srcdir)/warning.m4 \
@ -399,6 +401,9 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKGVERSION = @PKGVERSION@ PKGVERSION = @PKGVERSION@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
POSUB = @POSUB@ POSUB = @POSUB@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
REPORT_BUGS_TEXI = @REPORT_BUGS_TEXI@ REPORT_BUGS_TEXI = @REPORT_BUGS_TEXI@
@ -416,6 +421,8 @@ WARN_CFLAGS = @WARN_CFLAGS@
WARN_CFLAGS_FOR_BUILD = @WARN_CFLAGS_FOR_BUILD@ WARN_CFLAGS_FOR_BUILD = @WARN_CFLAGS_FOR_BUILD@
WARN_WRITE_STRINGS = @WARN_WRITE_STRINGS@ WARN_WRITE_STRINGS = @WARN_WRITE_STRINGS@
XGETTEXT = @XGETTEXT@ XGETTEXT = @XGETTEXT@
ZSTD_CFLAGS = @ZSTD_CFLAGS@
ZSTD_LIBS = @ZSTD_LIBS@
abs_builddir = @abs_builddir@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@ abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@ abs_top_builddir = @abs_top_builddir@
@ -520,7 +527,7 @@ libbfd_la_LDFLAGS = $(am__append_1) -release `cat libtool-soversion` \
# case both are empty. # case both are empty.
ZLIB = @zlibdir@ -lz ZLIB = @zlibdir@ -lz
ZLIBINC = @zlibinc@ ZLIBINC = @zlibinc@
AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS)
AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"' \ AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"' \
@LARGEFILE_CPPFLAGS@ @HDEFINES@ @COREFLAG@ @TDEFINES@ \ @LARGEFILE_CPPFLAGS@ @HDEFINES@ @COREFLAG@ @TDEFINES@ \
$(CSEARCH) $(CSWITCHES) $(HAVEVECS) @INCINTL@ $(CSEARCH) $(CSWITCHES) $(HAVEVECS) @INCINTL@
@ -1199,7 +1206,7 @@ OFILES = $(BFD_BACKENDS) $(BFD_MACHINES) @COREFILE@ @bfd64_libs@
libbfd_la_SOURCES = $(BFD32_LIBS_CFILES) libbfd_la_SOURCES = $(BFD32_LIBS_CFILES)
EXTRA_libbfd_la_SOURCES = $(CFILES) EXTRA_libbfd_la_SOURCES = $(CFILES)
libbfd_la_DEPENDENCIES = $(OFILES) ofiles libbfd_la_DEPENDENCIES = $(OFILES) ofiles
libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) $(ZSTD_LIBS)
# libtool will build .libs/libbfd.a. We create libbfd.a in the build # 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 # directory so that we don't have to convert all the programs that use

2
bfd/aclocal.m4 vendored
View file

@ -1176,10 +1176,12 @@ m4_include([../config/largefile.m4])
m4_include([../config/lead-dot.m4]) m4_include([../config/lead-dot.m4])
m4_include([../config/nls.m4]) m4_include([../config/nls.m4])
m4_include([../config/override.m4]) m4_include([../config/override.m4])
m4_include([../config/pkg.m4])
m4_include([../config/plugins.m4]) m4_include([../config/plugins.m4])
m4_include([../config/po.m4]) m4_include([../config/po.m4])
m4_include([../config/progtest.m4]) m4_include([../config/progtest.m4])
m4_include([../config/zlib.m4]) m4_include([../config/zlib.m4])
m4_include([../config/zstd.m4])
m4_include([../libtool.m4]) m4_include([../libtool.m4])
m4_include([../ltoptions.m4]) m4_include([../ltoptions.m4])
m4_include([../ltsugar.m4]) m4_include([../ltsugar.m4])

View file

@ -342,7 +342,8 @@ enum compressed_debug_section_type
COMPRESS_DEBUG_NONE = 0, COMPRESS_DEBUG_NONE = 0,
COMPRESS_DEBUG = 1 << 0, COMPRESS_DEBUG = 1 << 0,
COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1, COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1,
COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2 COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2,
COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3
}; };
/* This structure is used to keep track of stabs in sections /* This structure is used to keep track of stabs in sections

View file

@ -349,7 +349,8 @@ enum compressed_debug_section_type
COMPRESS_DEBUG_NONE = 0, COMPRESS_DEBUG_NONE = 0,
COMPRESS_DEBUG = 1 << 0, COMPRESS_DEBUG = 1 << 0,
COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1, COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1,
COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2 COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2,
COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3
}; };
/* This structure is used to keep track of stabs in sections /* This structure is used to keep track of stabs in sections
@ -962,7 +963,8 @@ typedef struct bfd_section
unsigned int compress_status : 2; unsigned int compress_status : 2;
#define COMPRESS_SECTION_NONE 0 #define COMPRESS_SECTION_NONE 0
#define COMPRESS_SECTION_DONE 1 #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. */ /* The following flags are used by the ELF linker. */
@ -6637,12 +6639,14 @@ struct bfd
#define BFD_ARCHIVE_FULL_PATH 0x100000 #define BFD_ARCHIVE_FULL_PATH 0x100000
#define BFD_CLOSED_BY_CACHE 0x200000 #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. */ /* Flags bits to be saved in bfd_preserve_save. */
#define BFD_FLAGS_SAVED \ #define BFD_FLAGS_SAVED \
(BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
| BFD_PLUGIN | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON \ | 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. */ /* Flags bits which are for BFD use only. */
#define BFD_FLAGS_FOR_BFD_USE_MASK \ #define BFD_FLAGS_FOR_BFD_USE_MASK \
@ -7271,6 +7275,7 @@ void bfd_update_compression_header
bool bfd_check_compression_header bool bfd_check_compression_header
(bfd *abfd, bfd_byte *contents, asection *sec, (bfd *abfd, bfd_byte *contents, asection *sec,
unsigned int *ch_type,
bfd_size_type *uncompressed_size, bfd_size_type *uncompressed_size,
unsigned int *uncompressed_alignment_power); unsigned int *uncompressed_alignment_power);

View file

@ -177,12 +177,15 @@ CODE_FRAGMENT
.#define BFD_ARCHIVE_FULL_PATH 0x100000 .#define BFD_ARCHIVE_FULL_PATH 0x100000
. .
.#define BFD_CLOSED_BY_CACHE 0x200000 .#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. *} . {* Flags bits to be saved in bfd_preserve_save. *}
.#define BFD_FLAGS_SAVED \ .#define BFD_FLAGS_SAVED \
. (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ . (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
. | BFD_PLUGIN | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON \ . | 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. *} . {* Flags bits which are for BFD use only. *}
.#define BFD_FLAGS_FOR_BFD_USE_MASK \ .#define BFD_FLAGS_FOR_BFD_USE_MASK \
@ -2500,6 +2503,9 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
{ {
const struct elf_backend_data *bed = get_elf_backend_data (abfd); const struct elf_backend_data *bed = get_elf_backend_data (abfd);
struct bfd_elf_section_data * esd = elf_section_data (sec); struct bfd_elf_section_data * esd = elf_section_data (sec);
const unsigned int ch_type = abfd->flags & BFD_COMPRESS_ZSTD
? ELFCOMPRESS_ZSTD
: ELFCOMPRESS_ZLIB;
/* Set the SHF_COMPRESSED bit. */ /* Set the SHF_COMPRESSED bit. */
elf_section_flags (sec) |= SHF_COMPRESSED; elf_section_flags (sec) |= SHF_COMPRESSED;
@ -2507,7 +2513,7 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
if (bed->s->elfclass == ELFCLASS32) if (bed->s->elfclass == ELFCLASS32)
{ {
Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents; Elf32_External_Chdr *echdr = (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, sec->size, &echdr->ch_size);
bfd_put_32 (abfd, 1u << sec->alignment_power, bfd_put_32 (abfd, 1u << sec->alignment_power,
&echdr->ch_addralign); &echdr->ch_addralign);
@ -2518,7 +2524,7 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
else else
{ {
Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents; Elf64_External_Chdr *echdr = (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_32 (abfd, 0, &echdr->ch_reserved);
bfd_put_64 (abfd, sec->size, &echdr->ch_size); bfd_put_64 (abfd, sec->size, &echdr->ch_size);
bfd_put_64 (abfd, UINT64_C (1) << sec->alignment_power, bfd_put_64 (abfd, UINT64_C (1) << sec->alignment_power,
@ -2553,14 +2559,15 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
SYNOPSIS SYNOPSIS
bool bfd_check_compression_header bool bfd_check_compression_header
(bfd *abfd, bfd_byte *contents, asection *sec, (bfd *abfd, bfd_byte *contents, asection *sec,
unsigned int *ch_type,
bfd_size_type *uncompressed_size, bfd_size_type *uncompressed_size,
unsigned int *uncompressed_alignment_power); unsigned int *uncompressed_alignment_power);
DESCRIPTION DESCRIPTION
Check the compression header at CONTENTS of SEC in ABFD and Check the compression header at CONTENTS of SEC in ABFD and store the
store the uncompressed size in UNCOMPRESSED_SIZE and the ch_type in CH_TYPE, uncompressed size in UNCOMPRESSED_SIZE, and the
uncompressed data alignment in UNCOMPRESSED_ALIGNMENT_POWER uncompressed data alignment in UNCOMPRESSED_ALIGNMENT_POWER if the
if the compression header is valid. compression header is valid.
RETURNS RETURNS
Return TRUE if the compression header is valid. Return TRUE if the compression header is valid.
@ -2569,6 +2576,7 @@ RETURNS
bool bool
bfd_check_compression_header (bfd *abfd, bfd_byte *contents, bfd_check_compression_header (bfd *abfd, bfd_byte *contents,
asection *sec, asection *sec,
unsigned int *ch_type,
bfd_size_type *uncompressed_size, bfd_size_type *uncompressed_size,
unsigned int *uncompressed_alignment_power) unsigned int *uncompressed_alignment_power)
{ {
@ -2591,7 +2599,9 @@ bfd_check_compression_header (bfd *abfd, bfd_byte *contents,
chdr.ch_size = bfd_get_64 (abfd, &echdr->ch_size); chdr.ch_size = bfd_get_64 (abfd, &echdr->ch_size);
chdr.ch_addralign = bfd_get_64 (abfd, &echdr->ch_addralign); chdr.ch_addralign = bfd_get_64 (abfd, &echdr->ch_addralign);
} }
if (chdr.ch_type == ELFCOMPRESS_ZLIB *ch_type = chdr.ch_type;
if ((chdr.ch_type == ELFCOMPRESS_ZLIB
|| chdr.ch_type == ELFCOMPRESS_ZSTD)
&& chdr.ch_addralign == (chdr.ch_addralign & -chdr.ch_addralign)) && chdr.ch_addralign == (chdr.ch_addralign & -chdr.ch_addralign))
{ {
*uncompressed_size = chdr.ch_size; *uncompressed_size = chdr.ch_size;

View file

@ -20,18 +20,31 @@
#include "sysdep.h" #include "sysdep.h"
#include <zlib.h> #include <zlib.h>
#ifdef HAVE_ZSTD
#include <zstd.h>
#endif
#include "bfd.h" #include "bfd.h"
#include "elf-bfd.h"
#include "libbfd.h" #include "libbfd.h"
#include "safe-ctype.h" #include "safe-ctype.h"
#define MAX_COMPRESSION_HEADER_SIZE 24 #define MAX_COMPRESSION_HEADER_SIZE 24
static bool static bool
decompress_contents (bfd_byte *compressed_buffer, decompress_contents (bool is_zstd, bfd_byte *compressed_buffer,
bfd_size_type compressed_size, bfd_size_type compressed_size,
bfd_byte *uncompressed_buffer, bfd_byte *uncompressed_buffer,
bfd_size_type uncompressed_size) bfd_size_type uncompressed_size)
{ {
if (is_zstd)
{
#ifdef HAVE_ZSTD
size_t ret = ZSTD_decompress (uncompressed_buffer, uncompressed_size,
compressed_buffer, compressed_size);
return !ZSTD_isError (ret);
#endif
}
z_stream strm; z_stream strm;
int rc; int rc;
@ -69,7 +82,7 @@ decompress_contents (bfd_byte *compressed_buffer,
} }
/* Compress data of the size specified in @var{uncompressed_size} /* 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 as the contents field. This function assumes the contents
field was allocated using bfd_malloc() or equivalent. field was allocated using bfd_malloc() or equivalent.
@ -150,8 +163,9 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
sec->size = orig_uncompressed_size; sec->size = orig_uncompressed_size;
if (decompress) if (decompress)
{ {
if (!decompress_contents (uncompressed_buffer if (!decompress_contents (
+ orig_compression_header_size, sec->compress_status == DECOMPRESS_SECTION_ZSTD,
uncompressed_buffer + orig_compression_header_size,
zlib_size, buffer, buffer_size)) zlib_size, buffer, buffer_size))
{ {
bfd_set_error (bfd_error_bad_value); bfd_set_error (bfd_error_bad_value);
@ -175,10 +189,23 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
} }
else else
{ {
if (compress ((Bytef*) buffer + header_size, if (abfd->flags & BFD_COMPRESS_ZSTD)
&compressed_size, {
(const Bytef*) uncompressed_buffer, #if HAVE_ZSTD
uncompressed_size) != Z_OK) compressed_size = 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)
!= Z_OK)
{ {
bfd_release (abfd, buffer); bfd_release (abfd, buffer);
bfd_set_error (bfd_error_bad_value); 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_size_type save_rawsize;
bfd_byte *compressed_buffer; bfd_byte *compressed_buffer;
unsigned int compression_header_size; unsigned int compression_header_size;
const unsigned int compress_status = sec->compress_status;
if (abfd->direction != write_direction && sec->rawsize != 0) if (abfd->direction != write_direction && sec->rawsize != 0)
sz = sec->rawsize; sz = sec->rawsize;
@ -248,7 +276,7 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
return true; return true;
} }
switch (sec->compress_status) switch (compress_status)
{ {
case COMPRESS_SECTION_NONE: case COMPRESS_SECTION_NONE:
if (p == NULL) if (p == NULL)
@ -298,7 +326,8 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
*ptr = p; *ptr = p;
return true; return true;
case DECOMPRESS_SECTION_SIZED: case DECOMPRESS_SECTION_ZLIB:
case DECOMPRESS_SECTION_ZSTD:
/* Read in the full compressed section contents. */ /* Read in the full compressed section contents. */
compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size); compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size);
if (compressed_buffer == NULL) if (compressed_buffer == NULL)
@ -316,7 +345,7 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
/* Restore rawsize and size. */ /* Restore rawsize and size. */
sec->rawsize = save_rawsize; sec->rawsize = save_rawsize;
sec->size = save_size; sec->size = save_size;
sec->compress_status = DECOMPRESS_SECTION_SIZED; sec->compress_status = compress_status;
if (!ret) if (!ret)
goto fail_compressed; goto fail_compressed;
@ -330,7 +359,9 @@ 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 /* Set header size to the zlib header size if it is a
SHF_COMPRESSED section. */ SHF_COMPRESSED section. */
compression_header_size = 12; compression_header_size = 12;
if (!decompress_contents (compressed_buffer + compression_header_size, bool is_zstd = compress_status == DECOMPRESS_SECTION_ZSTD;
if (!decompress_contents (
is_zstd, compressed_buffer + compression_header_size,
sec->compressed_size - compression_header_size, p, sz)) sec->compressed_size - compression_header_size, p, sz))
{ {
bfd_set_error (bfd_error_bad_value); bfd_set_error (bfd_error_bad_value);
@ -381,7 +412,8 @@ DESCRIPTION
void void
bfd_cache_section_contents (asection *sec, void *contents) bfd_cache_section_contents (asection *sec, void *contents)
{ {
if (sec->compress_status == DECOMPRESS_SECTION_SIZED) if (sec->compress_status == DECOMPRESS_SECTION_ZLIB
|| sec->compress_status == DECOMPRESS_SECTION_ZSTD)
sec->compress_status = COMPRESS_SECTION_DONE; sec->compress_status = COMPRESS_SECTION_DONE;
sec->contents = contents; sec->contents = contents;
sec->flags |= SEC_IN_MEMORY; sec->flags |= SEC_IN_MEMORY;
@ -418,6 +450,7 @@ bfd_is_section_compressed_with_header (bfd *abfd, sec_ptr sec,
int compression_header_size; int compression_header_size;
int header_size; int header_size;
unsigned int saved = sec->compress_status; unsigned int saved = sec->compress_status;
unsigned int ch_type;
bool compressed; bool compressed;
*uncompressed_align_pow_p = 0; *uncompressed_align_pow_p = 0;
@ -448,7 +481,7 @@ bfd_is_section_compressed_with_header (bfd *abfd, sec_ptr sec,
{ {
if (compression_header_size != 0) if (compression_header_size != 0)
{ {
if (!bfd_check_compression_header (abfd, header, sec, if (!bfd_check_compression_header (abfd, header, sec, &ch_type,
uncompressed_size_p, uncompressed_size_p,
uncompressed_align_pow_p)) uncompressed_align_pow_p))
compression_header_size = -1; compression_header_size = -1;
@ -507,7 +540,7 @@ SYNOPSIS
DESCRIPTION DESCRIPTION
Record compressed section size, update section size with Record compressed section size, update section size with
decompressed size and set compress_status to decompressed size and set compress_status to
DECOMPRESS_SECTION_SIZED. DECOMPRESS_SECTION_{ZLIB,ZSTD}.
Return @code{FALSE} if the section is not a valid compressed Return @code{FALSE} if the section is not a valid compressed
section. Otherwise, return @code{TRUE}. section. Otherwise, return @code{TRUE}.
@ -521,6 +554,7 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
int header_size; int header_size;
bfd_size_type uncompressed_size; bfd_size_type uncompressed_size;
unsigned int uncompressed_alignment_power = 0; unsigned int uncompressed_alignment_power = 0;
unsigned int ch_type;
z_stream strm; z_stream strm;
compression_header_size = bfd_get_compression_header_size (abfd, sec); compression_header_size = bfd_get_compression_header_size (abfd, sec);
@ -550,6 +584,7 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
uncompressed_size = bfd_getb64 (header + 4); uncompressed_size = bfd_getb64 (header + 4);
} }
else if (!bfd_check_compression_header (abfd, header, sec, else if (!bfd_check_compression_header (abfd, header, sec,
&ch_type,
&uncompressed_size, &uncompressed_size,
&uncompressed_alignment_power)) &uncompressed_alignment_power))
{ {
@ -569,7 +604,8 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
sec->compressed_size = sec->size; sec->compressed_size = sec->size;
sec->size = uncompressed_size; sec->size = uncompressed_size;
bfd_set_section_alignment (sec, uncompressed_alignment_power); bfd_set_section_alignment (sec, uncompressed_alignment_power);
sec->compress_status = DECOMPRESS_SECTION_SIZED; sec->compress_status = (ch_type == ELFCOMPRESS_ZSTD
? DECOMPRESS_SECTION_ZSTD : DECOMPRESS_SECTION_ZLIB);
return true; return true;
} }

View file

@ -232,6 +232,9 @@
/* Define to 1 if you have the <windows.h> header file. */ /* Define to 1 if you have the <windows.h> header file. */
#undef HAVE_WINDOWS_H #undef HAVE_WINDOWS_H
/* Define to 1 if zstd is enabled. */
#undef HAVE_ZSTD
/* Define to the sub-directory in which libtool stores uninstalled libraries. /* Define to the sub-directory in which libtool stores uninstalled libraries.
*/ */
#undef LT_OBJDIR #undef LT_OBJDIR

268
bfd/configure vendored
View file

@ -652,6 +652,11 @@ TDEFINES
SHARED_LIBADD SHARED_LIBADD
SHARED_LDFLAGS SHARED_LDFLAGS
LIBM LIBM
ZSTD_LIBS
ZSTD_CFLAGS
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
zlibinc zlibinc
zlibdir zlibdir
EXEEXT_FOR_BUILD EXEEXT_FOR_BUILD
@ -839,6 +844,7 @@ enable_maintainer_mode
enable_install_libbfd enable_install_libbfd
enable_nls enable_nls
with_system_zlib with_system_zlib
with_zstd
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
host_alias host_alias
@ -848,7 +854,12 @@ CFLAGS
LDFLAGS LDFLAGS
LIBS LIBS
CPPFLAGS CPPFLAGS
CPP' CPP
PKG_CONFIG
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
ZSTD_CFLAGS
ZSTD_LIBS'
# Initialize some variables set by options. # Initialize some variables set by options.
@ -1511,6 +1522,8 @@ Optional Packages:
Binutils" Binutils"
--with-bugurl=URL Direct users to URL to report a bug --with-bugurl=URL Direct users to URL to report a bug
--with-system-zlib use installed libz --with-system-zlib use installed libz
--with-zstd support zstd compressed debug sections
(default=auto)
Some influential environment variables: Some influential environment variables:
CC C compiler command CC C compiler command
@ -1521,6 +1534,13 @@ Some influential environment variables:
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir> you have headers in a nonstandard directory <include dir>
CPP C preprocessor 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
Use these variables to override the choices made by `configure' or to help Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations. it to find libraries and programs with nonstandard names/locations.
@ -11086,7 +11106,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11089 "configure" #line 11109 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -11192,7 +11212,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11195 "configure" #line 11215 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -12995,7 +13015,7 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h
;; ;;
esac esac
# Link in zlib if we can. This allows us to read compressed debug sections. # Link in zlib/zstd if we can. This allows us to read compressed debug sections.
# This is used only by compress.c. # This is used only by compress.c.
# Use the system's zlib library. # Use the system's zlib library.
@ -13015,6 +13035,246 @@ fi
if test "x$ac_cv_env_PKG_CONFIG_set" != "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=$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="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$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=$PKG_CONFIG
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$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="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
ac_pt_PKG_CONFIG=$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" = x; then
PKG_CONFIG=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
PKG_CONFIG=$ac_pt_PKG_CONFIG
fi
else
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=0.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=""
fi
fi
# Check whether --with-zstd was given.
if test "${with_zstd+set}" = set; then :
withval=$with_zstd;
else
with_zstd=auto
fi
if test "$with_zstd" != no; then
pkg_failed=no
{ $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="$ZSTD_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$ZSTD_LIBS"; then
pkg_cv_ZSTD_LIBS="$ZSTD_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = no; then
pkg_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$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=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$pkg_save_LDFLAGS
fi
if test $pkg_failed = 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=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1`
else
ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$ZSTD_PKG_ERRORS" >&5
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
else
ZSTD_CFLAGS=$pkg_cv_ZSTD_CFLAGS
ZSTD_LIBS=$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="$CFLAGS" save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror" CFLAGS="$CFLAGS -Werror"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for hidden visibility" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for hidden visibility" >&5

View file

@ -230,9 +230,10 @@ AC_CHECK_DECLS([basename, ffs, stpcpy, asprintf, vasprintf, strnlen])
BFD_BINARY_FOPEN BFD_BINARY_FOPEN
# Link in zlib if we can. This allows us to read compressed debug sections. # Link in zlib/zstd if we can. This allows us to read compressed debug sections.
# This is used only by compress.c. # This is used only by compress.c.
AM_ZLIB AM_ZLIB
AC_ZSTD
save_CFLAGS="$CFLAGS" save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror" CFLAGS="$CFLAGS -Werror"

View file

@ -1260,6 +1260,18 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
abfd, name); abfd, name);
return false; return false;
} }
#ifndef HAVE_ZSTD
if (newsect->compress_status == 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 = COMPRESS_SECTION_NONE;
return false;
}
#endif
} }
if (abfd->is_linker_input) if (abfd->is_linker_input)

View file

@ -989,7 +989,8 @@ const bfd_target TARGET_BIG_SYM =
/* object_flags: mask of all file flags */ /* object_flags: mask of all file flags */
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
| DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS | 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),
/* section_flags: mask of all section flags */ /* section_flags: mask of all section flags */
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY
@ -1093,7 +1094,8 @@ const bfd_target TARGET_LITTLE_SYM =
/* object_flags: mask of all file flags */ /* object_flags: mask of all file flags */
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
| DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS | 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),
/* section_flags: mask of all section flags */ /* section_flags: mask of all section flags */
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY

View file

@ -392,7 +392,8 @@ CODE_FRAGMENT
. unsigned int compress_status : 2; . unsigned int compress_status : 2;
.#define COMPRESS_SECTION_NONE 0 .#define COMPRESS_SECTION_NONE 0
.#define COMPRESS_SECTION_DONE 1 .#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. *} . {* The following flags are used by the ELF linker. *}
. .

View file

@ -156,7 +156,8 @@ am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \
$(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/plugins.m4 \
$(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/po.m4 \
$(top_srcdir)/../config/progtest.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)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
$(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
$(top_srcdir)/../bfd/version.m4 \ $(top_srcdir)/../bfd/version.m4 \
@ -575,6 +576,8 @@ WARN_WRITE_STRINGS = @WARN_WRITE_STRINGS@
XGETTEXT = @XGETTEXT@ XGETTEXT = @XGETTEXT@
YACC = `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir)/../bison/; else echo @YACC@; fi` YACC = `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir)/../bison/; else echo @YACC@; fi`
YFLAGS = -d YFLAGS = -d
ZSTD_CFLAGS = @ZSTD_CFLAGS@
ZSTD_LIBS = @ZSTD_LIBS@
abs_builddir = @abs_builddir@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@ abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@ abs_top_builddir = @abs_top_builddir@

View file

@ -1,5 +1,11 @@
-*- text -*- -*- text -*-
* objcopy --decompress-debug-sections now supports zstd compressed debug
sections. The new option --compress-debug-sections=zstd compresses debug
sections with zstd.
* addr2line and objdump --dwarf now support zstd compressed debug sections.
* The dlltool program now accepts --deterministic-libraries and * The dlltool program now accepts --deterministic-libraries and
--non-deterministic-libraries as command line options to control whether or --non-deterministic-libraries as command line options to control whether or
not it generates deterministic output libraries. If neither of these options not it generates deterministic output libraries. If neither of these options

1
binutils/aclocal.m4 vendored
View file

@ -1205,6 +1205,7 @@ m4_include([../config/plugins.m4])
m4_include([../config/po.m4]) m4_include([../config/po.m4])
m4_include([../config/progtest.m4]) m4_include([../config/progtest.m4])
m4_include([../config/zlib.m4]) m4_include([../config/zlib.m4])
m4_include([../config/zstd.m4])
m4_include([../libtool.m4]) m4_include([../libtool.m4])
m4_include([../ltoptions.m4]) m4_include([../ltoptions.m4])
m4_include([../ltsugar.m4]) m4_include([../ltsugar.m4])

View file

@ -157,6 +157,9 @@
/* Define to 1 if you have the <windows.h> header file. */ /* Define to 1 if you have the <windows.h> header file. */
#undef HAVE_WINDOWS_H #undef HAVE_WINDOWS_H
/* Define to 1 if zstd is enabled. */
#undef HAVE_ZSTD
/* Define as const if the declaration of iconv() needs const. */ /* Define as const if the declaration of iconv() needs const. */
#undef ICONV_CONST #undef ICONV_CONST

136
binutils/configure vendored
View file

@ -650,6 +650,8 @@ LTLIBICONV
LIBICONV LIBICONV
MSGPACK_LIBS MSGPACK_LIBS
MSGPACK_CFLAGS MSGPACK_CFLAGS
ZSTD_LIBS
ZSTD_CFLAGS
zlibinc zlibinc
zlibdir zlibdir
DEMANGLER_NAME DEMANGLER_NAME
@ -832,6 +834,7 @@ enable_build_warnings
enable_nls enable_nls
enable_maintainer_mode enable_maintainer_mode
with_system_zlib with_system_zlib
with_zstd
with_msgpack with_msgpack
enable_rpath enable_rpath
with_libiconv_prefix with_libiconv_prefix
@ -853,6 +856,8 @@ DEBUGINFOD_CFLAGS
DEBUGINFOD_LIBS DEBUGINFOD_LIBS
YACC YACC
YFLAGS YFLAGS
ZSTD_CFLAGS
ZSTD_LIBS
MSGPACK_CFLAGS MSGPACK_CFLAGS
MSGPACK_LIBS' MSGPACK_LIBS'
@ -1517,6 +1522,8 @@ Optional Packages:
--with-debuginfod Enable debuginfo lookups with debuginfod --with-debuginfod Enable debuginfo lookups with debuginfod
(auto/yes/no) (auto/yes/no)
--with-system-zlib use installed libz --with-system-zlib use installed libz
--with-zstd support zstd compressed debug sections
(default=auto)
--with-msgpack Enable msgpack support (auto/yes/no) --with-msgpack Enable msgpack support (auto/yes/no)
--with-gnu-ld assume the C compiler uses GNU ld default=no --with-gnu-ld assume the C compiler uses GNU ld default=no
--with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
@ -1547,6 +1554,8 @@ Some influential environment variables:
YFLAGS The list of arguments that will be passed by default to $YACC. YFLAGS The list of arguments that will be passed by default to $YACC.
This script will default YFLAGS to the empty string to avoid a This script will default YFLAGS to the empty string to avoid a
default value of `-d' given by some make applications. 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 MSGPACK_CFLAGS
C compiler flags for MSGPACK, overriding pkg-config C compiler flags for MSGPACK, overriding pkg-config
MSGPACK_LIBS MSGPACK_LIBS
@ -10804,7 +10813,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 10807 "configure" #line 10816 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -10910,7 +10919,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 10913 "configure" #line 10922 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -13468,7 +13477,7 @@ cat >>confdefs.h <<_ACEOF
_ACEOF _ACEOF
# 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 # sections. This is used only by readelf.c (objdump uses bfd for
# reading compressed sections). # reading compressed sections).
@ -13490,6 +13499,127 @@ fi
# Check whether --with-zstd was given.
if test "${with_zstd+set}" = set; then :
withval=$with_zstd;
else
with_zstd=auto
fi
if test "$with_zstd" != no; then :
pkg_failed=no
{ $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="$ZSTD_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$ZSTD_LIBS"; then
pkg_cv_ZSTD_LIBS="$ZSTD_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = no; then
pkg_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$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=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$pkg_save_LDFLAGS
fi
if test $pkg_failed = 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=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1`
else
ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$ZSTD_PKG_ERRORS" >&5
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
else
ZSTD_CFLAGS=$pkg_cv_ZSTD_CFLAGS
ZSTD_LIBS=$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 case "${host}" in
*-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*) *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)

View file

@ -265,10 +265,11 @@ fi
AC_CHECK_DECLS([asprintf, environ, getc_unlocked, stpcpy, strnlen]) AC_CHECK_DECLS([asprintf, environ, getc_unlocked, stpcpy, strnlen])
# 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 # sections. This is used only by readelf.c (objdump uses bfd for
# reading compressed sections). # reading compressed sections).
AM_ZLIB AM_ZLIB
AC_ZSTD
BFD_BINARY_FOPEN BFD_BINARY_FOPEN

View file

@ -2159,21 +2159,23 @@ ELF ABI. Note - if compression would actually make a section
@itemx --compress-debug-sections=zlib @itemx --compress-debug-sections=zlib
@itemx --compress-debug-sections=zlib-gnu @itemx --compress-debug-sections=zlib-gnu
@itemx --compress-debug-sections=zlib-gabi @itemx --compress-debug-sections=zlib-gabi
@itemx --compress-debug-sections=zstd
For ELF files, these options control how DWARF debug sections are For ELF files, these options control how DWARF debug sections are
compressed. @option{--compress-debug-sections=none} is equivalent compressed. @option{--compress-debug-sections=none} is equivalent
to @option{--decompress-debug-sections}. to @option{--decompress-debug-sections}.
@option{--compress-debug-sections=zlib} and @option{--compress-debug-sections=zlib} and
@option{--compress-debug-sections=zlib-gabi} are equivalent to @option{--compress-debug-sections=zlib-gabi} are equivalent to
@option{--compress-debug-sections}. @option{--compress-debug-sections}.
@option{--compress-debug-sections=zlib-gnu} compresses DWARF debug @option{--compress-debug-sections=zlib-gnu} compresses DWARF debug sections
sections using zlib. The debug sections are renamed to begin with using the obsoleted zlib-gnu format. The debug sections are renamed to begin
@samp{.zdebug} instead of @samp{.debug}. Note - if compression would with @samp{.zdebug}.
actually make a section @emph{larger}, then it is not compressed nor @option{--compress-debug-sections=zstd} compresses DWARF debug
renamed. sections using zstd. Note - if compression would actually make a section
@emph{larger}, then it is not compressed nor renamed.
@item --decompress-debug-sections @item --decompress-debug-sections
Decompress DWARF debug sections using zlib. The original section Decompress DWARF debug sections. For a @samp{.zdebug} section, the original
names of the compressed sections are restored. name is restored.
@item --elf-stt-common=yes @item --elf-stt-common=yes
@itemx --elf-stt-common=no @itemx --elf-stt-common=no

View file

@ -232,7 +232,8 @@ static enum
compress_zlib = compress | 1 << 1, compress_zlib = compress | 1 << 1,
compress_gnu_zlib = compress | 1 << 2, compress_gnu_zlib = compress | 1 << 2,
compress_gabi_zlib = compress | 1 << 3, compress_gabi_zlib = compress | 1 << 3,
decompress = 1 << 4 compress_zstd = compress | 1 << 4,
decompress = 1 << 5
} do_debug_sections = nothing; } do_debug_sections = nothing;
/* Whether to generate ELF common symbols with the STT_COMMON type. */ /* Whether to generate ELF common symbols with the STT_COMMON type. */
@ -678,8 +679,8 @@ copy_usage (FILE *stream, int exit_status)
<commit>\n\ <commit>\n\
--subsystem <name>[:<version>]\n\ --subsystem <name>[:<version>]\n\
Set PE subsystem to <name> [& <version>]\n\ Set PE subsystem to <name> [& <version>]\n\
--compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\ --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\
Compress DWARF debug sections using zlib\n\ Compress DWARF debug sections\n\
--decompress-debug-sections Decompress DWARF debug sections using zlib\n\ --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
--elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\ --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\
type\n\ type\n\
@ -2659,7 +2660,8 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
if ((do_debug_sections & compress) != 0 if ((do_debug_sections & compress) != 0
&& do_debug_sections != compress) && do_debug_sections != compress)
{ {
non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"), non_fatal (_ ("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi|"
"zstd] is unsupported on `%s'"),
bfd_get_archive_filename (ibfd)); bfd_get_archive_filename (ibfd));
return false; return false;
} }
@ -3807,6 +3809,13 @@ copy_file (const char *input_filename, const char *output_filename, int ofd,
if (do_debug_sections != compress_gnu_zlib) if (do_debug_sections != compress_gnu_zlib)
ibfd->flags |= BFD_COMPRESS_GABI; ibfd->flags |= BFD_COMPRESS_GABI;
break; break;
case compress_zstd:
ibfd->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
#ifndef HAVE_ZSTD
fatal (_ ("--compress-debug-sections=zstd: binutils is not built with "
"zstd support"));
#endif
break;
case decompress: case decompress:
ibfd->flags |= BFD_DECOMPRESS; ibfd->flags |= BFD_DECOMPRESS;
break; break;
@ -5469,6 +5478,8 @@ copy_main (int argc, char *argv[])
do_debug_sections = compress_gnu_zlib; do_debug_sections = compress_gnu_zlib;
else if (strcasecmp (optarg, "zlib-gabi") == 0) else if (strcasecmp (optarg, "zlib-gabi") == 0)
do_debug_sections = compress_gabi_zlib; do_debug_sections = compress_gabi_zlib;
else if (strcasecmp (optarg, "zstd") == 0)
do_debug_sections = compress_zstd;
else else
fatal (_("unrecognized --compress-debug-sections type `%s'"), fatal (_("unrecognized --compress-debug-sections type `%s'"),
optarg); optarg);

View file

@ -576,6 +576,50 @@ if { [regexp_diff objdump.out $srcdir/$subdir/dw2-3gabi.W] } then {
pass "$testname" pass "$testname"
} }
if { [binutils_assemble_flags $srcdir/$subdir/dw2-1.S ${compressedfile}zstd.o --compress-debug-sections=zstd] } then {
set testname "objcopy compress debug sections with zstd"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zstd ${testfile}.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 ${compressedfile}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 } { proc convert_test { testname as_flags objcop_flags } {
global srcdir global srcdir
global subdir global subdir

23
config/zstd.m4 Normal file
View file

@ -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=auto)])],
[], [with_zstd=auto])
AS_IF([test "$with_zstd" != no],
[PKG_CHECK_MODULES(ZSTD, [libzstd], [
AC_DEFINE(HAVE_ZSTD, 1, [Define to 1 if zstd is enabled.])
], [
if test "$with_zstd" = yes; then
AC_MSG_ERROR([--with-zstd was given, but pkgconfig/libzstd.pc is not found])
fi
])
])
])

10
configure vendored
View file

@ -785,6 +785,7 @@ ac_user_opts='
enable_option_checking enable_option_checking
with_build_libsubdir with_build_libsubdir
with_system_zlib with_system_zlib
with_zstd
enable_as_accelerator_for enable_as_accelerator_for
enable_offload_targets enable_offload_targets
enable_gold enable_gold
@ -1567,6 +1568,8 @@ Optional Packages:
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-build-libsubdir=DIR Directory where to find libraries for build system --with-build-libsubdir=DIR Directory where to find libraries for build system
--with-system-zlib use installed libz --with-system-zlib use installed libz
--with-zstd Support zstd compressed debug sections
(default=auto)
--with-mpc=PATH specify prefix directory for installed MPC package. --with-mpc=PATH specify prefix directory for installed MPC package.
Equivalent to --with-mpc-include=PATH/include plus Equivalent to --with-mpc-include=PATH/include plus
--with-mpc-lib=PATH/lib --with-mpc-lib=PATH/lib
@ -2925,6 +2928,13 @@ if test x$with_system_zlib = xyes ; then
noconfigdirs="$noconfigdirs zlib" noconfigdirs="$noconfigdirs zlib"
fi fi
# Check whether --with-zstd was given.
if test "${with_zstd+set}" = set; then :
withval=$with_zstd;
fi
# Don't compile the bundled readline/libreadline.a if --with-system-readline # Don't compile the bundled readline/libreadline.a if --with-system-readline
# is provided. # is provided.
if test x$with_system_readline = xyes ; then if test x$with_system_readline = xyes ; then

View file

@ -246,6 +246,9 @@ if test x$with_system_zlib = xyes ; then
noconfigdirs="$noconfigdirs zlib" noconfigdirs="$noconfigdirs zlib"
fi fi
AC_ARG_WITH(zstd,
[AS_HELP_STRING([--with-zstd], [Support zstd compressed debug sections (default=auto)])])
# Don't compile the bundled readline/libreadline.a if --with-system-readline # Don't compile the bundled readline/libreadline.a if --with-system-readline
# is provided. # is provided.
if test x$with_system_readline = xyes ; then if test x$with_system_readline = xyes ; then

View file

@ -42,7 +42,7 @@ am__skipyacc =
WARN_CFLAGS = @WARN_CFLAGS@ @WARN_WRITE_STRINGS@ WARN_CFLAGS = @WARN_CFLAGS@ @WARN_WRITE_STRINGS@
NO_WERROR = @NO_WERROR@ NO_WERROR = @NO_WERROR@
AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS)
TARG_CPU = @target_cpu_type@ TARG_CPU = @target_cpu_type@
TARG_CPU_C = $(srcdir)/config/tc-@target_cpu_type@.c TARG_CPU_C = $(srcdir)/config/tc-@target_cpu_type@.c
@ -407,7 +407,7 @@ STAGESTUFF = *.@OBJEXT@ $(noinst_PROGRAMS)
as_new_SOURCES = $(GAS_CFILES) as_new_SOURCES = $(GAS_CFILES)
as_new_LDADD = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ as_new_LDADD = $(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 = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ as_new_DEPENDENCIES = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \
$(extra_objects) $(GASLIBS) $(LIBINTL_DEP) $(extra_objects) $(GASLIBS) $(LIBINTL_DEP)
EXTRA_as_new_SOURCES = $(CFILES) $(HFILES) $(TARGET_CPU_CFILES) \ EXTRA_as_new_SOURCES = $(CFILES) $(HFILES) $(TARGET_CPU_CFILES) \

View file

@ -140,10 +140,12 @@ am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \
$(top_srcdir)/../config/lead-dot.m4 \ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/nls.m4 \ $(top_srcdir)/../config/nls.m4 \
$(top_srcdir)/../config/override.m4 \ $(top_srcdir)/../config/override.m4 \
$(top_srcdir)/../config/pkg.m4 \
$(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/plugins.m4 \
$(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/po.m4 \
$(top_srcdir)/../config/progtest.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)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
$(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
$(top_srcdir)/acinclude.m4 $(top_srcdir)/../bfd/version.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/../bfd/version.m4 \
@ -429,6 +431,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
POSUB = @POSUB@ POSUB = @POSUB@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
SED = @SED@ SED = @SED@
@ -443,6 +448,8 @@ WARN_WRITE_STRINGS = @WARN_WRITE_STRINGS@
XGETTEXT = @XGETTEXT@ XGETTEXT = @XGETTEXT@
YACC = `if [ -f ../bison/bison ] ; then echo ../bison/bison -y -L../bison/bison ; else echo @YACC@ ; fi` YACC = `if [ -f ../bison/bison ] ; then echo ../bison/bison -y -L../bison/bison ; else echo @YACC@ ; fi`
YFLAGS = @YFLAGS@ YFLAGS = @YFLAGS@
ZSTD_CFLAGS = @ZSTD_CFLAGS@
ZSTD_LIBS = @ZSTD_LIBS@
abs_builddir = @abs_builddir@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@ abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@ abs_top_builddir = @abs_top_builddir@
@ -524,7 +531,7 @@ ZLIBINC = @zlibinc@
# maintainer mode is disabled. Avoid this. # maintainer mode is disabled. Avoid this.
am__skiplex = am__skiplex =
am__skipyacc = am__skipyacc =
AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS)
TARG_CPU = @target_cpu_type@ TARG_CPU = @target_cpu_type@
TARG_CPU_C = $(srcdir)/config/tc-@target_cpu_type@.c TARG_CPU_C = $(srcdir)/config/tc-@target_cpu_type@.c
TARG_CPU_O = config/tc-@target_cpu_type@.@OBJEXT@ TARG_CPU_O = config/tc-@target_cpu_type@.@OBJEXT@
@ -874,7 +881,7 @@ GASLIBS = @OPCODES_LIB@ ../bfd/libbfd.la ../libiberty/libiberty.a
STAGESTUFF = *.@OBJEXT@ $(noinst_PROGRAMS) STAGESTUFF = *.@OBJEXT@ $(noinst_PROGRAMS)
as_new_SOURCES = $(GAS_CFILES) as_new_SOURCES = $(GAS_CFILES)
as_new_LDADD = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ as_new_LDADD = $(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 = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ as_new_DEPENDENCIES = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \
$(extra_objects) $(GASLIBS) $(LIBINTL_DEP) $(extra_objects) $(GASLIBS) $(LIBINTL_DEP)

View file

@ -1,5 +1,8 @@
-*- text -*- -*- text -*-
* gas now supports --compress-debug-sections=zstd to compress
debug sections with zstd.
Changes in 2.39: Changes in 2.39:
* Remove (rudimentary) support for the x86-64 sub-architectures Intel L1OM and * Remove (rudimentary) support for the x86-64 sub-architectures Intel L1OM and

2
gas/aclocal.m4 vendored
View file

@ -1196,10 +1196,12 @@ m4_include([../config/lcmessage.m4])
m4_include([../config/lead-dot.m4]) m4_include([../config/lead-dot.m4])
m4_include([../config/nls.m4]) m4_include([../config/nls.m4])
m4_include([../config/override.m4]) m4_include([../config/override.m4])
m4_include([../config/pkg.m4])
m4_include([../config/plugins.m4]) m4_include([../config/plugins.m4])
m4_include([../config/po.m4]) m4_include([../config/po.m4])
m4_include([../config/progtest.m4]) m4_include([../config/progtest.m4])
m4_include([../config/zlib.m4]) m4_include([../config/zlib.m4])
m4_include([../config/zstd.m4])
m4_include([../libtool.m4]) m4_include([../libtool.m4])
m4_include([../ltoptions.m4]) m4_include([../ltoptions.m4])
m4_include([../ltsugar.m4]) m4_include([../ltsugar.m4])

View file

@ -252,14 +252,14 @@ Options:\n\
--alternate initially turn on alternate macro syntax\n")); --alternate initially turn on alternate macro syntax\n"));
#ifdef DEFAULT_FLAG_COMPRESS_DEBUG #ifdef DEFAULT_FLAG_COMPRESS_DEBUG
fprintf (stream, _("\ fprintf (stream, _("\
--compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\ --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\
compress DWARF debug sections using zlib [default]\n")); compress DWARF debug sections using zlib [default]\n"));
fprintf (stream, _("\ fprintf (stream, _("\
--nocompress-debug-sections\n\ --nocompress-debug-sections\n\
don't compress DWARF debug sections\n")); don't compress DWARF debug sections\n"));
#else #else
fprintf (stream, _("\ fprintf (stream, _("\
--compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\ --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\
compress DWARF debug sections using zlib\n")); compress DWARF debug sections using zlib\n"));
fprintf (stream, _("\ fprintf (stream, _("\
--nocompress-debug-sections\n\ --nocompress-debug-sections\n\
@ -736,6 +736,15 @@ This program has absolutely no warranty.\n"));
flag_compress_debug = COMPRESS_DEBUG_GNU_ZLIB; flag_compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
else if (strcasecmp (optarg, "zlib-gabi") == 0) else if (strcasecmp (optarg, "zlib-gabi") == 0)
flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB; flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
else if (strcasecmp (optarg, "zstd") == 0)
{
#ifdef HAVE_ZSTD
flag_compress_debug = COMPRESS_DEBUG_ZSTD;
#else
as_fatal (_ ("--compress-debug-sections=zstd: gas is not "
"built with zstd support"));
#endif
}
else else
as_fatal (_("Invalid --compress-debug-sections option: `%s'"), as_fatal (_("Invalid --compress-debug-sections option: `%s'"),
optarg); optarg);

View file

@ -21,14 +21,23 @@
#include "config.h" #include "config.h"
#include <stdio.h> #include <stdio.h>
#include <zlib.h> #include <zlib.h>
#if HAVE_ZSTD
#include <zstd.h>
#endif
#include "ansidecl.h" #include "ansidecl.h"
#include "compress-debug.h" #include "compress-debug.h"
/* Initialize the compression engine. */ /* Initialize the compression engine. */
struct z_stream_s * void *
compress_init (void) compress_init (bool use_zstd)
{ {
if (use_zstd) {
#if HAVE_ZSTD
return ZSTD_createCCtx ();
#endif
}
static struct z_stream_s strm; static struct z_stream_s strm;
strm.zalloc = NULL; strm.zalloc = NULL;
@ -42,22 +51,37 @@ compress_init (void)
from the engine goes into the current frag on the obstack. */ from the engine goes into the current frag on the obstack. */
int int
compress_data (struct z_stream_s *strm, const char **next_in, compress_data (bool use_zstd, void *ctx, const char **next_in, int *avail_in,
int *avail_in, char **next_out, int *avail_out) char **next_out, int *avail_out)
{ {
int out_size = 0; if (use_zstd)
int x; {
#if HAVE_ZSTD
ZSTD_outBuffer ob = { *next_out, *avail_out, 0 };
ZSTD_inBuffer ib = { *next_in, *avail_in, 0 };
size_t ret = ZSTD_compressStream2 (ctx, &ob, &ib, ZSTD_e_continue);
*next_in += ib.pos;
*avail_in -= ib.pos;
*next_out += ob.pos;
*avail_out -= ob.pos;
if (ZSTD_isError (ret))
return -1;
return (int)ob.pos;
#endif
}
struct z_stream_s *strm = ctx;
strm->next_in = (Bytef *) (*next_in); strm->next_in = (Bytef *) (*next_in);
strm->avail_in = *avail_in; strm->avail_in = *avail_in;
strm->next_out = (Bytef *) (*next_out); strm->next_out = (Bytef *) (*next_out);
strm->avail_out = *avail_out; strm->avail_out = *avail_out;
x = deflate (strm, Z_NO_FLUSH); int x = deflate (strm, Z_NO_FLUSH);
if (x != Z_OK) if (x != Z_OK)
return -1; return -1;
out_size = *avail_out - strm->avail_out; int out_size = *avail_out - strm->avail_out;
*next_in = (char *) (strm->next_in); *next_in = (char *) (strm->next_in);
*avail_in = strm->avail_in; *avail_in = strm->avail_in;
*next_out = (char *) (strm->next_out); *next_out = (char *) (strm->next_out);
@ -71,10 +95,28 @@ compress_data (struct z_stream_s *strm, const char **next_in,
needed. */ needed. */
int 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) int *avail_out, int *out_size)
{ {
if (use_zstd)
{
#if HAVE_ZSTD
ZSTD_outBuffer ob = { *next_out, *avail_out, 0 };
ZSTD_inBuffer ib = { 0 };
size_t ret = ZSTD_compressStream2 (ctx, &ob, &ib, ZSTD_e_end);
*out_size = ob.pos;
*next_out += ob.pos;
*avail_out -= ob.pos;
if (ZSTD_isError (ret))
return -1;
if (ret == 0)
ZSTD_freeCCtx (ctx);
return ret ? 1 : 0;
#endif
}
int x; int x;
struct z_stream_s *strm = ctx;
strm->avail_in = 0; strm->avail_in = 0;
strm->next_out = (Bytef *) (*next_out); strm->next_out = (Bytef *) (*next_out);

View file

@ -21,19 +21,19 @@
#ifndef COMPRESS_DEBUG_H #ifndef COMPRESS_DEBUG_H
#define COMPRESS_DEBUG_H #define COMPRESS_DEBUG_H
#include <stdbool.h>
struct z_stream_s; struct z_stream_s;
/* Initialize the compression engine. */ /* Initialize the compression engine. */
extern struct z_stream_s * extern void *compress_init (bool);
compress_init (void);
/* Stream the contents of a frag to the compression engine. Output /* Stream the contents of a frag to the compression engine. Output
from the engine goes into the current frag on the obstack. */ from the engine goes into the current frag on the obstack. */
extern int extern int compress_data (bool, void *, const char **, int *, char **, int *);
compress_data (struct z_stream_s *, const char **, int *, char **, int *);
/* Finish the compression and consume the remaining compressed output. */ /* Finish the compression and consume the remaining compressed output. */
extern int extern int
compress_finish (struct z_stream_s *, char **, int *, int *); compress_finish (bool, void *, char **, int *, int *);
#endif /* COMPRESS_DEBUG_H */ #endif /* COMPRESS_DEBUG_H */

View file

@ -134,6 +134,9 @@
/* Define to 1 if you have the <windows.h> header file. */ /* Define to 1 if you have the <windows.h> header file. */
#undef HAVE_WINDOWS_H #undef HAVE_WINDOWS_H
/* Define to 1 if zstd is enabled. */
#undef HAVE_ZSTD
/* Using i386 COFF? */ /* Using i386 COFF? */
#undef I386COFF #undef I386COFF

269
gas/configure vendored
View file

@ -633,6 +633,11 @@ ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE am__EXEEXT_TRUE
LTLIBOBJS LTLIBOBJS
LIBOBJS LIBOBJS
ZSTD_LIBS
ZSTD_CFLAGS
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
zlibinc zlibinc
zlibdir zlibdir
LIBM LIBM
@ -817,6 +822,7 @@ with_cpu
enable_nls enable_nls
enable_maintainer_mode enable_maintainer_mode
with_system_zlib with_system_zlib
with_zstd
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
host_alias host_alias
@ -828,7 +834,12 @@ LIBS
CPPFLAGS CPPFLAGS
CPP CPP
YACC YACC
YFLAGS' YFLAGS
PKG_CONFIG
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
ZSTD_CFLAGS
ZSTD_LIBS'
# Initialize some variables set by options. # Initialize some variables set by options.
@ -1493,6 +1504,8 @@ Optional Packages:
--with-cpu=CPU default cpu variant is CPU (currently only supported --with-cpu=CPU default cpu variant is CPU (currently only supported
on ARC) on ARC)
--with-system-zlib use installed libz --with-system-zlib use installed libz
--with-zstd support zstd compressed debug sections
(default=auto)
Some influential environment variables: Some influential environment variables:
CC C compiler command CC C compiler command
@ -1509,6 +1522,13 @@ Some influential environment variables:
YFLAGS The list of arguments that will be passed by default to $YACC. YFLAGS The list of arguments that will be passed by default to $YACC.
This script will default YFLAGS to the empty string to avoid a This script will default YFLAGS to the empty string to avoid a
default value of `-d' given by some make applications. 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
Use these variables to override the choices made by `configure' or to help Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations. it to find libraries and programs with nonstandard names/locations.
@ -10702,7 +10722,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 10705 "configure" #line 10725 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -10808,7 +10828,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 10811 "configure" #line 10831 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -13945,7 +13965,7 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h
;; ;;
esac esac
# Link in zlib if we can. This allows us to write compressed debug sections. # Link in zlib/zstd if we can. This allows us to write compressed debug sections.
# Use the system's zlib library. # Use the system's zlib library.
zlibdir="-L\$(top_builddir)/../zlib" zlibdir="-L\$(top_builddir)/../zlib"
@ -13964,6 +13984,247 @@ fi
if test "x$ac_cv_env_PKG_CONFIG_set" != "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=$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="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$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=$PKG_CONFIG
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$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="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
ac_pt_PKG_CONFIG=$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" = x; then
PKG_CONFIG=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
PKG_CONFIG=$ac_pt_PKG_CONFIG
fi
else
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=0.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=""
fi
fi
# Check whether --with-zstd was given.
if test "${with_zstd+set}" = set; then :
withval=$with_zstd;
else
with_zstd=auto
fi
if test "$with_zstd" != no; then :
pkg_failed=no
{ $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="$ZSTD_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$ZSTD_LIBS"; then
pkg_cv_ZSTD_LIBS="$ZSTD_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = no; then
pkg_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$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=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$pkg_save_LDFLAGS
fi
if test $pkg_failed = 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=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1`
else
ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$ZSTD_PKG_ERRORS" >&5
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
else
ZSTD_CFLAGS=$pkg_cv_ZSTD_CFLAGS
ZSTD_LIBS=$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 # Support for VMS timestamps via cross compile
if test "$ac_cv_header_time_h" = yes; then if test "$ac_cv_header_time_h" = yes; then

View file

@ -1004,8 +1004,9 @@ AC_CHECK_DECLS([asprintf, mempcpy, stpcpy])
BFD_BINARY_FOPEN BFD_BINARY_FOPEN
# Link in zlib if we can. This allows us to write compressed debug sections. # Link in zlib/zstd if we can. This allows us to write compressed debug sections.
AM_ZLIB AM_ZLIB
AC_ZSTD
# Support for VMS timestamps via cross compile # Support for VMS timestamps via cross compile

View file

@ -711,16 +711,19 @@ given section @emph{larger} then it is not compressed.
@itemx --compress-debug-sections=zlib @itemx --compress-debug-sections=zlib
@itemx --compress-debug-sections=zlib-gnu @itemx --compress-debug-sections=zlib-gnu
@itemx --compress-debug-sections=zlib-gabi @itemx --compress-debug-sections=zlib-gabi
@itemx --compress-debug-sections=zstd
These options control how DWARF debug sections are compressed. These options control how DWARF debug sections are compressed.
@option{--compress-debug-sections=none} is equivalent to @option{--compress-debug-sections=none} is equivalent to
@option{--nocompress-debug-sections}. @option{--nocompress-debug-sections}.
@option{--compress-debug-sections=zlib} and @option{--compress-debug-sections=zlib} and
@option{--compress-debug-sections=zlib-gabi} are equivalent to @option{--compress-debug-sections=zlib-gabi} are equivalent to
@option{--compress-debug-sections}. @option{--compress-debug-sections}.
@option{--compress-debug-sections=zlib-gnu} compresses DWARF debug @option{--compress-debug-sections=zlib-gnu} compresses DWARF debug sections
sections using zlib. The debug sections are renamed to begin with using the obsoleted zlib-gnu format. The debug sections are renamed to begin
@samp{.zdebug}. Note if compression would make a given section with @samp{.zdebug}.
@emph{larger} then it is not compressed nor renamed. @option{--compress-debug-sections=zstd} compresses DWARF debug
sections using zstd. Note - if compression would actually make a section
@emph{larger}, then it is not compressed nor renamed.
@end ifset @end ifset

View file

@ -1413,7 +1413,7 @@ write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
} }
static int 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) fragS **last_newf, struct obstack *ob)
{ {
int out_size; int out_size;
@ -1442,8 +1442,8 @@ compress_frag (struct z_stream_s *strm, const char *contents, int in_size,
as_fatal (_("can't extend frag")); as_fatal (_("can't extend frag"));
next_out = obstack_next_free (ob); next_out = obstack_next_free (ob);
obstack_blank_fast (ob, avail_out); obstack_blank_fast (ob, avail_out);
out_size = compress_data (strm, &contents, &in_size, out_size = compress_data (use_zstd, ctx, &contents, &in_size, &next_out,
&next_out, &avail_out); &avail_out);
if (out_size < 0) if (out_size < 0)
return -1; return -1;
@ -1471,7 +1471,6 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
const char *section_name; const char *section_name;
char *compressed_name; char *compressed_name;
char *header; char *header;
struct z_stream_s *strm;
int x; int x;
flagword flags = bfd_section_flags (sec); flagword flags = bfd_section_flags (sec);
unsigned int header_size, compression_header_size; unsigned int header_size, compression_header_size;
@ -1485,21 +1484,22 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
if (!startswith (section_name, ".debug_")) if (!startswith (section_name, ".debug_"))
return; return;
strm = compress_init (); bool use_zstd = abfd->flags & BFD_COMPRESS_ZSTD;
if (strm == NULL) void *ctx = compress_init (use_zstd);
if (ctx == NULL)
return; return;
if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB) if (flag_compress_debug == COMPRESS_DEBUG_GNU_ZLIB)
{
compression_header_size = 0;
header_size = 12;
}
else
{ {
compression_header_size compression_header_size
= bfd_get_compression_header_size (stdoutput, NULL); = bfd_get_compression_header_size (stdoutput, NULL);
header_size = compression_header_size; header_size = compression_header_size;
} }
else
{
compression_header_size = 0;
header_size = 12;
}
/* Create a new frag to contain the compression header. */ /* Create a new frag to contain the compression header. */
first_newf = frag_alloc (ob); first_newf = frag_alloc (ob);
@ -1531,7 +1531,7 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
gas_assert (f->fr_type == rs_fill); gas_assert (f->fr_type == rs_fill);
if (f->fr_fix) if (f->fr_fix)
{ {
out_size = compress_frag (strm, f->fr_literal, f->fr_fix, out_size = compress_frag (use_zstd, ctx, f->fr_literal, f->fr_fix,
&last_newf, ob); &last_newf, ob);
if (out_size < 0) if (out_size < 0)
return; return;
@ -1545,8 +1545,8 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
{ {
while (count--) while (count--)
{ {
out_size = compress_frag (strm, fill_literal, (int) fill_size, out_size = compress_frag (use_zstd, ctx, fill_literal,
&last_newf, ob); (int)fill_size, &last_newf, ob);
if (out_size < 0) if (out_size < 0)
return; return;
compressed_size += out_size; compressed_size += out_size;
@ -1579,7 +1579,7 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
as_fatal (_("can't extend frag")); as_fatal (_("can't extend frag"));
next_out = obstack_next_free (ob); next_out = obstack_next_free (ob);
obstack_blank_fast (ob, avail_out); obstack_blank_fast (ob, avail_out);
x = compress_finish (strm, &next_out, &avail_out, &out_size); x = compress_finish (use_zstd, ctx, &next_out, &avail_out, &out_size);
if (x < 0) if (x < 0)
return; return;
@ -2540,6 +2540,8 @@ write_object_file (void)
{ {
if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB) if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI; stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI;
else if (flag_compress_debug == COMPRESS_DEBUG_ZSTD)
stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
else else
stdoutput->flags |= BFD_COMPRESS; stdoutput->flags |= BFD_COMPRESS;
bfd_map_over_sections (stdoutput, compress_debug, (char *) 0); bfd_map_over_sections (stdoutput, compress_debug, (char *) 0);

View file

@ -173,6 +173,9 @@ BFD_CFLAGS = -I$(BFD_DIR) -I$(BFD_SRC)
ZLIB = @zlibdir@ -lz ZLIB = @zlibdir@ -lz
ZLIBINC = @zlibinc@ ZLIBINC = @zlibinc@
ZSTD_CFLAGS = @ZSTD_CFLAGS@
ZSTD_LIBS = @ZSTD_LIBS@
# Where is the decnumber library? Typically in ../libdecnumber. # Where is the decnumber library? Typically in ../libdecnumber.
LIBDECNUMBER_DIR = ../libdecnumber LIBDECNUMBER_DIR = ../libdecnumber
LIBDECNUMBER = $(LIBDECNUMBER_DIR)/libdecnumber.a LIBDECNUMBER = $(LIBDECNUMBER_DIR)/libdecnumber.a
@ -625,7 +628,7 @@ INTERNAL_CPPFLAGS = $(CPPFLAGS) @GUILE_CPPFLAGS@ @PYTHON_CPPFLAGS@ \
INTERNAL_CFLAGS_BASE = \ INTERNAL_CFLAGS_BASE = \
$(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \ $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \
$(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) $(ZLIBINC) \ $(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) \ $(INTL_CFLAGS) $(INCGNU) $(INCSUPPORT) $(LIBBACKTRACE_INC) \
$(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) $(SRCHIGH_CFLAGS) \ $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) $(SRCHIGH_CFLAGS) \
$(TOP_CFLAGS) $(PTHREAD_CFLAGS) $(DEBUGINFOD_CFLAGS) $(TOP_CFLAGS) $(PTHREAD_CFLAGS) $(DEBUGINFOD_CFLAGS)
@ -647,7 +650,7 @@ INTERNAL_LDFLAGS = \
# Libraries and corresponding dependencies for compiling gdb. # Libraries and corresponding dependencies for compiling gdb.
# XM_CLIBS, defined in *config files, have host-dependent libs. # XM_CLIBS, defined in *config files, have host-dependent libs.
# LIBIBERTY appears twice on purpose. # LIBIBERTY appears twice on purpose.
CLIBS = $(SIM) $(READLINE) $(OPCODES) $(LIBCTF) $(BFD) $(ZLIB) \ CLIBS = $(SIM) $(READLINE) $(OPCODES) $(LIBCTF) $(BFD) $(ZLIB) $(ZSTD_LIBS) \
$(LIBSUPPORT) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \ $(LIBSUPPORT) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \
$(XM_CLIBS) $(GDBTKLIBS) $(LIBBACKTRACE_LIB) \ $(XM_CLIBS) $(GDBTKLIBS) $(LIBBACKTRACE_LIB) \
@LIBS@ @GUILE_LIBS@ @PYTHON_LIBS@ \ @LIBS@ @GUILE_LIBS@ @PYTHON_LIBS@ \
@ -2298,6 +2301,7 @@ aclocal_m4_deps = \
../config/lcmessage.m4 \ ../config/lcmessage.m4 \
../config/codeset.m4 \ ../config/codeset.m4 \
../config/zlib.m4 \ ../config/zlib.m4 \
../config/zstd.m4 \
../config/ax_pthread.m4 ../config/ax_pthread.m4
$(srcdir)/aclocal.m4: @MAINTAINER_MODE_TRUE@ $(aclocal_m4_deps) $(srcdir)/aclocal.m4: @MAINTAINER_MODE_TRUE@ $(aclocal_m4_deps)

View file

@ -57,6 +57,8 @@
* The Windows native target now supports target async. * The Windows native target now supports target async.
* gdb now supports zstd compressed debug sections (ELFCOMPRESS_ZSTD) for ELF.
* New commands * New commands
maintenance set ignore-prologue-end-flag on|off maintenance set ignore-prologue-end-flag on|off

View file

@ -43,6 +43,7 @@ m4_include([../config/lib-link.m4])
m4_include([../config/iconv.m4]) m4_include([../config/iconv.m4])
m4_include([../config/zlib.m4]) m4_include([../config/zlib.m4])
m4_include([../config/zstd.m4])
m4_include([../gdbsupport/common.m4]) m4_include([../gdbsupport/common.m4])
@ -233,7 +234,7 @@ AC_DEFUN([GDB_AC_CHECK_BFD], [
# always want our bfd. # always want our bfd.
CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS"
ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'` ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'`
LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS" LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $ZSTD_LIBS $LDFLAGS"
intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'` intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
LIBS="-lbfd -liberty -lz $intl $LIBS" LIBS="-lbfd -liberty -lz $intl $LIBS"
AC_CACHE_CHECK( AC_CACHE_CHECK(

View file

@ -589,6 +589,9 @@
/* Define to 1 if you have the `XML_StopParser' function. */ /* Define to 1 if you have the `XML_StopParser' function. */
#undef HAVE_XML_STOPPARSER #undef HAVE_XML_STOPPARSER
/* Define to 1 if zstd is enabled. */
#undef HAVE_ZSTD
/* Define to 1 if your system has the _etext variable. */ /* Define to 1 if your system has the _etext variable. */
#undef HAVE__ETEXT #undef HAVE__ETEXT

137
gdb/configure vendored
View file

@ -747,6 +747,8 @@ READLINE_DEPS
READLINE READLINE
LTLIBICONV LTLIBICONV
LIBICONV LIBICONV
ZSTD_LIBS
ZSTD_CFLAGS
zlibinc zlibinc
zlibdir zlibdir
MIG MIG
@ -893,6 +895,7 @@ enable_codesign
with_pkgversion with_pkgversion
with_bugurl with_bugurl
with_system_zlib with_system_zlib
with_zstd
with_gnu_ld with_gnu_ld
enable_rpath enable_rpath
with_libiconv_prefix with_libiconv_prefix
@ -961,6 +964,8 @@ DEBUGINFOD_CFLAGS
DEBUGINFOD_LIBS DEBUGINFOD_LIBS
YACC YACC
YFLAGS YFLAGS
ZSTD_CFLAGS
ZSTD_LIBS
XMKMF' XMKMF'
ac_subdirs_all='testsuite ac_subdirs_all='testsuite
gdbtk' gdbtk'
@ -1641,6 +1646,8 @@ Optional Packages:
--with-pkgversion=PKG Use PKG in the version string in place of "GDB" --with-pkgversion=PKG Use PKG in the version string in place of "GDB"
--with-bugurl=URL Direct users to URL to report a bug --with-bugurl=URL Direct users to URL to report a bug
--with-system-zlib use installed libz --with-system-zlib use installed libz
--with-zstd support zstd compressed debug sections
(default=auto)
--with-gnu-ld assume the C compiler uses GNU ld default=no --with-gnu-ld assume the C compiler uses GNU ld default=no
--with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
--without-libiconv-prefix don't search for libiconv in includedir and libdir --without-libiconv-prefix don't search for libiconv in includedir and libdir
@ -1721,6 +1728,8 @@ Some influential environment variables:
YFLAGS The list of arguments that will be passed by default to $YACC. YFLAGS The list of arguments that will be passed by default to $YACC.
This script will default YFLAGS to the empty string to avoid a This script will default YFLAGS to the empty string to avoid a
default value of `-d' given by some make applications. 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 XMKMF Path to xmkmf, Makefile generator for X Window System
Use these variables to override the choices made by `configure' or to help Use these variables to override the choices made by `configure' or to help
@ -8242,7 +8251,8 @@ if test "$ac_res" != no; then :
fi fi
# Link in zlib if we can. This allows us to read compressed debug sections. # Link in zlib/zstd if we can. This allows us to read compressed debug
# sections.
# Use the system's zlib library. # Use the system's zlib library.
zlibdir="-L\$(top_builddir)/../zlib" zlibdir="-L\$(top_builddir)/../zlib"
@ -8262,6 +8272,127 @@ fi
# Check whether --with-zstd was given.
if test "${with_zstd+set}" = set; then :
withval=$with_zstd;
else
with_zstd=auto
fi
if test "$with_zstd" != no; then :
pkg_failed=no
{ $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="$ZSTD_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$ZSTD_LIBS"; then
pkg_cv_ZSTD_LIBS="$ZSTD_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = no; then
pkg_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$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=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$pkg_save_LDFLAGS
fi
if test $pkg_failed = 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=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1`
else
ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$ZSTD_PKG_ERRORS" >&5
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
else
ZSTD_CFLAGS=$pkg_cv_ZSTD_CFLAGS
ZSTD_LIBS=$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" = "XNONE"; then if test "X$prefix" = "XNONE"; then
acl_final_prefix="$ac_default_prefix" acl_final_prefix="$ac_default_prefix"
else else
@ -17281,7 +17412,7 @@ WIN32LIBS="$WIN32LIBS $WIN32APILIBS"
# always want our bfd. # always want our bfd.
CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS"
ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'` ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'`
LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS" LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $ZSTD_LIBS $LDFLAGS"
intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'` intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
LIBS="-lbfd -liberty -lz $intl $LIBS" LIBS="-lbfd -liberty -lz $intl $LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF support in BFD" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF support in BFD" >&5
@ -17396,7 +17527,7 @@ fi
# always want our bfd. # always want our bfd.
CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS"
ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'` ZLIBDIR=`echo $zlibdir | sed 's,\$(top_builddir)/,,g'`
LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $LDFLAGS" LDFLAGS="-L../bfd -L../libiberty $ZLIBDIR $ZSTD_LIBS $LDFLAGS"
intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'` intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
LIBS="-lbfd -liberty -lz $intl $LIBS" LIBS="-lbfd -liberty -lz $intl $LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O support in BFD" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O support in BFD" >&5

View file

@ -460,8 +460,10 @@ AC_SEARCH_LIBS(gethostbyname, nsl)
# Some systems (e.g. Solaris) have `socketpair' in libsocket. # Some systems (e.g. Solaris) have `socketpair' in libsocket.
AC_SEARCH_LIBS(socketpair, socket) AC_SEARCH_LIBS(socketpair, socket)
# Link in zlib if we can. This allows us to read compressed debug sections. # Link in zlib/zstd if we can. This allows us to read compressed debug
# sections.
AM_ZLIB AM_ZLIB
AC_ZSTD
AM_ICONV AM_ICONV

View file

@ -45,7 +45,7 @@ ELF_CLFAGS=-DELF_LIST_OPTIONS=@elf_list_options@ \
-DELF_PLT_UNWIND_LIST_OPTIONS=@elf_plt_unwind_list_options@ -DELF_PLT_UNWIND_LIST_OPTIONS=@elf_plt_unwind_list_options@
WARN_CFLAGS = @WARN_CFLAGS@ WARN_CFLAGS = @WARN_CFLAGS@
NO_WERROR = @NO_WERROR@ NO_WERROR = @NO_WERROR@
AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) $(ZSTD_CFLAGS)
# We put the scripts in the directory $(scriptdir)/ldscripts. # We put the scripts in the directory $(scriptdir)/ldscripts.
# We can't put the scripts in $(datadir) because the SEARCH_DIR # We can't put the scripts in $(datadir) because the SEARCH_DIR
@ -959,7 +959,8 @@ ld_new_SOURCES = ldgram.y ldlex-wrapper.c lexsup.c ldlang.c mri.c ldctor.c ldmai
ldbuildid.c ldbuildid.c
ld_new_DEPENDENCIES = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) \ ld_new_DEPENDENCIES = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) \
$(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL_DEP) $(JANSSON_LIBS) $(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL_DEP) $(JANSSON_LIBS)
ld_new_LDADD = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL) $(ZLIB) $(JANSSON_LIBS) ld_new_LDADD = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBCTF) \
$(LIBIBERTY) $(LIBINTL) $(ZLIB) $(ZSTD_LIBS) $(JANSSON_LIBS)
# Dependency tracking for the generated emulation files. # Dependency tracking for the generated emulation files.
EXTRA_ld_new_SOURCES += $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES) EXTRA_ld_new_SOURCES += $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES)

View file

@ -126,7 +126,8 @@ am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \
$(top_srcdir)/../config/plugins.m4 \ $(top_srcdir)/../config/plugins.m4 \
$(top_srcdir)/../config/po.m4 \ $(top_srcdir)/../config/po.m4 \
$(top_srcdir)/../config/progtest.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)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
$(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
$(top_srcdir)/../bfd/version.m4 $(top_srcdir)/configure.ac $(top_srcdir)/../bfd/version.m4 $(top_srcdir)/configure.ac
@ -477,6 +478,8 @@ WARN_WRITE_STRINGS = @WARN_WRITE_STRINGS@
XGETTEXT = @XGETTEXT@ XGETTEXT = @XGETTEXT@
YACC = `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir)/../bison/; else echo @YACC@; fi` YACC = `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir)/../bison/; else echo @YACC@; fi`
YFLAGS = -d YFLAGS = -d
ZSTD_CFLAGS = @ZSTD_CFLAGS@
ZSTD_LIBS = @ZSTD_LIBS@
abs_builddir = @abs_builddir@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@ abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@ abs_top_builddir = @abs_top_builddir@
@ -564,7 +567,7 @@ ELF_CLFAGS = -DELF_LIST_OPTIONS=@elf_list_options@ \
-DELF_SHLIB_LIST_OPTIONS=@elf_shlib_list_options@ \ -DELF_SHLIB_LIST_OPTIONS=@elf_shlib_list_options@ \
-DELF_PLT_UNWIND_LIST_OPTIONS=@elf_plt_unwind_list_options@ -DELF_PLT_UNWIND_LIST_OPTIONS=@elf_plt_unwind_list_options@
AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) $(JANSSON_CFLAGS) $(ZSTD_CFLAGS)
# We put the scripts in the directory $(scriptdir)/ldscripts. # We put the scripts in the directory $(scriptdir)/ldscripts.
# We can't put the scripts in $(datadir) because the SEARCH_DIR # We can't put the scripts in $(datadir) because the SEARCH_DIR
@ -1011,7 +1014,9 @@ ld_new_SOURCES = ldgram.y ldlex-wrapper.c lexsup.c ldlang.c mri.c ldctor.c ldmai
ld_new_DEPENDENCIES = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) \ ld_new_DEPENDENCIES = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) \
$(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL_DEP) $(JANSSON_LIBS) $(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL_DEP) $(JANSSON_LIBS)
ld_new_LDADD = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBCTF) $(LIBIBERTY) $(LIBINTL) $(ZLIB) $(JANSSON_LIBS) ld_new_LDADD = $(EMULATION_OFILES) $(EMUL_EXTRA_OFILES) $(BFDLIB) $(LIBCTF) \
$(LIBIBERTY) $(LIBINTL) $(ZLIB) $(ZSTD_LIBS) $(JANSSON_LIBS)
# #
# #
# Build a dummy plugin using libtool. # Build a dummy plugin using libtool.

View file

@ -1,5 +1,8 @@
-*- text -*- -*- text -*-
* ld now supports zstd compressed debug sections. The new option
--compress-debug-sections=zstd compresses debug sections with zstd.
Changes in 2.39: Changes in 2.39:
* The ELF linker will now generate a warning message if the stack is made * The ELF linker will now generate a warning message if the stack is made

1
ld/aclocal.m4 vendored
View file

@ -1203,6 +1203,7 @@ m4_include([../config/plugins.m4])
m4_include([../config/po.m4]) m4_include([../config/po.m4])
m4_include([../config/progtest.m4]) m4_include([../config/progtest.m4])
m4_include([../config/zlib.m4]) m4_include([../config/zlib.m4])
m4_include([../config/zstd.m4])
m4_include([../libtool.m4]) m4_include([../libtool.m4])
m4_include([../ltoptions.m4]) m4_include([../ltoptions.m4])
m4_include([../ltsugar.m4]) m4_include([../ltsugar.m4])

View file

@ -162,6 +162,9 @@
/* Define to 1 if you have the <windows.h> header file. */ /* Define to 1 if you have the <windows.h> header file. */
#undef HAVE_WINDOWS_H #undef HAVE_WINDOWS_H
/* Define to 1 if zstd is enabled. */
#undef HAVE_ZSTD
/* Define to the sub-directory in which libtool stores uninstalled libraries. /* Define to the sub-directory in which libtool stores uninstalled libraries.
*/ */
#undef LT_OBJDIR #undef LT_OBJDIR

390
ld/configure vendored
View file

@ -646,6 +646,8 @@ elf_plt_unwind_list_options
elf_shlib_list_options elf_shlib_list_options
elf_list_options elf_list_options
STRINGIFY STRINGIFY
ZSTD_LIBS
ZSTD_CFLAGS
zlibinc zlibinc
zlibdir zlibdir
NATIVE_LIB_DIRS NATIVE_LIB_DIRS
@ -679,9 +681,6 @@ WARN_CFLAGS_FOR_BUILD
WARN_CFLAGS WARN_CFLAGS
JANSSON_LIBS JANSSON_LIBS
JANSSON_CFLAGS JANSSON_CFLAGS
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
enable_libctf enable_libctf
ENABLE_LIBCTF_FALSE ENABLE_LIBCTF_FALSE
ENABLE_LIBCTF_TRUE ENABLE_LIBCTF_TRUE
@ -711,6 +710,9 @@ LD
FGREP FGREP
SED SED
LIBTOOL LIBTOOL
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
EGREP EGREP
CPP CPP
GREP GREP
@ -855,6 +857,7 @@ enable_werror
enable_build_warnings enable_build_warnings
enable_nls enable_nls
with_system_zlib with_system_zlib
with_zstd
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
host_alias host_alias
@ -868,14 +871,16 @@ CXX
CXXFLAGS CXXFLAGS
CCC CCC
CPP CPP
CXXCPP
PKG_CONFIG PKG_CONFIG
PKG_CONFIG_PATH PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR
CXXCPP
JANSSON_CFLAGS JANSSON_CFLAGS
JANSSON_LIBS JANSSON_LIBS
YACC YACC
YFLAGS' YFLAGS
ZSTD_CFLAGS
ZSTD_LIBS'
# Initialize some variables set by options. # Initialize some variables set by options.
@ -1552,6 +1557,8 @@ Optional Packages:
--with-lib-path=dir1:dir2... set default LIB_PATH --with-lib-path=dir1:dir2... set default LIB_PATH
--with-sysroot=DIR Search for usr/lib et al within DIR. --with-sysroot=DIR Search for usr/lib et al within DIR.
--with-system-zlib use installed libz --with-system-zlib use installed libz
--with-zstd support zstd compressed debug sections
(default=auto)
Some influential environment variables: Some influential environment variables:
CC C compiler command CC C compiler command
@ -1564,12 +1571,12 @@ Some influential environment variables:
CXX C++ compiler command CXX C++ compiler command
CXXFLAGS C++ compiler flags CXXFLAGS C++ compiler flags
CPP C preprocessor CPP C preprocessor
CXXCPP C++ preprocessor
PKG_CONFIG path to pkg-config utility PKG_CONFIG path to pkg-config utility
PKG_CONFIG_PATH PKG_CONFIG_PATH
directories to add to pkg-config's search path directories to add to pkg-config's search path
PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR
path overriding pkg-config's built-in search path path overriding pkg-config's built-in search path
CXXCPP C++ preprocessor
JANSSON_CFLAGS JANSSON_CFLAGS
C compiler flags for JANSSON, overriding pkg-config C compiler flags for JANSSON, overriding pkg-config
JANSSON_LIBS JANSSON_LIBS
@ -1580,6 +1587,8 @@ Some influential environment variables:
YFLAGS The list of arguments that will be passed by default to $YACC. YFLAGS The list of arguments that will be passed by default to $YACC.
This script will default YFLAGS to the empty string to avoid a This script will default YFLAGS to the empty string to avoid a
default value of `-d' given by some make applications. 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
Use these variables to override the choices made by `configure' or to help Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations. it to find libraries and programs with nonstandard names/locations.
@ -5388,6 +5397,126 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
if test "x$ac_cv_env_PKG_CONFIG_set" != "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=$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="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$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=$PKG_CONFIG
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$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="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
ac_pt_PKG_CONFIG=$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" = x; then
PKG_CONFIG=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
PKG_CONFIG=$ac_pt_PKG_CONFIG
fi
else
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=0.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=""
fi
fi
case `pwd` in case `pwd` in
*\ * | *\ *) *\ * | *\ *)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
@ -11491,7 +11620,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11494 "configure" #line 11623 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -11597,7 +11726,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11600 "configure" #line 11729 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -15585,126 +15714,6 @@ else
fi fi
if test "x$ac_cv_env_PKG_CONFIG_set" != "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=$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="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$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=$PKG_CONFIG
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$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="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
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="$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=$as_save_IFS
;;
esac
fi
ac_pt_PKG_CONFIG=$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" = x; then
PKG_CONFIG=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
PKG_CONFIG=$ac_pt_PKG_CONFIG
fi
else
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=0.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=""
fi
fi
if test "x$enable_jansson" != "xno"; then : if test "x$enable_jansson" != "xno"; then :
pkg_failed=no pkg_failed=no
@ -17041,8 +17050,8 @@ $as_echo "#define HAVE_DECL_GETOPT 1" >>confdefs.h
fi fi
# Link in zlib if we can. This allows us to read and write # Link in zlib/zstd if we can. This allows us to read and write
# compressed CTF sections. # compressed debug sections.
# Use the system's zlib library. # Use the system's zlib library.
zlibdir="-L\$(top_builddir)/../zlib" zlibdir="-L\$(top_builddir)/../zlib"
@ -17061,6 +17070,127 @@ fi
# Check whether --with-zstd was given.
if test "${with_zstd+set}" = set; then :
withval=$with_zstd;
else
with_zstd=auto
fi
if test "$with_zstd" != no; then :
pkg_failed=no
{ $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="$ZSTD_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$ZSTD_LIBS"; then
pkg_cv_ZSTD_LIBS="$ZSTD_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5
($PKG_CONFIG --exists --print-errors "libzstd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = no; then
pkg_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$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=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$pkg_save_LDFLAGS
fi
if test $pkg_failed = 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=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1`
else
ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$ZSTD_PKG_ERRORS" >&5
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "$with_zstd" = yes; then
as_fn_error $? "--with-zstd was given, but pkgconfig/libzstd.pc is not found" "$LINENO" 5
fi
else
ZSTD_CFLAGS=$pkg_cv_ZSTD_CFLAGS
ZSTD_LIBS=$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
# When converting linker scripts into strings for use in emulation # When converting linker scripts into strings for use in emulation
# files, use astring.sed if the compiler supports ANSI string # files, use astring.sed if the compiler supports ANSI string
# concatenation, or ostring.sed otherwise. This is to support the # concatenation, or ostring.sed otherwise. This is to support the

View file

@ -34,6 +34,7 @@ AC_PROG_GREP
AC_GNU_SOURCE AC_GNU_SOURCE
AC_USE_SYSTEM_EXTENSIONS AC_USE_SYSTEM_EXTENSIONS
AC_PROG_INSTALL AC_PROG_INSTALL
PKG_PROG_PKG_CONFIG
LT_INIT LT_INIT
ACX_LARGEFILE ACX_LARGEFILE
@ -377,9 +378,10 @@ if test $ld_cv_decl_getopt_unistd_h = yes; then
[Is the prototype for getopt in <unistd.h> in the expected format?]) [Is the prototype for getopt in <unistd.h> in the expected format?])
fi fi
# Link in zlib if we can. This allows us to read and write # Link in zlib/zstd if we can. This allows us to read and write
# compressed CTF sections. # compressed debug sections.
AM_ZLIB AM_ZLIB
AC_ZSTD
# When converting linker scripts into strings for use in emulation # When converting linker scripts into strings for use in emulation
# files, use astring.sed if the compiler supports ANSI string # files, use astring.sed if the compiler supports ANSI string

View file

@ -668,6 +668,15 @@ gld${EMULATION_NAME}_handle_option (int optc)
link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB; link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
else if (strcasecmp (optarg, "zlib-gabi") == 0) else if (strcasecmp (optarg, "zlib-gabi") == 0)
link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB; link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
else if (strcasecmp (optarg, "zstd") == 0)
{
#ifdef HAVE_ZSTD
link_info.compress_debug = COMPRESS_DEBUG_ZSTD;
#else
einfo (_ ("%F%P: --compress-debug-sections=zstd: ld is not built "
"with zstd support\n"));
#endif
}
else else
einfo (_("%F%P: invalid --compress-debug-sections option: \`%s'\n"), einfo (_("%F%P: invalid --compress-debug-sections option: \`%s'\n"),
optarg); optarg);

View file

@ -2863,10 +2863,12 @@ but for most Linux based systems it will be @code{both}.
@kindex --compress-debug-sections=zlib @kindex --compress-debug-sections=zlib
@kindex --compress-debug-sections=zlib-gnu @kindex --compress-debug-sections=zlib-gnu
@kindex --compress-debug-sections=zlib-gabi @kindex --compress-debug-sections=zlib-gabi
@kindex --compress-debug-sections=zstd
@item --compress-debug-sections=none @item --compress-debug-sections=none
@itemx --compress-debug-sections=zlib @itemx --compress-debug-sections=zlib
@itemx --compress-debug-sections=zlib-gnu @itemx --compress-debug-sections=zlib-gnu
@itemx --compress-debug-sections=zlib-gabi @itemx --compress-debug-sections=zlib-gabi
@itemx --compress-debug-sections=zstd
On ELF platforms, these options control how DWARF debug sections are On ELF platforms, these options control how DWARF debug sections are
compressed using zlib. compressed using zlib.
@ -2880,6 +2882,9 @@ sets the SHF_COMPRESSED flag in the sections' headers.
The @option{--compress-debug-sections=zlib} option is an alias for The @option{--compress-debug-sections=zlib} option is an alias for
@option{--compress-debug-sections=zlib-gabi}. @option{--compress-debug-sections=zlib-gabi}.
@option{--compress-debug-sections=zstd} compresses DWARF debug sections using
zstd.
Note that this option overrides any compression in input debug Note that this option overrides any compression in input debug
sections, so if a binary is linked with @option{--compress-debug-sections=none} sections, so if a binary is linked with @option{--compress-debug-sections=none}
for example, then any compressed debug sections in input files will be for example, then any compressed debug sections in input files will be

View file

@ -506,8 +506,12 @@ main (int argc, char **argv)
if ((link_info.compress_debug & COMPRESS_DEBUG)) if ((link_info.compress_debug & COMPRESS_DEBUG))
{ {
link_info.output_bfd->flags |= BFD_COMPRESS; link_info.output_bfd->flags |= BFD_COMPRESS;
if (link_info.compress_debug == COMPRESS_DEBUG_GABI_ZLIB) if (link_info.compress_debug != COMPRESS_DEBUG_GNU_ZLIB)
{
link_info.output_bfd->flags |= BFD_COMPRESS_GABI; link_info.output_bfd->flags |= BFD_COMPRESS_GABI;
if (link_info.compress_debug == COMPRESS_DEBUG_ZSTD)
link_info.output_bfd->flags |= BFD_COMPRESS_ZSTD;
}
} }
ldwrite (); ldwrite ();

View file

@ -2146,8 +2146,8 @@ elf_static_list_options (FILE *file)
fprintf (file, _("\ fprintf (file, _("\
--package-metadata[=JSON] Generate package metadata note\n")); --package-metadata[=JSON] Generate package metadata note\n"));
fprintf (file, _("\ fprintf (file, _("\
--compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi]\n\ --compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi|zstd]\n\
Compress DWARF debug sections using zlib\n")); Compress DWARF debug sections\n"));
#ifdef DEFAULT_FLAG_COMPRESS_DEBUG #ifdef DEFAULT_FLAG_COMPRESS_DEBUG
fprintf (file, _("\ fprintf (file, _("\
Default: zlib-gabi\n")); Default: zlib-gabi\n"));

View file

@ -161,6 +161,10 @@ foreach flags $test_flags {
set extralibs "$extralibs -lz" set extralibs "$extralibs -lz"
} }
if { [lindex [remote_exec build grep "-q \"HAVE_ZSTD 1\" config.h" ] 0] == 0 } then {
set extralibs "$extralibs -lzstd"
}
# Check if the system's jansson library is used. If so, the object files will # Check if the system's jansson library is used. If so, the object files will
# be using symbols from it, so link to it. # be using symbols from it, so link to it.
if { [lindex [remote_exec build grep "-q \"HAVE_JANSSON 1\" config.h" ] 0] == 0 } then { if { [lindex [remote_exec build grep "-q \"HAVE_JANSSON 1\" config.h" ] 0] == 0 } then {

View file

@ -254,3 +254,19 @@ if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rt] } then {
} else { } else {
pass "$test_name" pass "$test_name"
} }
if { [ld_assemble $as "--compress-debug-sections=zstd $srcdir/$subdir/empty.s" tmpdir/emptyzstd.o ] } {
set build_tests {
{"Build libzstdfoo.so with zstd compressed debug sections"
"-shared" "-fPIC -g -Wa,--compress-debug-sections=zstd -Wl,--compress-debug-sections=zstd"
{foo.c} {} "libzstdfoo.so"}
}
set run_tests {
{"Run zstdnormal with libzstdfoo.so with zstd compressed debug sections"
"tmpdir/begin.o tmpdir/libzstdfoo.so tmpdir/end.o -Wl,--compress-debug-sections=zstd" ""
{main.c} "zstdnormal" "normal.out" "-Wa,--compress-debug-sections=zstd"}
}
run_cc_link_tests $build_tests
run_ld_link_exec_tests $run_tests
}