-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DWARFVerifier] Fix debug_str_offsets DWARF version detection (#81303)
The DWARF 5 debug_str_offsets section starts with a header, which must be skipped in order to access the underlying `strp`s. However, the verifier supports some pre-standardization version of this section (with the same section name), which does not have a header. In this case, the offsets start on the first byte of the section. More in [1] and [2] about this legacy section. How does The DWARF verifier figure out which version to use? It manually reads the **first** header in debug_info and uses that. This is wrong when multiple debug_str_offset sections have been linked together, in particular it is wrong in the following two cases: 1. A standard DWARF 4 object file (i.e. no debug_str_offsets) linked with a standard DWARF 5 object file. 2. A non-standard DWARF 4 object file (i.e. containing the header-less debug_str_offsets section) linked with a standard DWARF 5 object file. Based on discussions in #81210, the legacy version is only possible with dwo files, and dwo files cannot mix the legacy version with the dwarf 5 version. As such, we change the verifier to only check the debug_info header in the case of dwo files. If it sees a dwarf 4 version, it handles it the legacy way. Note: the modified test was technically testing an unsupported combination of dwarf version + non-dwo sections. To see why, simply note that the test contained no `debug_info.dwo` sections, so the call to DWARFObject::forEachInfoDWOSections was doing nothing. We were finding the error through the "standard version", which shouldn't happen. [1]: https://gcc.gnu.org/wiki/DebugFission [2]: https://gcc.gnu.org/wiki/DebugFissionDWP
- Loading branch information
1 parent
dfbe2bc
commit 20948df
Showing
4 changed files
with
94 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
57 changes: 57 additions & 0 deletions
57
llvm/test/tools/llvm-dwarfdump/X86/debug-str-offsets-mixed-dwarf-4-5.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# RUN: yaml2obj %s -o %t.o | ||
# RUN: llvm-dwarfdump -debug-str-offsets -verify %t.o | FileCheck %s | ||
|
||
# CHECK: Verifying .debug_str_offsets... | ||
# CHECK: No errors | ||
|
||
# Check that when mixing standard DWARF 4 debug information with standard DWARF | ||
# 5 debug information, the verifier correctly interprets the debug_str_offsets | ||
# section as a standards-conforming DWARF 5 section. | ||
|
||
--- !ELF | ||
FileHeader: | ||
Class: ELFCLASS64 | ||
Data: ELFDATA2LSB | ||
Type: ET_EXEC | ||
DWARF: | ||
debug_str: | ||
- 'cu1' | ||
- 'cu2' | ||
debug_str_offsets: | ||
- Offsets: | ||
- 0x0 | ||
debug_abbrev: | ||
- Table: | ||
- Code: 0x1 | ||
Tag: DW_TAG_compile_unit | ||
Children: DW_CHILDREN_no | ||
Attributes: | ||
- Attribute: DW_AT_name | ||
Form: DW_FORM_strp | ||
- Code: 0x2 | ||
Tag: DW_TAG_compile_unit | ||
Children: DW_CHILDREN_no | ||
Attributes: | ||
- Attribute: DW_AT_name | ||
Form: DW_FORM_strx1 | ||
- Attribute: DW_AT_str_offsets_base | ||
Form: DW_FORM_sec_offset | ||
debug_info: | ||
- Version: 4 | ||
AbbrevTableID: 0 | ||
AbbrOffset: 0x0 | ||
AddrSize: 8 | ||
Entries: | ||
- AbbrCode: 0x1 | ||
Values: | ||
- Value: 0x4 | ||
- Version: 5 | ||
UnitType: DW_UT_compile | ||
AbbrOffset: 0x0 | ||
AddrSize: 8 | ||
AbbrevTableID: 0 | ||
Entries: | ||
- AbbrCode: 0x2 | ||
Values: | ||
- Value: 0x0 | ||
- Value: 0x8 # str offsets base |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters