Version 1.0.9.
[gnuk/neug.git] / src / binary-edit.sh
1 # This is a Bash script to be included.
2
3 # Idx Name          Size      VMA       LMA       File off  Algn
4 # =================
5 #   2 .text         00004a40  080010f0  080010f0  000110f0  2**4
6 # 08006500 l     O .text        00000012 vcom_device_desc
7 # 08006550 l     O .text        00000012 device_desc
8 # =================
9 # VMA =0x080010f0
10 # FOFF=0x000110f0
11 # ADDR=0x08005ad0
12 # file_off_ADDR = ADDR - VMA + FOFF
13 #               = 0x08005ad0 - 0x080010f0 + 0x000110f0 = 0x00015ad0
14
15 function calc_addr () {
16     local line_sym="" VMA FOFF ADDR
17
18     arm-none-eabi-objdump -h -t -j .text $FILE       | \
19     egrep -e '(^ +[0-9] +\.text +|device_desc)' | \
20     while read -r F0 F1 F2 F3 F4 F5 F6; do
21         if [ -z "$line_sym" ]; then
22             VMA=$F3
23             FOFF=$F5
24             line_sym="next is a line for the symbol"
25         else
26             ADDR=$F0
27             echo "$((0x$ADDR - 0x$VMA + 0x$FOFF))"
28         fi
29     done
30 }
31
32 declare -a OFFSETS
33 OFFSETS=($(calc_addr))
34 file_off_ADDR=${OFFSETS[0]}
35 file_off_fraucheky_ADDR=${OFFSETS[1]}
36
37 echo "Offset is $file_off_ADDR"
38 if [ -n "$file_off_fraucheky_ADDR" ]; then
39     echo "Offset is $file_off_fraucheky_ADDR"
40 fi
41
42 function replace_file_byte_at () {
43     printf "\x$1" | dd of=$FILE bs=1 seek=$2 conv=notrunc >& /dev/null
44 }
45
46 #
47 # vid_lsb:         8
48 # vid_msb:         9
49 # pid_lsb:        10
50 # pid_msb:        11
51 # bcd_device_lsb: 12
52 # bcd_device_msb: 13
53 #
54
55 function replace_vid_lsb () {
56     replace_file_byte_at $1 $((addr + 8))
57 }
58
59 function replace_vid_msb () {
60     replace_file_byte_at $1 $((addr + 9))
61 }
62
63 function replace_pid_lsb () {
64     replace_file_byte_at $1 $((addr + 10))
65 }
66
67 function replace_pid_msb () {
68     replace_file_byte_at $1 $((addr + 11))
69 }
70
71 function replace_bcd_device_lsb () {
72     replace_file_byte_at $1 $((addr + 12))
73 }
74
75 function replace_bcd_device_msb () {
76     replace_file_byte_at $1 $((addr + 13))
77 }