Commit 1954ee55605a75c91924b63c2584f4d53f11afc7
Merge branch 'for-linus-1' of git://git.kernel.org/pub/scm/linux/kernel/git/rost…
…edt/linux-2.6-kconfig * 'for-linus-1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-kconfig: kconfig: simplification of scripts/extract-ikconfig
Showing 4 changed files Side-by-side Diff
Documentation/dontdiff
scripts/.gitignore
scripts/binoffset.c
1 | -/*************************************************************************** | |
2 | - * binoffset.c | |
3 | - * (C) 2002 Randy Dunlap <rdunlap@xenotime.net> | |
4 | - | |
5 | -# This program is free software; you can redistribute it and/or modify | |
6 | -# it under the terms of the GNU General Public License as published by | |
7 | -# the Free Software Foundation; either version 2 of the License, or | |
8 | -# (at your option) any later version. | |
9 | -# | |
10 | -# This program is distributed in the hope that it will be useful, | |
11 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | -# GNU General Public License for more details. | |
14 | -# | |
15 | -# You should have received a copy of the GNU General Public License | |
16 | -# along with this program; if not, write to the Free Software | |
17 | -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
18 | - | |
19 | -# binoffset.c: | |
20 | -# - searches a (binary) file for a specified (binary) pattern | |
21 | -# - returns the offset of the located pattern or ~0 if not found | |
22 | -# - exits with exit status 0 normally or non-0 if pattern is not found | |
23 | -# or any other error occurs. | |
24 | - | |
25 | -****************************************************************/ | |
26 | - | |
27 | -#include <stdio.h> | |
28 | -#include <stdlib.h> | |
29 | -#include <string.h> | |
30 | -#include <errno.h> | |
31 | -#include <unistd.h> | |
32 | -#include <fcntl.h> | |
33 | -#include <sys/types.h> | |
34 | -#include <sys/stat.h> | |
35 | -#include <sys/mman.h> | |
36 | - | |
37 | -#define VERSION "0.1" | |
38 | -#define BUF_SIZE (16 * 1024) | |
39 | -#define PAT_SIZE 100 | |
40 | - | |
41 | -char *progname; | |
42 | -char *inputname; | |
43 | -int inputfd; | |
44 | -unsigned int bix; /* buf index */ | |
45 | -unsigned char patterns [PAT_SIZE] = {0}; /* byte-sized pattern array */ | |
46 | -int pat_len; /* actual number of pattern bytes */ | |
47 | -unsigned char *madr; /* mmap address */ | |
48 | -size_t filesize; | |
49 | -int num_matches = 0; | |
50 | -off_t firstloc = 0; | |
51 | - | |
52 | -void usage (void) | |
53 | -{ | |
54 | - fprintf (stderr, "%s ver. %s\n", progname, VERSION); | |
55 | - fprintf (stderr, "usage: %s filename pattern_bytes\n", | |
56 | - progname); | |
57 | - fprintf (stderr, " [prints location of pattern_bytes in file]\n"); | |
58 | - exit (1); | |
59 | -} | |
60 | - | |
61 | -void get_pattern (int pat_count, char *pats []) | |
62 | -{ | |
63 | - int ix, err, tmp; | |
64 | - | |
65 | -#ifdef DEBUG | |
66 | - fprintf (stderr,"get_pattern: count = %d\n", pat_count); | |
67 | - for (ix = 0; ix < pat_count; ix++) | |
68 | - fprintf (stderr, " pat # %d: [%s]\n", ix, pats[ix]); | |
69 | -#endif | |
70 | - | |
71 | - for (ix = 0; ix < pat_count; ix++) { | |
72 | - tmp = 0; | |
73 | - err = sscanf (pats[ix], "%5i", &tmp); | |
74 | - if (err != 1 || tmp > 0xff) { | |
75 | - fprintf (stderr, "pattern or value error in pattern # %d [%s]\n", | |
76 | - ix, pats[ix]); | |
77 | - usage (); | |
78 | - } | |
79 | - patterns [ix] = tmp; | |
80 | - } | |
81 | - pat_len = pat_count; | |
82 | -} | |
83 | - | |
84 | -void search_pattern (void) | |
85 | -{ | |
86 | - for (bix = 0; bix < filesize; bix++) { | |
87 | - if (madr[bix] == patterns[0]) { | |
88 | - if (memcmp (&madr[bix], patterns, pat_len) == 0) { | |
89 | - if (num_matches == 0) | |
90 | - firstloc = bix; | |
91 | - num_matches++; | |
92 | - } | |
93 | - } | |
94 | - } | |
95 | -} | |
96 | - | |
97 | -#ifdef NOTDEF | |
98 | -size_t get_filesize (int fd) | |
99 | -{ | |
100 | - off_t end_off = lseek (fd, 0, SEEK_END); | |
101 | - lseek (fd, 0, SEEK_SET); | |
102 | - return (size_t) end_off; | |
103 | -} | |
104 | -#endif | |
105 | - | |
106 | -size_t get_filesize (int fd) | |
107 | -{ | |
108 | - int err; | |
109 | - struct stat stat; | |
110 | - | |
111 | - err = fstat (fd, &stat); | |
112 | - fprintf (stderr, "filesize: %ld\n", err < 0 ? (long)err : stat.st_size); | |
113 | - if (err < 0) | |
114 | - return err; | |
115 | - return (size_t) stat.st_size; | |
116 | -} | |
117 | - | |
118 | -int main (int argc, char *argv []) | |
119 | -{ | |
120 | - progname = argv[0]; | |
121 | - | |
122 | - if (argc < 3) | |
123 | - usage (); | |
124 | - | |
125 | - get_pattern (argc - 2, argv + 2); | |
126 | - | |
127 | - inputname = argv[1]; | |
128 | - | |
129 | - inputfd = open (inputname, O_RDONLY); | |
130 | - if (inputfd == -1) { | |
131 | - fprintf (stderr, "%s: cannot open '%s'\n", | |
132 | - progname, inputname); | |
133 | - exit (3); | |
134 | - } | |
135 | - | |
136 | - filesize = get_filesize (inputfd); | |
137 | - | |
138 | - madr = mmap (0, filesize, PROT_READ, MAP_PRIVATE, inputfd, 0); | |
139 | - if (madr == MAP_FAILED) { | |
140 | - fprintf (stderr, "mmap error = %d\n", errno); | |
141 | - close (inputfd); | |
142 | - exit (4); | |
143 | - } | |
144 | - | |
145 | - search_pattern (); | |
146 | - | |
147 | - if (munmap (madr, filesize)) | |
148 | - fprintf (stderr, "munmap error = %d\n", errno); | |
149 | - | |
150 | - if (close (inputfd)) | |
151 | - fprintf (stderr, "%s: error %d closing '%s'\n", | |
152 | - progname, errno, inputname); | |
153 | - | |
154 | - fprintf (stderr, "number of pattern matches = %d\n", num_matches); | |
155 | - if (num_matches == 0) | |
156 | - firstloc = ~0; | |
157 | - printf ("%ld\n", firstloc); | |
158 | - fprintf (stderr, "%ld\n", firstloc); | |
159 | - | |
160 | - exit (num_matches ? 0 : 2); | |
161 | -} | |
162 | - | |
163 | -/* end binoffset.c */ |
scripts/extract-ikconfig
1 | 1 | #!/bin/sh |
2 | -# extracts .config info from a [b]zImage file | |
3 | -# uses: binoffset (new), dd, zcat, strings, grep | |
4 | -# $arg1 is [b]zImage filename | |
2 | +# ---------------------------------------------------------------------- | |
3 | +# extract-ikconfig - Extract the .config file from a kernel image | |
4 | +# | |
5 | +# This will only work when the kernel was compiled with CONFIG_IKCONFIG. | |
6 | +# | |
7 | +# The obscure use of the "tr" filter is to work around older versions of | |
8 | +# "grep" that report the byte offset of the line instead of the pattern. | |
9 | +# | |
10 | +# (c) 2009, Dick Streefland <dick@streefland.net> | |
11 | +# Licensed under the terms of the GNU General Public License. | |
12 | +# ---------------------------------------------------------------------- | |
5 | 13 | |
6 | -binoffset="./scripts/binoffset" | |
7 | -test -e $binoffset || cc -o $binoffset ./scripts/binoffset.c || exit 1 | |
14 | +gz1='\037\213\010' | |
15 | +gz2='01' | |
16 | +cf1='IKCFG_ST\037\213\010' | |
17 | +cf2='0123456789' | |
8 | 18 | |
9 | -IKCFG_ST="0x49 0x4b 0x43 0x46 0x47 0x5f 0x53 0x54" | |
10 | -IKCFG_ED="0x49 0x4b 0x43 0x46 0x47 0x5f 0x45 0x44" | |
11 | -dump_config() { | |
12 | - file="$1" | |
13 | - | |
14 | - start=`$binoffset $file $IKCFG_ST 2>/dev/null` | |
15 | - [ "$?" != "0" ] && start="-1" | |
16 | - if [ "$start" -eq "-1" ]; then | |
17 | - return | |
18 | - fi | |
19 | - end=`$binoffset $file $IKCFG_ED 2>/dev/null` | |
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() | |
19 | +dump_config() | |
36 | 20 | { |
37 | - echo " usage: extract-ikconfig [b]zImage_filename" | |
38 | -} | |
39 | - | |
40 | -clean_up() | |
41 | -{ | |
42 | - if [ "$TMPFILE" != "" ]; then | |
43 | - rm -f $TMPFILE | |
21 | + if pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"` | |
22 | + then | |
23 | + pos=${pos%%:*} | |
24 | + tail -c+$(($pos+8)) "$1" | zcat -q | |
25 | + exit 0 | |
44 | 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 | 33 | then |
49 | - usage | |
50 | - exit 1 | |
34 | + echo "Usage: $me <kernel-image>" >&2 | |
35 | + exit 2 | |
51 | 36 | fi |
52 | 37 | |
53 | -TMPFILE=`mktemp -t ikconfig-XXXXXX` || exit 1 | |
54 | -image="$1" | |
38 | +# Initial attempt for uncompressed images or objects: | |
39 | +dump_config "$img" | |
55 | 40 | |
56 | -# vmlinux: Attempt to dump the configuration from the file directly | |
57 | -dump_config "$image" | |
41 | +# That didn't work, so decompress and try again: | |
42 | +tmp=/tmp/ikconfig$$ | |
43 | +trap "rm -f $tmp" 0 | |
44 | +for pos in `tr "$gz1\n$gz2" "\n$gz2=" < "$img" | grep -abo "^$gz2"` | |
45 | +do | |
46 | + pos=${pos%%:*} | |
47 | + tail -c+$pos "$img" | zcat 2> /dev/null > $tmp | |
48 | + dump_config $tmp | |
49 | +done | |
58 | 50 | |
59 | -GZHDR1="0x1f 0x8b 0x08 0x00" | |
60 | -GZHDR2="0x1f 0x8b 0x08 0x08" | |
61 | - | |
62 | -ELFHDR="0x7f 0x45 0x4c 0x46" | |
63 | - | |
64 | -# vmlinux.gz: Check for a compressed images | |
65 | -off=`$binoffset "$image" $GZHDR1 2>/dev/null` | |
66 | -[ "$?" != "0" ] && off="-1" | |
67 | -if [ "$off" -eq "-1" ]; then | |
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 | |
51 | +# Bail out: | |
52 | +echo "$me: Cannot find kernel config." >&2 | |
92 | 53 | exit 1 |