1+ #! /bin/bash
2+ progname=" ${0##*/ } "
3+ progname=" ${progname% .sh} "
4+
5+ # usage: check_elf_alignment.sh [path to *.so files|path to *.apk]
6+
7+ cleanup_trap () {
8+ if [ -n " ${tmp} " -a -d " ${tmp} " ]; then
9+ rm -rf ${tmp}
10+ fi
11+ exit $1
12+ }
13+
14+ usage () {
15+ echo " Host side script to check the ELF alignment of shared libraries."
16+ echo " Shared libraries are reported ALIGNED when their ELF regions are"
17+ echo " 16 KB or 64 KB aligned. Otherwise they are reported as UNALIGNED."
18+ echo
19+ echo " Usage: ${progname} [input-path|input-APK|input-APEX]"
20+ }
21+
22+ if [ ${# } -ne 1 ]; then
23+ usage
24+ exit
25+ fi
26+
27+ case ${1} in
28+ --help | -h | -\? )
29+ usage
30+ exit
31+ ;;
32+
33+ * )
34+ dir=" ${1} "
35+ ;;
36+ esac
37+
38+ if ! [ -f " ${dir} " -o -d " ${dir} " ]; then
39+ echo " Invalid file: ${dir} " >&2
40+ exit 1
41+ fi
42+
43+ if [[ " ${dir} " == * .apk ]]; then
44+ trap ' cleanup_trap' EXIT
45+
46+ echo
47+ echo " Recursively analyzing $dir "
48+ echo
49+
50+ if { zipalign --help 2>&1 | grep -q " \-P <pagesize_kb>" ; }; then
51+ echo " === APK zip-alignment ==="
52+ zipalign -v -c -P 16 4 " ${dir} " | egrep ' lib/arm64-v8a|lib/x86_64|Verification'
53+ echo " ========================="
54+ else
55+ echo " NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher."
56+ echo " You can install the latest build-tools by running the below command"
57+ echo " and updating your \$ PATH:"
58+ echo
59+ echo " sdkmanager \" build-tools;35.0.0-rc3\" "
60+ fi
61+
62+ dir_filename=$( basename " ${dir} " )
63+ tmp=$( mktemp -d -t " ${dir_filename% .apk} _out_XXXXX" )
64+ unzip " ${dir} " lib/* -d " ${tmp} " > /dev/null 2>&1
65+ dir=" ${tmp} "
66+ fi
67+
68+ if [[ " ${dir} " == * .apex ]]; then
69+ trap ' cleanup_trap' EXIT
70+
71+ echo
72+ echo " Recursively analyzing $dir "
73+ echo
74+
75+ dir_filename=$( basename " ${dir} " )
76+ tmp=$( mktemp -d -t " ${dir_filename% .apex} _out_XXXXX" )
77+ deapexer extract " ${dir} " " ${tmp} " || { echo " Failed to deapex." && exit 1; }
78+ dir=" ${tmp} "
79+ fi
80+
81+ unaligned_libs=()
82+
83+ matches=" $( find " ${dir} " -type f) "
84+ IFS=$' \n '
85+ for match in $matches ; do
86+ # We could recursively call this script or rewrite it to though.
87+ [[ " ${match} " == * " .apk" ]] && echo " WARNING: doesn't recursively inspect .apk file: ${match} "
88+ [[ " ${match} " == * " .apex" ]] && echo " WARNING: doesn't recursively inspect .apex file: ${match} "
89+
90+ [[ $( file " ${match} " ) == * " ELF" * ]] || continue
91+
92+ res=" $( objdump -p " ${match} " | grep LOAD | awk ' { print $NF }' | head -1) "
93+ if [[ $res =~ 2\*\* (1[4-9]| [2-9][0-9]| [1-9][0-9]{2,}) ]]; then
94+ echo " ${match} : ALIGNED"
95+ else
96+ echo " ${match} : UNALIGNED ($res )"
97+ unaligned_libs+=(" ${match} " )
98+ fi
99+ done
100+
101+ if [ ${# unaligned_libs[@]} -gt 0 ]; then
102+ echo " Found ${# unaligned_libs[@]} unaligned libs (only arm64-v8a/x86_64 libs need to be aligned)."
103+ exit 1
104+ else
105+ echo " ALIGNED"
106+ fi
0 commit comments