libbacktrace: support zstd decompression

Support decompressing --compress-debug-sections=zstd.
	* configure.ac: Check for zstd library and
	--compress-debug-sections=zstd linker option.
	* Makefile.am (zstdtest_*): New targets.
	(zstdtest_alloc_*, ctestzstd_*): New targets.
	(BUILDTESTS): Add zstdtest, zstdtest_alloc, ctestzstd as
	appropriate.
	* elf.c (ELFCOMPRESS_ZSTD): Define.
	(elf_fetch_bits): Rename from elf_zlib_fetch.  Update uses.
	(elf_fetch_bits_backward): New static function.
	(ZLIB_HUFFMAN_*): Rename from HUFFMAN_*.  Update uses.
	(ZLIB_TABLE_*): Rename from ZDEBUG_TABLE_*.  Update uses.
	(ZSTD_TABLE_*): Define.
	(struct elf_zstd_fse_entry): Define.
	(elf_zstd_read_fse): New static function.
	(elf_zstd_build_fse): Likewise.
	(lit): Define if BACKTRACE_GENERATE_ZSTD_FSE_TABLES.
	(match, offset, next, print_table, main): Likewise.
	(elf_zstd_lit_table): New static const array.
	(elf_zstd_match_table, elf_zstd_offset_table): Likewise.
	(elf_zstd_read_huff): New static function.
	(struct elf_zstd_seq_decode): Define.
	(elf_zstd_unpack_seq_decode): New static function.
	(ZSTD_LIT_*): Define.
	(struct elf_zstd_literals): Define.
	(elf_zstd_literal_output): New static function.
	(ZSTD_LITERAL_LENGTH_BASELINE_OFFSET): Define.
	(elf_zstd_literal_length_baseline): New static const array.
	(elf_zstd_literal_length_bits): Likewise.
	(ZSTD_MATCH_LENGTH_BASELINE_OFFSET): Define.
	(elf_zstd_match_length_baseline): New static const array.
	(elf_zstd_match_length_bits): Likewise.
	(elf_zstd_decompress): New static function.
	(ZDEBUG_TABLE_SIZE): New definition.
	(elf_uncompress_chdr): Support ELF_COMPRESS_ZSTD.
	(backtrace_uncompress_zstd): New function.
	(elf_add): Use ZLIB_TABLE_SIZE for zlib-gnu sections.
	* internal.h (backtrace_uncompress_zstd): Declare.
	* zstdtest.c: New file.
	* configure, config.h.in, Makefile.in: Regenerate.
This commit is contained in:
Ian Lance Taylor
2022-12-07 16:21:26 -08:00
parent 8602fda64e
commit c992dd8a9b
8 changed files with 3165 additions and 110 deletions

View File

@@ -369,6 +369,25 @@ ztest_alloc_CFLAGS = $(ztest_CFLAGS)
BUILDTESTS += ztest_alloc
zstdtest_SOURCES = zstdtest.c testlib.c
zstdtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
zstdtest_LDADD = libbacktrace.la
zstdtest_alloc_LDADD = libbacktrace_alloc.la
if HAVE_ZSTD
zstdtest_LDADD += -lzstd
zstdtest_alloc_LDADD += -lzstd
endif
zstdtest_LDADD += $(CLOCK_GETTIME_LINK)
zstdtest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
BUILDTESTS += zstdtest
zstdtest_alloc_SOURCES = $(zstdtest_SOURCES)
zstdtest_alloc_CFLAGS = $(zstdtest_CFLAGS)
BUILDTESTS += zstdtest_alloc
endif HAVE_ELF
edtest_SOURCES = edtest.c edtest2_build.c testlib.c
@@ -451,6 +470,17 @@ ctesta_LDADD = libbacktrace.la
BUILDTESTS += ctestg ctesta
if HAVE_COMPRESSED_DEBUG_ZSTD
ctestzstd_SOURCES = btest.c testlib.c
ctestzstd_CFLAGS = $(libbacktrace_TEST_CFLAGS)
ctestzstd_LDFLAGS = -Wl,--compress-debug-sections=zstd
ctestzstd_LDADD = libbacktrace.la
BUILDTESTS += ctestzstd
endif
ctestg_alloc_SOURCES = $(ctestg_SOURCES)
ctestg_alloc_CFLAGS = $(ctestg_CFLAGS)
ctestg_alloc_LDFLAGS = $(ctestg_LDFLAGS)