mirror of
https://github.com/rui314/mold.git
synced 2024-10-04 08:37:28 +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];
|
||||
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.
|
||||
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