From ac135aaf9ba7d675d8bc5b8920501492078100f5 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Wed, 7 Dec 2022 20:12:27 -0500 Subject: [PATCH] Account for new header layout in DWARF v5 Fixes #198 --- .../org.eclipse.cdt.core/META-INF/MANIFEST.MF | 2 +- .../eclipse/cdt/utils/debug/dwarf/Dwarf.java | 35 +++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF index c0e55984241..27b238fe1ac 100644 --- a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true -Bundle-Version: 8.0.0.qualifier +Bundle-Version: 8.0.100.qualifier Bundle-Activator: org.eclipse.cdt.core.CCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/debug/dwarf/Dwarf.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/debug/dwarf/Dwarf.java index 78fea6a9629..d6100e30597 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/debug/dwarf/Dwarf.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/debug/dwarf/Dwarf.java @@ -460,11 +460,22 @@ void parseDebugInfo(IDebugEntryRequestor requestor) { header.offsetSize = sectionLength.offsetSize; header.version = read_2_bytes(data); - if (header.offsetSize == 8) - header.abbreviationOffset = (int) read_8_bytes(data); - else - header.abbreviationOffset = read_4_bytes(data); - header.addressSize = data.get(); + if (header.version >= 5) { + // XXX: We don't use this new field in DWARF v5 yet + var unit_type = data.get(); + header.addressSize = data.get(); + + if (header.offsetSize == 8) + header.abbreviationOffset = (int) read_8_bytes(data); + else + header.abbreviationOffset = read_4_bytes(data); + } else { + if (header.offsetSize == 8) + header.abbreviationOffset = (int) read_8_bytes(data); + else + header.abbreviationOffset = read_4_bytes(data); + header.addressSize = data.get(); + } if (printEnabled) { System.out.println("Compilation Unit @ " + Long.toHexString(data.position())); //$NON-NLS-1$ @@ -476,10 +487,20 @@ void parseDebugInfo(IDebugEntryRequestor requestor) { // A 4-byte or 12-byte unsigned integer representing the length of the .debug_info // contribution for that compilation unit, not including the length field itself. ByteBuffer entryBuffer = data.slice(); - entryBuffer.limit(((int) header.length) - (header.offsetSize == 8 ? 11 : 7)); + int newLimit = ((int) header.length) - (header.offsetSize == 8 ? 11 : 7); + if (header.version >= 5) { + // account for new field in DWARF v5 + newLimit -= 1; + } + entryBuffer.limit(newLimit); parseDebugInfoEntry(requestor, entryBuffer, abbrevs, header); - data.position(data.position() + ((int) header.length) - (header.offsetSize == 8 ? 11 : 7)); + int newLimit2 = ((int) header.length) - (header.offsetSize == 8 ? 11 : 7); + if (header.version >= 5) { + // account for new field in DWARF v5 + newLimit2 -= 1; + } + data.position(data.position() + newLimit2); if (printEnabled) System.out.println();