264 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # Program:
 | |
| #    Copy necessary shared libraries from ToolChain to rootfs automatically
 | |
| # History:
 | |
| # 2016/11/11      Wayne Lin Modified for rootfs path
 | |
| # 2014/01/23      Lincy Lin First release
 | |
| 
 | |
| MY_ROOTFS_PATH=$1
 | |
| 
 | |
| copylinkfile()
 | |
| {
 | |
| 	# use readlink command to get the link path
 | |
| 	source_releative_path=""
 | |
| 	link_source=$(readlink -f $1)
 | |
| 	dest_dirname="$2"
 | |
| 	#echo link_source $link_source dest_dirname $dest_dirname
 | |
| 	if [ ! -z "`echo $link_source | grep "/sysroot/usr/lib"`" ]; then
 | |
| 		list=`echo $link_source | awk -F'/' '{for(i=NF;i>0;i--) { if ($i=="sysroot")  {for (n=i+1; n<=NF; n++) {print $n;} break;}}}'`
 | |
| 	else
 | |
| 		if [ ! -z "`echo $link_source | grep "/output/usr/lib"`" ]; then
 | |
| 			list=`echo $link_source | awk -F'/' '{for(i=NF;i>0;i--) { if ($i=="output")  {for (n=i+1; n<=NF; n++) {print $n;} break;}}}'`
 | |
| 		elif [ ! -z "`echo $link_source | grep "/lib/output"`" ]; then
 | |
| 			if [ ! -z $dest_dirname ]; then
 | |
| 				list=`echo $link_source | awk -v dest_dirname="$dest_dirname" -F'/' '{for(i=NF;i>0;i--) { if ($i=="lib")  {print dest_dirname ;for (n=i+2; n<=NF; n++) {print $n;} break;}}}'`
 | |
| 			else
 | |
| 				list=`echo $link_source | awk -F'/' '{for(i=NF;i>0;i--) { if ($i=="lib")  {print $i;for (n=i+2; n<=NF; n++) {print $n;} break;}}}'`
 | |
| 			fi
 | |
| 		else
 | |
| 			list=`echo $link_source | awk -F'/' '{for(i=NF;i>0;i--) { if ($i=="lib")  {for (n=i; n<=NF; n++) {print $n;} break;}}}'`
 | |
| 		fi
 | |
| 	fi
 | |
| 	#echo $list
 | |
| 	for n in $list; do source_releative_path="$source_releative_path/$n"; done
 | |
| 	#echo source_releative_path $source_releative_path
 | |
| 	destination=${MY_ROOTFS_PATH}/$source_releative_path
 | |
| 	#echo destination $destination
 | |
| 	if [ -f "$link_source" ] && [ ! -f "$destination" ]; then
 | |
| 		cp -af $link_source $destination
 | |
| 		copysoReturnList="$copysoReturnList $destination"
 | |
| 	fi
 | |
| 	# check if source file modify time is newer than destination file
 | |
| 	if [ -f "$link_source" ] && [ -f "${destination}" ] && [ -z "$issysrootfile" ]; then
 | |
| 		smodifytime=$(stat -c "%Y" $link_source)
 | |
| 		dmodifytime=$(stat -c "%Y" $destination)
 | |
| 		echo smodifytime $smodifytime $link_source
 | |
| 		echo dmodifytime $dmodifytime $destination
 | |
| 		if [ $smodifytime -gt $dmodifytime ]; then
 | |
| 			cp -af $link_source $destination
 | |
| 			copysoReturnList="$copysoReturnList $destination"
 | |
| 		fi
 | |
| 	fi
 | |
| 	#echo "copy $link_source to $destination"
 | |
| 	ReturnValue=$link_source
 | |
| }
 | |
| 
 | |
| copyso()
 | |
| {
 | |
| 	# use awk to get the *.so path
 | |
| 	if [ "$2" != "necessary" ] ; then
 | |
| 		#filelist=$(${LDD} "$1" | awk '{print $1}' | grep 'so')
 | |
| 		filelist="$(readelf -l $1 | grep "Requesting program interpreter" | awk -F'Requesting program interpreter: ' '{print $NF}' | sed 's/\[//g' | sed 's/\]//g') \
 | |
| 			$(readelf -d $1 | grep "(NEEDED)" | awk -F'[' '{print $NF}' | awk -F']' '{print $1}' | sed 's/\[//g' | sed 's/\]//g')"
 | |
| 	else
 | |
| 		filelist=$1
 | |
| 	fi
 | |
| 	#copysoReturnList=""
 | |
| 	for filename in $filelist
 | |
| 	do
 | |
| 	  	#echo filename = $filename
 | |
| 		# sysroot lib
 | |
| 		if [ -f "${SYSROOT_PATH}/lib/${filename}" ] ; then
 | |
| 			sourcefile=${SYSROOT_PATH}/lib/${filename}
 | |
| 			dstfile=${MY_ROOTFS_PATH}/lib/${filename}
 | |
| 			issysrootfile="1"
 | |
| 		else
 | |
| 			# sysroot usr/lib
 | |
| 			if [ -f "${SYSROOT_PATH}/usr/lib/${filename}" ] ; then
 | |
| 				sourcefile=${SYSROOT_PATH}/usr/lib/${filename}
 | |
| 				dstfile=${MY_ROOTFS_PATH}/usr/lib/${filename}
 | |
| 				dstdir=/usr/lib
 | |
| 				issysrootfile="1"
 | |
| 			elif [ -f "${NVT_HDAL_DIR}/output/${filename}" ] ; then
 | |
| 				sourcefile=${NVT_HDAL_DIR}/output/${filename}
 | |
| 				dstfile=${MY_ROOTFS_PATH}/usr/lib/${filename}
 | |
| 				dstdir=/usr/lib
 | |
| 				issysrootfile=""
 | |
| 			elif [ -f "${NVT_HDAL_DIR}/vendor/output/${filename}" ] ; then
 | |
| 				sourcefile=${NVT_HDAL_DIR}/vendor/output/${filename}
 | |
| 				dstfile=${MY_ROOTFS_PATH}/usr/lib/${filename}
 | |
| 				dstdir=/usr/lib
 | |
| 				issysrootfile=""
 | |
| 			elif [ -f "${NVT_VOS_DIR}/output/${filename}" ] ; then
 | |
| 				sourcefile=${NVT_VOS_DIR}/output/${filename}
 | |
| 				dstfile=${MY_ROOTFS_PATH}/usr/lib/${filename}
 | |
| 				dstdir=/usr/lib
 | |
| 				issysrootfile=""
 | |
| 			elif [ -f "${LIBRARY_DIR}/output/${filename}" ] ; then
 | |
| 				sourcefile=${LIBRARY_DIR}/output/${filename}
 | |
| 				dstfile=${MY_ROOTFS_PATH}/usr/lib/${filename}
 | |
| 				dstdir=/usr/lib
 | |
| 				issysrootfile=""
 | |
| 			else
 | |
| 				sourcefile=${LIBRARY_DIR}/output/${filename}
 | |
| 				dstfile=${MY_ROOTFS_PATH}/usr/lib/${filename}
 | |
| 				dstdir=/usr/lib
 | |
| 				issysrootfile=""
 | |
| 			fi
 | |
| 		fi
 | |
| 
 | |
| 		#echo sourcefile $sourcefile
 | |
| 		#echo dstfile $dstfile dstdir $dstdir $issysrootfile
 | |
| 		# if file is a link file , need to copy the original file also
 | |
| 		if [ -L "$sourcefile" ] ; then
 | |
| 			copylinkfile $sourcefile "$dstdir"
 | |
| 			if [ -L $ReturnValue ] ; then
 | |
| 				copylinkfile $ReturnValue $issysrootfile
 | |
| 			fi
 | |
| 		fi
 | |
| 
 | |
| 		#dstfile=${MY_ROOTFS_PATH}/lib/${filename}
 | |
| 		if [ -f "$sourcefile" ] && [ ! -f "${dstfile}" ]; then
 | |
| 			cp -avf $sourcefile $dstfile
 | |
| 			copysoReturnList="$copysoReturnList $dstfile"
 | |
| 		fi
 | |
| 		# check if source file modify time is newer than destination file
 | |
| 
 | |
| 		if [ -z "$issysrootfile" ] && [ -f "$sourcefile" ] && [ -f "${dstfile}" ]; then
 | |
| 			smodifytime=$(stat -c "%Y" $sourcefile)
 | |
| 			dmodifytime=$(stat -c "%Y" $dstfile)
 | |
| 			#echo smodifytime $smodifytime $sourcefile
 | |
| 			#echo dmodifytime $dmodifytime $dstfile
 | |
| 			if [ $smodifytime -gt $dmodifytime ]; then
 | |
| 				cp -avf $sourcefile $dstfile
 | |
| 				copysoReturnList="$copysoReturnList $dstfile"
 | |
| 			fi
 | |
| 		fi
 | |
| 	done
 | |
| 	#echo copysoReturnList=${copysoReturnList}
 | |
| }
 | |
| 
 | |
| copyallso()
 | |
| {
 | |
| 	# 1. Search bin use shared library  - layer1
 | |
| 	#search bin file except link file
 | |
| 	#echo $1
 | |
| 	searchpath=$1
 | |
| 	if [ -e "${MY_ROOTFS_PATH}/$searchpath" ] ; then
 | |
| 		echo $searchpath
 | |
| 		binlist=$(ls ${MY_ROOTFS_PATH}/$searchpath)
 | |
| 		for binname in $binlist
 | |
| 		do
 | |
| 			binPath=${MY_ROOTFS_PATH}/$searchpath/${binname}
 | |
| 			if [ ! -L "$binPath" ]; then
 | |
| 				#echo binPath=$binPath
 | |
| 				bininfo=$(file $binPath | awk '{print $2}')
 | |
| 				#echo bininfo=$bininfo
 | |
| 				if [ "$bininfo" = "ELF" ] ; then
 | |
| 					#echo ${binPath}
 | |
| 					copyso $binPath
 | |
| 				fi
 | |
| 			fi
 | |
| 		done
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| searchNewAddedlib()
 | |
| {
 | |
| 	#echo liblistAdd=${liblistAdd}
 | |
| 	liblist=${liblistAdd}
 | |
| 	liblistAdd=""
 | |
| 	for libPath in $liblist
 | |
| 	do
 | |
| 		copysoReturnList=""
 | |
| 		copyso $libPath
 | |
| 		liblistAdd="$liblistAdd $copysoReturnList"
 | |
| 	done
 | |
| }
 | |
| 
 | |
| copylibusedso()
 | |
| {
 | |
| 	#search lib use shared library  - layer2
 | |
| 	#search lib file except link file
 | |
| 
 | |
| 	#sysroot lib
 | |
| 	liblist=$(ls ${MY_ROOTFS_PATH}/lib)
 | |
| 	#test
 | |
| 	#liblist="libnvtauth.so "
 | |
| 	liblistAdd=""
 | |
| 	for libname in $liblist
 | |
| 	do
 | |
| 		#echo libname=${libname}
 | |
| 		libPath=${MY_ROOTFS_PATH}/lib/${libname}
 | |
| 		if [ ! -L "$libPath" ] && [ -f "$libPath" ] ; then
 | |
| 			libinfo=$(file $libPath | awk '{print $2}')
 | |
| 			#echo bininfo=$bininfo
 | |
| 			if [ "$libinfo" = "ELF" ] ; then
 | |
| 	    			#echo libPath=${libPath}
 | |
| 	    			copysoReturnList=""
 | |
| 				copyso $libPath
 | |
| 				liblistAdd="$liblistAdd $copysoReturnList"
 | |
| 			fi
 | |
| 		fi
 | |
| 	done
 | |
| 
 | |
| 	liblist=""
 | |
| 	#sysroot usr/lib
 | |
| 	liblist=$(ls ${MY_ROOTFS_PATH}/usr/lib)
 | |
| 	for libname in $liblist
 | |
| 	do
 | |
| 		#echo libname=${libname}
 | |
| 		libPath=${MY_ROOTFS_PATH}/usr/lib/${libname}
 | |
| 		if [ ! -L "$libPath" ] && [ -f "$libPath" ] ; then
 | |
| 			libinfo=$(file $libPath | awk '{print $2}')
 | |
| 			#echo bininfo=$bininfo
 | |
| 			if [ "$libinfo" = "ELF" ] ; then
 | |
| 	    			#echo libPath=${libPath}
 | |
| 	    			copysoReturnList=""
 | |
| 				copyso $libPath
 | |
| 				liblistAdd="$liblistAdd $copysoReturnList"
 | |
| 			fi
 | |
| 		fi
 | |
| 	done
 | |
| 
 | |
| 	# search for new added library
 | |
| 	while [ ! -z "$liblistAdd" ]; do
 | |
| 		searchNewAddedlib
 | |
| 	done
 | |
| }
 | |
| 
 | |
| copyNecessaryso()
 | |
| {
 | |
| 	#search lib use shared library  - layer2
 | |
| 	#search lib file except link file
 | |
| 	uclibc=$(echo ${CROSS_COMPILE} | grep 'uclibc')
 | |
| 	#echo glibc = $glibc
 | |
| 	if [ ! -z "$uclibc" ]; then
 | |
| 		liblist=$(cat ${LIBRARY_DIR}/necessary/uclibc/liblist)
 | |
| 	else
 | |
| 		liblist=$(cat ${LIBRARY_DIR}/necessary/glibc/liblist)
 | |
| 	fi
 | |
| 	#echo $liblist
 | |
| 	for libname in $liblist
 | |
| 	do
 | |
| 		copyso $libname necessary
 | |
| 	done
 | |
| }
 | |
| 
 | |
| # ld shared library is always need for dynamic link
 | |
| copy_ld_so()
 | |
| {
 | |
| 	cp -avu ${SYSROOT_PATH}/lib/ld* ${MY_ROOTFS_PATH}/lib/
 | |
| }
 | |
| 
 | |
| echo -e "copyso search bin path (\e[1;33m$1\e[0m) ==> " $@ | awk -F"$1 " '{print $1$NF}'
 | |
| while [ "$(($#-1))" -gt 0 ]; do
 | |
|         copyallso $2
 | |
|         shift
 | |
| done
 | |
| echo -e "\e[1;33m\rlib\e[0m"
 | |
| copylibusedso
 | |
| echo -e "\e[1;33m\rnecessary\e[0m"
 | |
| copyNecessaryso
 | |
| copy_ld_so
 | 
