mirror of
https://github.com/rui314/mold.git
synced 2024-10-04 16:48:04 +03:00
[ELF] Ignore comdat groups GCC emits for .debug_macro
GCC creates a .debug_macro section if -g3 is given. That section is in a comdat group, but the section is directly referred by another section, which is a violation of the ELF spec. If a section is deduplicated, we handle any references to that section as if they had value 0. But that causes a mysterious gdb slowdown. So we can't set 0 for a dead .debug_macro section. In this commit, we simply stop deduplicating .debug_macro sections. This will bloat up debug info, but that's better than producing an effectively non-debuggable binary. Fixes https://github.com/rui314/mold/issues/357 Fixes https://github.com/rui314/mold/issues/438
This commit is contained in:
parent
92505f4aea
commit
8c5e4df741
@ -133,6 +133,11 @@ void ObjectFile<E>::initialize_sections(Context<E> &ctx) {
|
|||||||
const ElfSym<E> &sym = this->elf_syms[shdr.sh_info];
|
const ElfSym<E> &sym = this->elf_syms[shdr.sh_info];
|
||||||
std::string_view signature = symbol_strtab.data() + sym.st_name;
|
std::string_view signature = symbol_strtab.data() + sym.st_name;
|
||||||
|
|
||||||
|
// Ignore a broken comdat group GCC emits for .debug_macros.
|
||||||
|
// https://github.com/rui314/mold/issues/438
|
||||||
|
if (signature.starts_with("wm4."))
|
||||||
|
continue;
|
||||||
|
|
||||||
// Get comdat group members.
|
// Get comdat group members.
|
||||||
std::span<u32> entries = this->template get_data<u32>(ctx, shdr);
|
std::span<u32> entries = this->template get_data<u32>(ctx, shdr);
|
||||||
|
|
||||||
|
37
test/elf/debug-macro-section.sh
Executable file
37
test/elf/debug-macro-section.sh
Executable file
@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
export LC_ALL=C
|
||||||
|
set -e
|
||||||
|
CC="${CC:-cc}"
|
||||||
|
CXX="${CXX:-c++}"
|
||||||
|
GCC="${GCC:-gcc}"
|
||||||
|
GXX="${GXX:-g++}"
|
||||||
|
OBJDUMP="${OBJDUMP:-objdump}"
|
||||||
|
MACHINE="${MACHINE:-$(uname -m)}"
|
||||||
|
testname=$(basename "$0" .sh)
|
||||||
|
echo -n "Testing $testname ... "
|
||||||
|
cd "$(dirname "$0")"/../..
|
||||||
|
mold="$(pwd)/mold"
|
||||||
|
t=out/test/elf/$testname
|
||||||
|
mkdir -p $t
|
||||||
|
|
||||||
|
cat <<EOF > $t/a.h
|
||||||
|
#define A 23
|
||||||
|
#define B 99
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF | $GCC -o $t/b.o -c -xc - -I$t -g3
|
||||||
|
#include "a.h"
|
||||||
|
extern int z();
|
||||||
|
int main () { return z() - 122; }
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF | $GCC -o $t/c.o -c -xc - -I$t -g3
|
||||||
|
#include "a.h"
|
||||||
|
int z() { return A + B; }
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$GCC -B. -o $t/exe $t/b.o $t/c.o
|
||||||
|
$OBJDUMP --dwarf=macro $t/exe > $t/log
|
||||||
|
! grep 'DW_MACRO_import -.* 0x0$' $t/log || false
|
||||||
|
|
||||||
|
echo OK
|
Loading…
Reference in New Issue
Block a user