16888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien#!/usr/bin/env python 2ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# 3ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# Copyright (C) 2011-2012 The Android Open Source Project 4ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# 5ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# Licensed under the Apache License, Version 2.0 (the "License"); 6ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# you may not use this file except in compliance with the License. 7ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# You may obtain a copy of the License at 8ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# 9ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# http://www.apache.org/licenses/LICENSE-2.0 10ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# 11ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# Unless required by applicable law or agreed to in writing, software 12ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# distributed under the License is distributed on an "AS IS" BASIS, 13ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# See the License for the specific language governing permissions and 15ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# limitations under the License. 16ddf5661793de8fb4e16906b7f7822972fcb13c6dZonr Chang# 176888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien 18f290793bc65b8483332ac8b568962395c4a63927Zonr Changimport os 196888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chienimport sys 206888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien 211c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandlertry: 221c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler import hashlib 231c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler sha1 = hashlib.sha1 241c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandlerexcept ImportError, e: 251c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler import sha 261c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler sha1 = sha.sha 271c13147fd7d2294a0f34a569fe36660b6b056a91Daniel Sandler 286888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chiendef compute_sha1(h, path): 296888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien f = open(path, 'rb') 306888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien while True: 316888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien buf = f.read(1024) 326888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien h.update(buf) 336888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien if len(buf) < 1024: 346888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien break 356888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien f.close() 366888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien 37f290793bc65b8483332ac8b568962395c4a63927Zonr Chang"""The result is a list of pair of file path and its SHA-1 digest""" 386888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chiendef compute_sha1_list(path_list): 39f290793bc65b8483332ac8b568962395c4a63927Zonr Chang result = [] 406888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien for path in path_list: 41f290793bc65b8483332ac8b568962395c4a63927Zonr Chang h = sha1() 426888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien compute_sha1(h, path) 43f290793bc65b8483332ac8b568962395c4a63927Zonr Chang result.append((path, h.digest())) 44f290793bc65b8483332ac8b568962395c4a63927Zonr Chang return result 45f290793bc65b8483332ac8b568962395c4a63927Zonr Chang 46f290793bc65b8483332ac8b568962395c4a63927Zonr Chang"""For each path like /xxx/libfoo.so, generate a symbol named libfoo_so_SHA1""" 47f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef get_symbol_name(path): 48f290793bc65b8483332ac8b568962395c4a63927Zonr Chang return os.path.basename(path).replace('.', '_') + '_SHA1'; 49f290793bc65b8483332ac8b568962395c4a63927Zonr Chang 50f290793bc65b8483332ac8b568962395c4a63927Zonr Chang"""Print out header for assembly file.""" 51f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm_header(symbols): 52f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(""" 53f290793bc65b8483332ac8b568962395c4a63927Zonr Chang/*\ 54f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * The mid-2007 version of gcc that ships with Macs requires a\n\ 55f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * comma on the .section line, but the rest of the world thinks\n\ 56f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * that's a syntax error. It also wants globals to be explicitly\n\ 57f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * prefixed with \"_\" as opposed to modern gccs that do the\n\ 58f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * prefixing for you.\n\ 59f290793bc65b8483332ac8b568962395c4a63927Zonr Chang */\n\ 60f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""") 61f290793bc65b8483332ac8b568962395c4a63927Zonr Chang for sym in symbols: 62f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(""" 63f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#ifdef __APPLE_CC__ 64f290793bc65b8483332ac8b568962395c4a63927Zonr Chang.globl _%s\n\ 65f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#else\n\ 66f290793bc65b8483332ac8b568962395c4a63927Zonr Chang.globl %s\n\ 67f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#endif\ 68f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""" % (sym, sym)) 69f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(""" 70f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#ifdef __APPLE_CC__ 71f290793bc65b8483332ac8b568962395c4a63927Zonr Chang .section .rodata,\n\ 72f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#else\n\ 73f290793bc65b8483332ac8b568962395c4a63927Zonr Chang .section .rodata\n\ 74f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#endif\ 75f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""" ) 76f290793bc65b8483332ac8b568962395c4a63927Zonr Chang 77f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm_data(data, size): 78f290793bc65b8483332ac8b568962395c4a63927Zonr Chang col = 0 79f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(".align 8\n") 80f290793bc65b8483332ac8b568962395c4a63927Zonr Chang for i in xrange(size): 81f290793bc65b8483332ac8b568962395c4a63927Zonr Chang c = data[i] 82f290793bc65b8483332ac8b568962395c4a63927Zonr Chang if col == 0: 83f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(".byte ") 84f290793bc65b8483332ac8b568962395c4a63927Zonr Chang elif col % 4 == 0: 85f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(", ") 86f290793bc65b8483332ac8b568962395c4a63927Zonr Chang else: 87f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(",") 88f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write("0x%02x" % ord(c)) 89f290793bc65b8483332ac8b568962395c4a63927Zonr Chang col += 1 90f290793bc65b8483332ac8b568962395c4a63927Zonr Chang if col == 8: 91f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write("\n") 92f290793bc65b8483332ac8b568962395c4a63927Zonr Chang col = 0 93f290793bc65b8483332ac8b568962395c4a63927Zonr Chang if col != 0: 94f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write("\n") 95f290793bc65b8483332ac8b568962395c4a63927Zonr Chang 96f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm_symbol_data(sym, h): 97f290793bc65b8483332ac8b568962395c4a63927Zonr Chang sys.stdout.write(""" 98f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#ifdef __APPLE_CC__ 99f290793bc65b8483332ac8b568962395c4a63927Zonr Chang_%s:\n\ 100f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#else\n\ 101f290793bc65b8483332ac8b568962395c4a63927Zonr Chang%s:\n\ 102f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#endif\n\ 103f290793bc65b8483332ac8b568962395c4a63927Zonr Chang""" % (sym, sym)) 104f290793bc65b8483332ac8b568962395c4a63927Zonr Chang print_asm_data(h, 20) 105f290793bc65b8483332ac8b568962395c4a63927Zonr Chang 106f290793bc65b8483332ac8b568962395c4a63927Zonr Changdef print_asm(x): 107f290793bc65b8483332ac8b568962395c4a63927Zonr Chang symbols = [get_symbol_name(item[0]) for item in x] 108f290793bc65b8483332ac8b568962395c4a63927Zonr Chang print_asm_header(symbols) 109f290793bc65b8483332ac8b568962395c4a63927Zonr Chang for (symbol, y) in zip(symbols, x): 110f290793bc65b8483332ac8b568962395c4a63927Zonr Chang print_asm_symbol_data(symbol, y[1]) 1116888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien 1126888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chiendef main(): 1136888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien if len(sys.argv) < 2: 1146888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien print 'USAGE:', sys.argv[0], '[OUTPUT] [INPUTs]' 1156888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien sys.exit(1) 1166888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien 117f290793bc65b8483332ac8b568962395c4a63927Zonr Chang result = compute_sha1_list(sys.argv[1:]) 118f290793bc65b8483332ac8b568962395c4a63927Zonr Chang print_asm(result) 1196888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien 1206888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chienif __name__ == '__main__': 1216888aaefad5a8dfc56d76187d8ff2e3311783e27Logan Chien main() 122