# -*- coding: utf-8 -*- # 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. """check whether chrome was built with identical code folding.""" from __future__ import print_function import os import re import subprocess def check_identical_code_folding(dso_path): """check whether chrome was built with identical code folding. Args: dso_path: path to the dso. Returns: False if the dso is chrome and it was not built with icf, True otherwise. """ if not dso_path.endswith('/chrome.debug'): return True # Run 'nm' on the chrome binary and read the output. nm = subprocess.Popen(['nm', dso_path], stdout=subprocess.PIPE, stderr=open(os.devnull, 'w'), encoding='utf-8') nm_output, _ = nm.communicate() # Search for addresses of text symbols. text_addresses = re.findall('^[0-9a-f]+[ ]+[tT] ', nm_output, re.MULTILINE) # Calculate number of text symbols in chrome binary. num_text_addresses = len(text_addresses) # Calculate number of unique text symbols in chrome binary. num_unique_text_addresses = len(set(text_addresses)) # Check that the number of duplicate symbols is at least 10,000. # - https://crbug.com/813272#c18 if num_text_addresses - num_unique_text_addresses >= 10000: return True print('%s was not built with ICF' % dso_path) print(' num_text_addresses = %d' % num_text_addresses) print(' num_unique_text_addresses = %d' % num_unique_text_addresses) return False