在Android中,经过prelink过的动态库最后4字节为“PRE ”(注意“PRE”后面有一个空格),在”PRE“前面四个字节就是prelink-map文件中指定的load地址。
下面是一段判断一个动态库文件是否为prelink过的shell脚本,输入参数是文件名:
#param 1 file name
function check_prelink()
{
local fname=$1
local size=`ls -l $fname | awk '{print $5}'`
local prelink=`hexdump -C -s $(($size-4)) $fname | head -n 1 | sed 's/|//g' | awk '{print $6}'`
if [ "$prelink" = PRE ];then
local str=`hexdump -C -s $(($size-8)) $1`
str=`echo $str | sed 's/[0-9a-z]*\b //' | sed 's/|.*//g'`
local load_start=`echo $str | awk '{print $4 $3 $2 $1}'`
echo "$1 load start is 0x$load_start"
fi
}
用法:check_prelink $1