libbb: constify *bb_common_bufsiz1 (if it is compiled to be a pointer)
[oweals/busybox.git] / scripts / generate_BUFSIZ.sh
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 *const 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         echo "COMMON_BUFSIZE = 1024 bytes, the buffer will be malloced"
91         exit 0
92 fi
93
94 # _end[] has REM bytes for bb_common_bufsiz1[]
95 OLD=1024
96 test -f "$common_bufsiz_h.BUFSIZE" && OLD=`cat "$common_bufsiz_h.BUFSIZE"`
97 $debug && echo "OLD:$OLD"
98 {
99 echo "enum { COMMON_BUFSIZE = $REM };"
100 echo "extern char _end[]; /* linker-provided label */"
101 echo "#define bb_common_bufsiz1 _end"
102 echo "#define setup_common_bufsiz() ((void)0)"
103 } | regenerate "$common_bufsiz_h"
104 echo $REM >"$common_bufsiz_h.BUFSIZE"
105
106 # Check that code did not grow too much and thus _end[] did not shrink:
107 if test $OLD -gt $REM; then
108         echo "Warning! Space in _end[] has decreased from $OLD to $REM bytes!"
109         echo "Rerun make!"
110         exit 1
111 fi
112
113 if test $OLD != $REM; then
114         echo "Space in _end[] is $REM bytes. Rerun make to use larger COMMON_BUFSIZE."
115 else
116         echo "COMMON_BUFSIZE = $REM bytes"
117 fi