| # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import subprocess |
| |
| from whitelist import is_whitelisted |
| |
| def check_debug_info(dso_path, readelf_content): |
| """check whether debug info section exists in the elf file. |
| |
| Args: |
| readelf: debug info dumped by command readelf |
| |
| Returns: |
| True if debug info section exists, otherwise False. |
| """ |
| |
| # Return True if it is whitelisted |
| if is_whitelisted('exist_debug_info', dso_path): |
| return True |
| |
| for l in readelf_content: |
| if 'debug_info' in l: |
| return True |
| return False |
| |
| def check_producer(dso_path, readelf_content): |
| """check whether DW_AT_producer exists in each compile unit. |
| |
| Args: |
| readelf: debug info dumped by command readelf |
| |
| Returns: |
| True if DW_AT_producer exists in each compile unit, otherwise False. |
| Notice: If no compile unit in DSO, also return True. |
| """ |
| |
| # Return True if it is whitelisted |
| if is_whitelisted('exist_producer', dso_path): |
| return True |
| |
| # Indicate if there is a producer under each cu |
| cur_producer = False |
| |
| first_cu = True |
| producer_exist = True |
| |
| for l in readelf_content: |
| if 'DW_TAG_compile_unit' in l: |
| if not first_cu and not cur_producer: |
| producer_exist = False |
| break |
| first_cu = False |
| cur_producer = False |
| elif 'DW_AT_producer' in l: |
| cur_producer = True |
| |
| # Check whether last producer of compile unit exists in the elf, |
| # also return True if no cu in the DSO. |
| if not first_cu and not cur_producer: |
| producer_exist = False |
| |
| return producer_exist |
| |
| def check_exist_all(dso_path): |
| """check whether intended components exists in the given dso. |
| |
| Args: |
| dso_path: path to the dso |
| Return: |
| True if everything looks fine otherwise False. |
| """ |
| |
| readelf = subprocess.Popen(['readelf', '--debug-dump=info', |
| '--dwarf-depth=1', dso_path], |
| stdout=subprocess.PIPE, |
| stderr=open(os.devnull, 'w')) |
| readelf_content = list(readelf.stdout) |
| |
| exist_checks = [check_debug_info, check_producer] |
| |
| for e in exist_checks: |
| if not e(dso_path, readelf_content): |
| check_failed = e.__module__ + ': ' + e.__name__ |
| print('%s failed check: %s' % (dso_path, check_failed)) |
| return False |
| |
| return True |