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+ RED=" \e[31m"
82+ GREEN=" \e[32m"
83+ ENDCOLOR=" \e[0m"
84+
85+ unaligned_libs=()
86+
87+ echo
88+ echo " === ELF alignment ==="
89+
90+ matches=" $( find " ${dir} " -type f) "
91+ IFS=$' \n '
92+ for match in $matches ; do
93+ # We could recursively call this script or rewrite it to though.
94+ [[ " ${match} " == * " .apk" ]] && echo " WARNING: doesn't recursively inspect .apk file: ${match} "
95+ [[ " ${match} " == * " .apex" ]] && echo " WARNING: doesn't recursively inspect .apex file: ${match} "
96+
97+ [[ $( file " ${match} " ) == * " ELF" * ]] || continue
98+
99+ res=" $( objdump -p " ${match} " | grep LOAD | awk ' { print $NF }' | head -1) "
100+ if [[ $res =~ 2\*\* (1[4-9]| [2-9][0-9]| [1-9][0-9]{2,}) ]]; then
101+ echo -e " ${match} : ${GREEN} ALIGNED${ENDCOLOR} ($res )"
102+ else
103+ echo -e " ${match} : ${RED} UNALIGNED${ENDCOLOR} ($res )"
104+ unaligned_libs+=(" ${match} " )
105+ fi
106+ done
107+
108+ if [ ${# unaligned_libs[@]} -gt 0 ]; then
109+ echo -e " ${RED} Found ${# unaligned_libs[@]} unaligned libs (only arm64-v8a/x86_64 libs need to be aligned).${ENDCOLOR} "
110+ elif [ -n " ${dir_filename} " ]; then
111+ echo -e " ELF Verification Successful"
112+ fi
113+ echo " ====================="
0 commit comments