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

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