"""Verify that removing offline DWARF leaves every runtime program segment byte-identical."""
import argparse
import hashlib
import json
from pathlib import Path
import struct
def segments(path):
data = Path(path).read_bytes()
assert data[:6] == b'\x7fELF\x02\x01', 'Expected little-endian ELF64'
offset = struct.unpack_from('<Q', data, 32)[0]
size, count = struct.unpack_from('<HH', data, 54)
assert size == 56 and 0 < count <= 32
records = []
for index in range(count):
kind, flags, at, virtual, physical, files, memory, alignment = struct.unpack_from('<IIQQQQQQ', data, offset + index*size)
assert at + files <= len(data)
records.append({'Type': kind, 'Flags': flags, 'Virtual': virtual, 'Physical': physical,
'FileBytes': files, 'MemoryBytes': memory, 'Alignment': alignment,
'Sha256': hashlib.sha256(data[at:at+files]).hexdigest()})
return records
def verify(original, stripped):
before, after = segments(original), segments(stripped)
assert before == after, 'Removing DWARF changed a runtime ELF program segment'
return {'Kind': 'XfeElfOfflineDebugRemoval', 'Passed': True, 'ProgramSegmentsByteIdentical': True,
'OriginalBytes': Path(original).stat().st_size, 'ImageKernelBytes': Path(stripped).stat().st_size,
'ProgramSegments': after}
if __name__ == '__main__':
parser = argparse.ArgumentParser(); parser.add_argument('original'); parser.add_argument('stripped'); parser.add_argument('result')
args = parser.parse_args()
Path(args.result).write_text(json.dumps(verify(args.original, args.stripped), indent=2), encoding='utf-8')
"""Verify that removing offline DWARF leaves every runtime program segment byte-identical."""
import argparse
import hashlib
import json
from pathlib import Path
import struct
def segments(path):
data = Path(path).read_bytes()
assert data[:6] == b'\x7fELF\x02\x01', 'Expected little-endian ELF64'
offset = struct.unpack_from('<Q', data, 32)[0]
size, count = struct.unpack_from('<HH', data, 54)
assert size == 56 and 0 < count <= 32
records = []
for index in range(count):
kind, flags, at, virtual, physical, files, memory, alignment = struct.unpack_from('<IIQQQQQQ', data, offset + index*size)
assert at + files <= len(data)
records.append({'Type': kind, 'Flags': flags, 'Virtual': virtual, 'Physical': physical,
'FileBytes': files, 'MemoryBytes': memory, 'Alignment': alignment,
'Sha256': hashlib.sha256(data[at:at+files]).hexdigest()})
return records
def verify(original, stripped):
before, after = segments(original), segments(stripped)
assert before == after, 'Removing DWARF changed a runtime ELF program segment'
return {'Kind': 'XfeElfOfflineDebugRemoval', 'Passed': True, 'ProgramSegmentsByteIdentical': True,
'OriginalBytes': Path(original).stat().st_size, 'ImageKernelBytes': Path(stripped).stat().st_size,
'ProgramSegments': after}
if __name__ == '__main__':
parser = argparse.ArgumentParser(); parser.add_argument('original'); parser.add_argument('stripped'); parser.add_argument('result')
args = parser.parse_args()
Path(args.result).write_text(json.dumps(verify(args.original, args.stripped), indent=2), encoding='utf-8')