#!/usr/bin/env python
#
# Copyright (C) 2011-2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
import sys
try:
import hashlib
sha1 = hashlib.sha1
except ImportError, e:
import sha
sha1 = sha.sha
def compute_sha1(h, path):
f = open(path, 'rb')
while True:
buf = f.read(1024)
h.update(buf)
if len(buf) < 1024:
break
f.close()
"""The result is a list of pair of file path and its SHA-1 digest"""
def compute_sha1_list(path_list):
result = []
for path in path_list:
h = sha1()
compute_sha1(h, path)
result.append((path, h.digest()))
return result
"""For each path like /xxx/libfoo.so, generate a symbol named libfoo_so_SHA1"""
def get_symbol_name(path):
return os.path.basename(path).replace('.', '_') + '_SHA1';
"""Print out header for assembly file."""
def print_asm_header(symbols):
sys.stdout.write("""
/*\
* The mid-2007 version of gcc that ships with Macs requires a\n\
* comma on the .section line, but the rest of the world thinks\n\
* that's a syntax error. It also wants globals to be explicitly\n\
* prefixed with \"_\" as opposed to modern gccs that do the\n\
* prefixing for you.\n\
*/\n\
""")
for sym in symbols:
sys.stdout.write("""
#ifdef __APPLE_CC__
.globl _%s\n\
#else\n\
.globl %s\n\
#endif\
""" % (sym, sym))
sys.stdout.write("""
#ifdef __APPLE_CC__
.section .rodata,\n\
#else\n\
.section .rodata\n\
#endif\
""" )
def print_asm_data(data, size):
col = 0
sys.stdout.write(".align 8\n")
for i in xrange(size):
c = data[i]
if col == 0:
sys.stdout.write(".byte ")
elif col % 4 == 0:
sys.stdout.write(", ")
else:
sys.stdout.write(",")
sys.stdout.write("0x%02x" % ord(c))
col += 1
if col == 8:
sys.stdout.write("\n")
col = 0
if col != 0:
sys.stdout.write("\n")
def print_asm_symbol_data(sym, h):
sys.stdout.write("""
#ifdef __APPLE_CC__
_%s:\n\
#else\n\
%s:\n\
#endif\n\
""" % (sym, sym))
print_asm_data(h, 20)
def print_asm(x):
symbols = [get_symbol_name(item[0]) for item in x]
print_asm_header(symbols)
for (symbol, y) in zip(symbols, x):
print_asm_symbol_data(symbol, y[1])
def main():
if len(sys.argv) < 2:
print 'USAGE:', sys.argv[0], '[OUTPUT] [INPUTs]'
sys.exit(1)
result = compute_sha1_list(sys.argv[1:])
print_asm(result)
if __name__ == '__main__':
main()