12 echo " $0 -r <patchingfile.ko> <readelf> <objdump>"
13 echo " $0 -g <patchingfile.ko> <readelf> <objdump>"
14 echo " $0 -p <patchingfile.ko> <outputfile.ko> <patchdata>"
20 if [ $DEBUG_OFF -eq 0 ];then
33 #toolchain=~/Work/tools/u1_slp/toolchai
34 #cross=${toolchain}/bin/arm-none-linux-gnueabi-
35 #cross=arm-none-linux-gnueabi-
39 debug "patchfile <$patch_file>"
41 if [ -f "$patch_file" ]; then
43 if [ "$opt" = "-p" ];then
44 #set version (use only on target)
45 debug "Set version (patching) to <$patch_file>"
46 if [ -f "$data_file" ];then
47 cp -f "${patch_file}" "${output_file}"
50 pos=$((`cat $patch_file.addr | awk '{print \$1}'`))
51 abs_len=$((`cat $patch_file.addr | awk '{print \$2}'`))
53 key_before=`dd if="$patch_file" bs=1 skip=${pos}c count=${abs_len}c 2>/dev/null`
54 debug "key_before<$key_before>"
55 key_before_tail=${key_before#*\ }
56 debug "key_before_tail<$key_before_tail>"
57 echo -ne "`cat $data_file` $key_before_tail\000">$data_file
59 key_len="`cat $data_file`"
60 key_len=$((${#key_len}+1))
63 debug "OLDLEN>$abs_len<"
64 debug "NEWLEN>$key_len<"
65 debug "PATCH_TO>`cat $data_file`<"
67 debug "key_len=$key_len"
68 if [ $key_len -le ${abs_len} ];then
69 debug "before=<$key_before>"
70 res=`dd if="${data_file}" of="${output_file}" bs=1 seek=${pos} skip=0c count=${key_len}c conv=notrunc 2>/dev/null`
72 res=`dd if="$output_file" bs=1 skip=${pos}c count=${abs_len}c 2>/dev/null`
73 debug "patched=<$res>"
75 error "Error on patching <${patch_file}>:data file <$data_file> NEW KEY TOO LONG"
76 error "CHECK YOUR KERNEL USED ON COMPILE SWAP IF YOU READ IT"
80 error "Error on patching <${patch_file}>:data file <$data_file> not found"
84 #if[ "$opt" != "-p" ];then
89 error "readelf not found on path <$readelf>"
94 error "objdump not found on path <$objdump>"
98 file_size=$((`ls -la "$patch_file" | awk '{print \$5}'`))
99 debugmk "file_size=$file_size"
101 section=`$readelf -e $patch_file | grep ${sect_name}`
102 section=${section##*${sect_name}}
103 debugmk "section=$section"
105 addr=$((0x`echo $section | awk '{print $2}'`))
106 offs=$((0x`echo $section | awk '{print $3}'`))
107 size=$((0x`echo $section | awk '{print $4}'`))
108 debugmk $addr:$offs:$size
110 abs_len=$((0x`$objdump -t -j .${sect_name} "$patch_file" | grep _${varname} | awk '{print $5}'`))
111 abs_len=$(($abs_len-${#varname}-1))
112 sect_off=$((0x`$objdump -t -j .${sect_name} "$patch_file" | grep _${varname} | awk '{print $1}'`))
113 add_off=$((${#varname}+1))
115 abs_addr=$((${addr}+${offs}+${sect_off}+${add_off}))
116 debugmk "abs_addr=$abs_addr;"
117 debugmk "abs_len=$abs_len"
118 if [ "$opt" = "-r" ];then
119 #read version (for patch testing)
120 debugmk "Read version in <$patch_file>"
121 res=`dd if="$patch_file" bs=1 skip=${abs_addr}c count=${abs_len}c 2>/dev/null`
123 elif [ "$opt" = "-g" ];then
124 #gen file version (use only on host)
125 debugmk "Generate version data for <$patch_file>"
126 #res=`dd if="$patch_file" of="$patch_file.addr" bs=1 skip=${abs_addr}c count=${abs_len}c`
127 if [ "$abs_addr" = "" ];then
128 debugmk "ERROR cannot get absolute addres of module info line for patching"
130 elif [ "$abs_len" = "" ];then
131 debugmk "ERROR cannot get length of module info line for patching"
134 echo "$abs_addr $abs_len">"$patch_file.addr"
136 debugmk "patch_addr=`cat $patch_file.addr`"
138 error "Wrong param <$opt>"
142 error "file for patchig not found <$patch_file>"