diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/generate_BUFSIZ.sh | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/scripts/generate_BUFSIZ.sh b/scripts/generate_BUFSIZ.sh new file mode 100755 index 000000000..afe9eee1e --- /dev/null +++ b/scripts/generate_BUFSIZ.sh | |||
@@ -0,0 +1,114 @@ | |||
1 | #!/bin/sh | ||
2 | # Called from top-level directory a-la | ||
3 | # | ||
4 | # scripts/generate_BUFSIZ.sh include/common_bufsiz.h | ||
5 | |||
6 | . ./.config || exit 1 | ||
7 | |||
8 | debug=false | ||
9 | |||
10 | common_bufsiz_h=$1 | ||
11 | |||
12 | test x"$NM" = x"" && NM="${CONFIG_CROSS_COMPILER_PREFIX}nm" | ||
13 | test x"$CC" = x"" && CC="${CONFIG_CROSS_COMPILER_PREFIX}gcc" | ||
14 | |||
15 | regenerate() { | ||
16 | cat >"$1.$$" | ||
17 | test -f "$1" && diff "$1.$$" "$1" >/dev/null && rm "$1.$$" && return | ||
18 | mv "$1.$$" "$1" | ||
19 | } | ||
20 | |||
21 | generate_std_and_exit() { | ||
22 | $debug && echo "Default: bb_common_bufsiz1[] in bss" | ||
23 | { | ||
24 | echo "enum { COMMON_BUFSIZE = 1024 };" | ||
25 | echo "extern char bb_common_bufsiz1[];" | ||
26 | echo "#define setup_common_bufsiz() ((void)0)" | ||
27 | } | regenerate "$common_bufsiz_h" | ||
28 | exit 0 | ||
29 | } | ||
30 | |||
31 | # User does not want any funky stuff? | ||
32 | test x"$CONFIG_FEATURE_USE_BSS_TAIL" = x"y" || generate_std_and_exit | ||
33 | |||
34 | test -f busybox_unstripped || { | ||
35 | # We did not try anything yet | ||
36 | $debug && echo "Will try to fit bb_common_bufsiz1[] into _end[]" | ||
37 | { | ||
38 | echo "enum { COMMON_BUFSIZE = 1024 };" | ||
39 | echo "extern char _end[]; /* linker-provided label */" | ||
40 | echo "#define bb_common_bufsiz1 _end" | ||
41 | echo "#define setup_common_bufsiz() ((void)0)" | ||
42 | } | regenerate "$common_bufsiz_h" | ||
43 | echo 1024 >"$common_bufsiz_h.BUFSIZE" | ||
44 | exit 0 | ||
45 | } | ||
46 | |||
47 | # Get _end address | ||
48 | END=`$NM busybox_unstripped | grep ' . _end$'| cut -d' ' -f1` | ||
49 | test x"$END" = x"" && generate_std_and_exit | ||
50 | $debug && echo "END:0x$END $((0x$END))" | ||
51 | END=$((0x$END)) | ||
52 | |||
53 | # Get PAGE_SIZE | ||
54 | echo "\ | ||
55 | #include <sys/user.h> | ||
56 | #if defined(PAGE_SIZE) && PAGE_SIZE > 0 | ||
57 | char page_size[PAGE_SIZE]; | ||
58 | #else | ||
59 | char page_size[1]; | ||
60 | #endif | ||
61 | " >page_size_$$.c | ||
62 | $CC -c "page_size_$$.c" || generate_std_and_exit | ||
63 | PAGE_SIZE=`$NM --size-sort "page_size_$$.o" | cut -d' ' -f1` | ||
64 | rm "page_size_$$.c" "page_size_$$.o" | ||
65 | test x"$PAGE_SIZE" = x"" && generate_std_and_exit | ||
66 | $debug && echo "PAGE_SIZE:0x$PAGE_SIZE $((0x$PAGE_SIZE))" | ||
67 | PAGE_SIZE=$((0x$PAGE_SIZE)) | ||
68 | test $PAGE_SIZE -lt 1024 && generate_std_and_exit | ||
69 | |||
70 | # How much space between _end[] and next page? | ||
71 | PAGE_MASK=$((PAGE_SIZE-1)) | ||
72 | REM=$(( (-END) & PAGE_MASK )) | ||
73 | $debug && echo "REM:$REM" | ||
74 | |||
75 | if test $REM -lt 1024; then | ||
76 | # _end[] has no enough space for bb_common_bufsiz1[], | ||
77 | # users will need to malloc it. | ||
78 | { | ||
79 | echo "enum { COMMON_BUFSIZE = 1024 };" | ||
80 | echo "extern char *bb_common_bufsiz1;" | ||
81 | echo "void setup_common_bufsiz(void);" | ||
82 | } | regenerate "$common_bufsiz_h" | ||
83 | # Check that we aren't left with a buggy binary: | ||
84 | if test -f "$common_bufsiz_h.BUFSIZE"; then | ||
85 | rm "$common_bufsiz_h.BUFSIZE" | ||
86 | echo "Warning! Space in _end[] is too small ($REM bytes)!" | ||
87 | echo "Rerun make to build a binary which doesn't use it!" | ||
88 | exit 1 | ||
89 | fi | ||
90 | exit 0 | ||
91 | fi | ||
92 | |||
93 | # _end[] has REM bytes for bb_common_bufsiz1[] | ||
94 | OLD=1024 | ||
95 | test -f "$common_bufsiz_h.BUFSIZE" && OLD=`cat "$common_bufsiz_h.BUFSIZE"` | ||
96 | $debug && echo "OLD:$OLD" | ||
97 | { | ||
98 | echo "enum { COMMON_BUFSIZE = $REM };" | ||
99 | echo "extern char _end[]; /* linker-provided label */" | ||
100 | echo "#define bb_common_bufsiz1 _end" | ||
101 | echo "#define setup_common_bufsiz() ((void)0)" | ||
102 | } | regenerate "$common_bufsiz_h" | ||
103 | echo $REM >"$common_bufsiz_h.BUFSIZE" | ||
104 | |||
105 | # Check that code did not grow too much and thus _end[] did not shink: | ||
106 | if test $OLD -gt $REM; then | ||
107 | echo "Warning! Space in _end[] has decreased from $OLD to $REM bytes!" | ||
108 | echo "Rerun make!" | ||
109 | exit 1 | ||
110 | fi | ||
111 | |||
112 | if test $OLD != $REM; then | ||
113 | echo "Space in _end[] is $REM bytes. Rerun make to use larger COMMON_BUFSIZE." | ||
114 | fi | ||