You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.6 KiB
54 lines
1.6 KiB
# -*- 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
|