1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker# 3*6777b538SAndroid Build Coastguard Worker# Copyright 2016 The Chromium Authors 4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker"""Archive all source files that are references in binary debug info. 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard WorkerInvoked by libfuzzer buildbots. Executes dwarfdump to parse debug info. 10*6777b538SAndroid Build Coastguard Worker""" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workerfrom __future__ import print_function 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workerimport argparse 15*6777b538SAndroid Build Coastguard Workerimport os 16*6777b538SAndroid Build Coastguard Workerimport re 17*6777b538SAndroid Build Coastguard Workerimport subprocess 18*6777b538SAndroid Build Coastguard Workerimport zipfile 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Workercompile_unit_re = re.compile('.*DW_TAG_compile_unit.*') 21*6777b538SAndroid Build Coastguard Workerat_name_re = re.compile('.*DW_AT_name.*"(.*)".*') 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Workerdef main(): 25*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser(description="Zip binary sources.") 26*6777b538SAndroid Build Coastguard Worker parser.add_argument('--binary', required=True, 27*6777b538SAndroid Build Coastguard Worker help='binary file to read') 28*6777b538SAndroid Build Coastguard Worker parser.add_argument('--workdir', required=True, 29*6777b538SAndroid Build Coastguard Worker help='working directory to use to resolve relative paths') 30*6777b538SAndroid Build Coastguard Worker parser.add_argument('--srcdir', required=True, 31*6777b538SAndroid Build Coastguard Worker help='sources root directory to calculate zip entry names') 32*6777b538SAndroid Build Coastguard Worker parser.add_argument('--output', required=True, 33*6777b538SAndroid Build Coastguard Worker help='output zip file name') 34*6777b538SAndroid Build Coastguard Worker parser.add_argument('--dwarfdump', required=False, 35*6777b538SAndroid Build Coastguard Worker default='dwarfdump', help='path to dwarfdump utility') 36*6777b538SAndroid Build Coastguard Worker args = parser.parse_args() 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker # Dump .debug_info section. 39*6777b538SAndroid Build Coastguard Worker out = subprocess.check_output( 40*6777b538SAndroid Build Coastguard Worker [args.dwarfdump, '-i', args.binary]) 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker looking_for_unit = True 43*6777b538SAndroid Build Coastguard Worker compile_units = set() 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker # Look for DW_AT_name within DW_TAG_compile_unit 46*6777b538SAndroid Build Coastguard Worker for line in out.splitlines(): 47*6777b538SAndroid Build Coastguard Worker if looking_for_unit and compile_unit_re.match(line): 48*6777b538SAndroid Build Coastguard Worker looking_for_unit = False 49*6777b538SAndroid Build Coastguard Worker elif not looking_for_unit: 50*6777b538SAndroid Build Coastguard Worker match = at_name_re.match(line) 51*6777b538SAndroid Build Coastguard Worker if match: 52*6777b538SAndroid Build Coastguard Worker compile_units.add(match.group(1)) 53*6777b538SAndroid Build Coastguard Worker looking_for_unit = True 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker # Zip sources. 56*6777b538SAndroid Build Coastguard Worker with zipfile.ZipFile(args.output, 'w') as z: 57*6777b538SAndroid Build Coastguard Worker for compile_unit in sorted(compile_units): 58*6777b538SAndroid Build Coastguard Worker src_file = os.path.abspath(os.path.join(args.workdir, compile_unit)) 59*6777b538SAndroid Build Coastguard Worker print(src_file) 60*6777b538SAndroid Build Coastguard Worker z.write(src_file, os.path.relpath(src_file, args.srcdir)) 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 64*6777b538SAndroid Build Coastguard Worker main() 65