1#!/bin/bash 2set -e -o pipefail 3 4# This script copies a locally built GLIBC to a remote device. 5# 6# Usage: push_glibc <target>... 7# 8# This script works with 64-bit (amd64 or arm64) ChromeOS targets. 9# It copies both 32-bit and 64-bit glibc loaders onto the device. 10# This allows loading and running both 32-bit and 64-bit binaries 11# on the same device. 12 13for target in "$@" 14do 15 echo -n "pushing glibc to ${target} ... " 16 case "$(ssh -i ${HOME}/.ssh/testing_rsa ${target} uname -m)" in 17 x86_64) 18 glibc="/usr/x86_64-cros-linux-gnu/lib64" 19 loader="ld-linux-x86-64.so.2" 20 glibc32="/usr/i686-pc-linux-gnu/lib" 21 loader32="ld-linux.so.2" 22 ;; 23 aarch64) 24 glibc="/usr/aarch64-cros-linux-gnu/lib64" 25 loader="ld-linux-aarch64.so.1" 26 glibc32="/usr/armv7a-cros-linux-gnueabihf/lib" 27 loader32="ld-linux-armhf.so.3" 28 ;; 29 *) 30 echo "unknown arch" 31 continue 32 ;; 33 esac 34 35 target_sh ${target} "rm -rf /tmp/glibc" 36 target_sh ${target} "mkdir -p /tmp/glibc" 37 target_cp "${glibc}" ${target}:/tmp/glibc 38 39 target_sh ${target} "rm -rf /tmp/glibc32" 40 target_sh ${target} "mkdir -p /tmp/glibc32" 41 target_cp "${glibc32}" ${target}:/tmp/glibc32 42 43 echo "#!/bin/bash" > /tmp/ld.so 44 echo "LD_LIBRARY_PATH=/tmp/glibc/${glibc##*/} exec /tmp/glibc/${glibc##*/}/${loader} \"\$@\"" >> /tmp/ld.so 45 chmod +x /tmp/ld.so 46 target_cp /tmp/ld.so ${target}:/tmp/glibc 47 rm /tmp/ld.so 48 49 echo "#!/bin/bash" > /tmp/ld.so 50 echo "LD_LIBRARY_PATH=/tmp/glibc32/${glibc32##*/} exec /tmp/glibc32/${glibc32##*/}/${loader32} \"\$@\"" >> /tmp/ld.so 51 chmod +x /tmp/ld.so 52 target_cp /tmp/ld.so ${target}:/tmp/glibc32 53 rm /tmp/ld.so 54 55 echo "done" 56done 57