[ELF] Compress debug sections after assignAddresses and support custom layout
Previously, in r320472, I moved the calculation of section offsets and sizes
for compressed debug sections into maybeCompress, which happens before
assignAddresses, so that the compression had the required information. However,
I failed to take account of relocations that patch such sections. This had two
effects:
1. A race condition existed when a debug section referred to a different debug
section (see PR35788).
2. References to symbols in non-debug sections would be patched incorrectly.
This is because the addresses of such symbols are not calculated until after
assignAddresses (this was a partial regression caused by r320472, but they
could still have been broken before, in the event that a custom layout was used
in a linker script).
assignAddresses does not need to know about the output section size of
non-allocatable sections, because they do not affect the value of Dot. This
means that there is no longer a reason not to support custom layout of
compressed debug sections, as far as I'm aware. These two points allow for
delaying when maybeCompress can be called, removing the need for the loop I
previously added to calculate the section size, and therefore the race
condition. Furthermore, by delaying, we fix the issues of relocations getting
incorrect symbol values, because they have now all been finalized.
llvm-svn: 321986
2018-01-08 18:17:03 +08:00
|
|
|
# REQUIRES: x86, zlib
|
|
|
|
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/compress-debug.s -o %t2.o
|
|
|
|
# RUN: ld.lld %t2.o %t.o -o %t1 --compress-debug-sections=zlib -Ttext=0
|
|
|
|
# RUN: llvm-dwarfdump %t1 -debug-str | FileCheck %s
|
|
|
|
# These two checks correspond to the patched values of a_sym and a_debug_sym.
|
|
|
|
# D = 0x44 - address of .text input section for this file (the start address of
|
|
|
|
# .text is 0 as requested on the command line, and the size of the
|
|
|
|
# preceding .text in the other input file is 0x44).
|
|
|
|
# C = 0x43 - offset of .debug_info section for this file (the size of
|
|
|
|
# the preceding .debug_info from the other input file is 0x43).
|
|
|
|
# CHECK: 0x00000000: "D"
|
|
|
|
# CHECK: 0x00000004: "C"
|
|
|
|
|
|
|
|
.text
|
|
|
|
a_sym:
|
|
|
|
nop
|
|
|
|
|
2020-02-20 13:27:13 +08:00
|
|
|
.section .debug_str,"MS",@progbits,1
|
[ELF] Compress debug sections after assignAddresses and support custom layout
Previously, in r320472, I moved the calculation of section offsets and sizes
for compressed debug sections into maybeCompress, which happens before
assignAddresses, so that the compression had the required information. However,
I failed to take account of relocations that patch such sections. This had two
effects:
1. A race condition existed when a debug section referred to a different debug
section (see PR35788).
2. References to symbols in non-debug sections would be patched incorrectly.
This is because the addresses of such symbols are not calculated until after
assignAddresses (this was a partial regression caused by r320472, but they
could still have been broken before, in the event that a custom layout was used
in a linker script).
assignAddresses does not need to know about the output section size of
non-allocatable sections, because they do not affect the value of Dot. This
means that there is no longer a reason not to support custom layout of
compressed debug sections, as far as I'm aware. These two points allow for
delaying when maybeCompress can be called, removing the need for the loop I
previously added to calculate the section size, and therefore the race
condition. Furthermore, by delaying, we fix the issues of relocations getting
incorrect symbol values, because they have now all been finalized.
llvm-svn: 321986
2018-01-08 18:17:03 +08:00
|
|
|
.long a_sym
|
|
|
|
.long a_debug_sym
|
|
|
|
|
|
|
|
.section .debug_info,"",@progbits
|
|
|
|
a_debug_sym:
|
|
|
|
.long 0x88776655
|