diff options
Diffstat (limited to 'scripts/extract-ikconfig')
-rwxr-xr-x | scripts/extract-ikconfig | 127 |
1 files changed, 44 insertions, 83 deletions
diff --git a/scripts/extract-ikconfig b/scripts/extract-ikconfig index de233ff43c1c..37f30d36c944 100755 --- a/scripts/extract-ikconfig +++ b/scripts/extract-ikconfig | |||
@@ -1,92 +1,53 @@ | |||
1 | #!/bin/sh | 1 | #!/bin/sh |
2 | # extracts .config info from a [b]zImage file | 2 | # ---------------------------------------------------------------------- |
3 | # uses: binoffset (new), dd, zcat, strings, grep | 3 | # extract-ikconfig - Extract the .config file from a kernel image |
4 | # $arg1 is [b]zImage filename | 4 | # |
5 | 5 | # This will only work when the kernel was compiled with CONFIG_IKCONFIG. | |
6 | binoffset="./scripts/binoffset" | 6 | # |
7 | test -e $binoffset || cc -o $binoffset ./scripts/binoffset.c || exit 1 | 7 | # The obscure use of the "tr" filter is to work around older versions of |
8 | 8 | # "grep" that report the byte offset of the line instead of the pattern. | |
9 | IKCFG_ST="0x49 0x4b 0x43 0x46 0x47 0x5f 0x53 0x54" | 9 | # |
10 | IKCFG_ED="0x49 0x4b 0x43 0x46 0x47 0x5f 0x45 0x44" | 10 | # (c) 2009, Dick Streefland <dick@streefland.net> |
11 | dump_config() { | 11 | # Licensed under the terms of the GNU General Public License. |
12 | file="$1" | 12 | # ---------------------------------------------------------------------- |
13 | 13 | ||
14 | start=`$binoffset $file $IKCFG_ST 2>/dev/null` | 14 | gz1='\037\213\010' |
15 | [ "$?" != "0" ] && start="-1" | 15 | gz2='01' |
16 | if [ "$start" -eq "-1" ]; then | 16 | cf1='IKCFG_ST\037\213\010' |
17 | return | 17 | cf2='0123456789' |
18 | fi | 18 | |
19 | end=`$binoffset $file $IKCFG_ED 2>/dev/null` | 19 | dump_config() |
20 | [ "$?" != "0" ] && end="-1" | ||
21 | if [ "$end" -eq "-1" ]; then | ||
22 | return | ||
23 | fi | ||
24 | |||
25 | start=`expr $start + 8` | ||
26 | size=`expr $end - $start` | ||
27 | |||
28 | dd if="$file" ibs=1 skip="$start" count="$size" 2>/dev/null | zcat | ||
29 | |||
30 | clean_up | ||
31 | exit 0 | ||
32 | } | ||
33 | |||
34 | |||
35 | usage() | ||
36 | { | ||
37 | echo " usage: extract-ikconfig [b]zImage_filename" | ||
38 | } | ||
39 | |||
40 | clean_up() | ||
41 | { | 20 | { |
42 | if [ "$TMPFILE" != "" ]; then | 21 | if pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"` |
43 | rm -f $TMPFILE | 22 | then |
23 | pos=${pos%%:*} | ||
24 | tail -c+$(($pos+8)) "$1" | zcat -q | ||
25 | exit 0 | ||
44 | fi | 26 | fi |
45 | } | 27 | } |
46 | 28 | ||
47 | if [ $# -lt 1 ] | 29 | # Check invocation: |
30 | me=${0##*/} | ||
31 | img=$1 | ||
32 | if [ $# -ne 1 -o ! -s "$img" ] | ||
48 | then | 33 | then |
49 | usage | 34 | echo "Usage: $me <kernel-image>" >&2 |
50 | exit 1 | 35 | exit 2 |
51 | fi | 36 | fi |
52 | 37 | ||
53 | TMPFILE=`mktemp -t ikconfig-XXXXXX` || exit 1 | 38 | # Initial attempt for uncompressed images or objects: |
54 | image="$1" | 39 | dump_config "$img" |
55 | 40 | ||
56 | # vmlinux: Attempt to dump the configuration from the file directly | 41 | # That didn't work, so decompress and try again: |
57 | dump_config "$image" | 42 | tmp=/tmp/ikconfig$$ |
58 | 43 | trap "rm -f $tmp" 0 | |
59 | GZHDR1="0x1f 0x8b 0x08 0x00" | 44 | for pos in `tr "$gz1\n$gz2" "\n$gz2=" < "$img" | grep -abo "^$gz2"` |
60 | GZHDR2="0x1f 0x8b 0x08 0x08" | 45 | do |
61 | 46 | pos=${pos%%:*} | |
62 | ELFHDR="0x7f 0x45 0x4c 0x46" | 47 | tail -c+$pos "$img" | zcat 2> /dev/null > $tmp |
63 | 48 | dump_config $tmp | |
64 | # vmlinux.gz: Check for a compressed images | 49 | done |
65 | off=`$binoffset "$image" $GZHDR1 2>/dev/null` | 50 | |
66 | [ "$?" != "0" ] && off="-1" | 51 | # Bail out: |
67 | if [ "$off" -eq "-1" ]; then | 52 | echo "$me: Cannot find kernel config." >&2 |
68 | off=`$binoffset "$image" $GZHDR2 2>/dev/null` | ||
69 | [ "$?" != "0" ] && off="-1" | ||
70 | fi | ||
71 | if [ "$off" -eq "0" ]; then | ||
72 | zcat <"$image" >"$TMPFILE" | ||
73 | dump_config "$TMPFILE" | ||
74 | elif [ "$off" -ne "-1" ]; then | ||
75 | (dd ibs="$off" skip=1 count=0 && dd bs=512k) <"$image" 2>/dev/null | \ | ||
76 | zcat >"$TMPFILE" | ||
77 | dump_config "$TMPFILE" | ||
78 | |||
79 | # check if this is simply an ELF file | ||
80 | else | ||
81 | off=`$binoffset "$image" $ELFHDR 2>/dev/null` | ||
82 | [ "$?" != "0" ] && off="-1" | ||
83 | if [ "$off" -eq "0" ]; then | ||
84 | dump_config "$image" | ||
85 | fi | ||
86 | fi | ||
87 | |||
88 | echo "ERROR: Unable to extract kernel configuration information." | ||
89 | echo " This kernel image may not have the config info." | ||
90 | |||
91 | clean_up | ||
92 | exit 1 | 53 | exit 1 |