Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package mold for openSUSE:Factory checked in at 2022-04-20 16:54:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/mold (Old) and /work/SRC/openSUSE:Factory/.mold.new.1941 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mold" Wed Apr 20 16:54:40 2022 rev:11 rq:971086 version:1.2 Changes: -------- --- /work/SRC/openSUSE:Factory/mold/mold.changes 2022-04-16 00:15:57.625786190 +0200 +++ /work/SRC/openSUSE:Factory/.mold.new.1941/mold.changes 2022-04-20 16:54:44.802478263 +0200 @@ -1,0 +2,13 @@ +Wed Apr 20 06:50:40 UTC 2022 - Martin Li??ka <mli...@suse.cz> + +- Run test serially. +- Install some packages in order to increase test coverage. +- Use ExclusiveArch. + +------------------------------------------------------------------- +Tue Apr 19 06:43:50 UTC 2022 - Martin Li??ka <mli...@suse.cz> + +- Add fix-gdb-index.patch. +- Enable tests. + +------------------------------------------------------------------- New: ---- fix-gdb-index.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mold.spec ++++++ --- /var/tmp/diff_new_pack.jqGsZu/_old 2022-04-20 16:54:45.382478805 +0200 +++ /var/tmp/diff_new_pack.jqGsZu/_new 2022-04-20 16:54:45.386478808 +0200 @@ -23,15 +23,24 @@ License: AGPL-3.0-or-later URL: https://github.com/rui314/mold Source: https://github.com/rui314/mold/archive/v%{version}/mold-%{version}.tar.gz +Patch0: fix-gdb-index.patch +ExclusiveArch: x86_64 aarch64 riscv64 BuildRequires: cmake %if %{suse_version} < 1550 BuildRequires: gcc10-c++ %else # These libraries are not present for openSUSE Leap BuildRequires: gcc-c++ +BuildRequires: clang +BuildRequires: libdwarf-tools +BuildRequires: llvm-gold BuildRequires: mimalloc-devel BuildRequires: tbb-devel +%ifarch x86_64 +BuildRequires: gcc-32bit %endif +%endif +BuildRequires: glibc-devel-static BuildRequires: openssl-devel BuildRequires: xxhash-devel BuildRequires: zlib-devel @@ -78,6 +87,15 @@ PREFIX=%{_prefix} \ BINDIR=%{_bindir} \ MANDIR=%{_mandir} \ +LIBDIR=%{_libdir} \ +LIBEXECDIR=%{_libexecdir} \ +%{build_args} + +%check +make test -k -e \ +PREFIX=%{_prefix} \ +BINDIR=%{_bindir} \ +MANDIR=%{_mandir} \ LIBDIR=%{_libdir} \ LIBEXECDIR=%{_libexecdir} \ %{build_args} ++++++ fix-gdb-index.patch ++++++ >From c90801e62906f454eb3d478683cd54bce5d8d7b3 Mon Sep 17 00:00:00 2001 From: Rui Ueyama <r...@cs.stanford.edu> Date: Sat, 16 Apr 2022 13:18:09 +0800 Subject: [PATCH] [ELF] Make --gdb-index work for compressed input debug sections Previously, --gdb-index tries to read bogus compressed data from input sections if input debug sections are compressed. Fixes https://github.com/rui314/mold/issues/431 --- elf/arch-riscv64.cc | 4 ++-- elf/input-files.cc | 10 ++-------- elf/input-sections.cc | 44 +++++++++++++++++++++++++------------------ elf/mold.h | 14 ++++++-------- elf/output-chunks.cc | 2 ++ test/elf/gdb-index.sh | 21 +++++++++++++-------- 6 files changed, 51 insertions(+), 44 deletions(-) diff --git a/elf/arch-riscv64.cc b/elf/arch-riscv64.cc index aa5d7b1c..955407f2 100644 --- a/elf/arch-riscv64.cc +++ b/elf/arch-riscv64.cc @@ -490,8 +490,8 @@ template <> void InputSection<E>::copy_contents_riscv(Context<E> &ctx, u8 *buf) { // A non-alloc section isn't relaxed, so just copy it as one big chunk. if (!(shdr().sh_flags & SHF_ALLOC)) { - if (is_compressed()) - uncompress(ctx, buf); + if (compressed) + uncompress_to(ctx, buf); else memcpy(buf, contents.data(), contents.size()); return; diff --git a/elf/input-files.cc b/elf/input-files.cc index 6980e21a..d44216af 100644 --- a/elf/input-files.cc +++ b/elf/input-files.cc @@ -524,16 +524,10 @@ split_section(Context<E> &ctx, InputSection<E> &sec) { sec.shdr().sh_flags); rec->p2align = sec.p2align; - std::string_view data = sec.contents; - // If thes section contents are compressed, uncompress them. - if (sec.is_compressed()) { - u8 *buf = new u8[sec.sh_size]; - sec.uncompress(ctx, buf); - data = {(char *)buf, sec.sh_size}; - ctx.string_pool.emplace_back(buf); - } + sec.uncompress(ctx); + std::string_view data = sec.contents; const char *begin = data.data(); u64 entsize = sec.shdr().sh_entsize; HyperLogLog estimator; diff --git a/elf/input-sections.cc b/elf/input-sections.cc index cfe1c570..81663cdb 100644 --- a/elf/input-sections.cc +++ b/elf/input-sections.cc @@ -38,8 +38,6 @@ InputSection<E>::InputSection(Context<E> &ctx, ObjectFile<E> &file, if (shndx < file.elf_sections.size()) contents = {(char *)file.mf->data + shdr().sh_offset, shdr().sh_size}; - bool compressed; - if (name.starts_with(".zdebug")) { sh_size = *(ubig64 *)&contents[4]; p2align = to_p2align(shdr().sh_addralign); @@ -55,28 +53,37 @@ InputSection<E>::InputSection(Context<E> &ctx, ObjectFile<E> &file, compressed = false; } - // Uncompress early if the relocation is REL-type so that we can read - // addends from section contents. If RELA-type, we don't need to do this - // because addends are in relocations. - if (compressed && E::is_rel) { - u8 *buf = new u8[sh_size]; - uncompress(ctx, buf); - contents = {(char *)buf, sh_size}; - ctx.string_pool.emplace_back(buf); - } + // Sections may have been compressed. We usually uncompress them + // directly into the mmap'ed output file, but we want to uncompress + // early for REL-type ELF types to read relocation addends from + // section contents. For RELA-type, we don't need to do this because + // addends are in relocations. + if (E::is_rel) + uncompress(ctx); output_section = OutputSection<E>::get_instance(ctx, name, shdr().sh_type, shdr().sh_flags); } template <typename E> -bool InputSection<E>::is_compressed() { - return !E::is_rel && - (name().starts_with(".zdebug") || (shdr().sh_flags & SHF_COMPRESSED)); +void InputSection<E>::uncompress(Context<E> &ctx) { + if (!compressed || uncompressed) + return; + + u8 *buf = new u8[sh_size]; + uncompress_to(ctx, buf); + contents = {(char *)buf, sh_size}; + ctx.string_pool.emplace_back(buf); + uncompressed = true; } template <typename E> -void InputSection<E>::uncompress(Context<E> &ctx, u8 *buf) { +void InputSection<E>::uncompress_to(Context<E> &ctx, u8 *buf) { + if (!compressed || uncompressed) { + memcpy(buf, contents.data(), contents.size()); + return; + } + auto do_uncompress = [&](std::string_view data) { unsigned long size = sh_size; if (::uncompress(buf, &size, (u8 *)data.data(), data.size()) != Z_OK) @@ -100,7 +107,8 @@ void InputSection<E>::uncompress(Context<E> &ctx, u8 *buf) { ElfChdr<E> &hdr = *(ElfChdr<E> *)&contents[0]; if (hdr.ch_type != ELFCOMPRESS_ZLIB) - Fatal(ctx) << *this << ": unsupported compression type"; + Fatal(ctx) << *this << ": unsupported compression type: 0x" + << std::hex << hdr.ch_type; do_uncompress(contents.substr(sizeof(ElfChdr<E>))); } @@ -213,8 +221,8 @@ void InputSection<E>::write_to(Context<E> &ctx, u8 *buf) { // Copy data if constexpr (std::is_same_v<E, RISCV64>) { copy_contents_riscv(ctx, buf); - } else if (is_compressed()) { - uncompress(ctx, buf); + } else if (compressed) { + uncompress_to(ctx, buf); } else { memcpy(buf, contents.data(), contents.size()); } diff --git a/elf/mold.h b/elf/mold.h index b36446cb..d38fec9a 100644 --- a/elf/mold.h +++ b/elf/mold.h @@ -266,8 +266,8 @@ class InputSection { InputSection(Context<E> &ctx, ObjectFile<E> &file, std::string_view name, i64 shndx); - bool is_compressed(); - void uncompress(Context<E> &ctx, u8 *buf); + void uncompress(Context<E> &ctx); + void uncompress_to(Context<E> &ctx, u8 *buf); void scan_relocations(Context<E> &ctx); void write_to(Context<E> &ctx, u8 *buf); void apply_reloc_alloc(Context<E> &ctx, u8 *base); @@ -307,10 +307,12 @@ class InputSection { // For COMDAT de-duplication and garbage collection std::atomic_bool is_alive = true; - bool killed_by_icf = false; - u8 p2align = 0; + u8 compressed : 1 = false; + u8 uncompressed : 1 = false; + u8 killed_by_icf : 1 = false; + private: typedef enum : u8 { NONE, ERROR, COPYREL, PLT, CPLT, DYNREL, BASEREL } Action; @@ -1142,10 +1144,6 @@ class ObjectFile : public InputFile<E> { const ElfSym<E> &esym, i64 symidx); void merge_visibility(Context<E> &ctx, Symbol<E> &sym, u8 visibility); - std::pair<std::string_view, const ElfShdr<E> *> - uncompress_contents(Context<E> &ctx, const ElfShdr<E> &shdr, - std::string_view name); - bool has_common_symbol = false; std::string_view symbol_strtab; diff --git a/elf/output-chunks.cc b/elf/output-chunks.cc index abb278ef..315172bb 100644 --- a/elf/output-chunks.cc +++ b/elf/output-chunks.cc @@ -2407,6 +2407,7 @@ void GdbIndexSection<E>::write_address_areas(Context<E> &ctx) { template <typename E> std::vector<std::string_view> GdbIndexSection<E>::read_compunits(Context<E> &ctx, ObjectFile<E> &file) { + file.debug_info->uncompress(ctx); std::string_view data = file.debug_info->contents; std::vector<std::string_view> vec; @@ -2444,6 +2445,7 @@ GdbIndexSection<E>::read_pubnames(Context<E> &ctx, ObjectFile<E> &file) { }; auto read = [&](InputSection<E> &isec) { + isec.uncompress(ctx); std::string_view contents = isec.contents; while (!contents.empty()) {