Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/scripts/trylink
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/scripts/trylink
r1765 r2725 3 3 debug=false 4 4 5 # Linker flags used: 6 # 7 # Informational: 8 # --warn-common 9 # -Map $EXE.map 10 # --verbose 11 # 12 # Optimizations: 13 # --sort-common reduces padding 14 # --sort-section alignment reduces padding 15 # --gc-sections throws out unused sections, 16 # does not work for shared libs 17 # -On Not used, maybe useful? 18 # 19 # List of files to link: 20 # $l_list == --start-group -llib1 -llib2 --end-group 21 # --start-group $O_FILES $A_FILES --end-group 22 # 23 # Shared library link: 24 # -shared self-explanatory 25 # -fPIC position-independent code 26 # --enable-new-dtags ? 27 # -z,combreloc ? 28 # -soname="libbusybox.so.$BB_VER" 29 # --undefined=lbb_main Seed name to start pulling from 30 # (otherwise we'll need --whole-archive) 31 # -static Not used, but may be useful! manpage: 32 # "... This option can be used with -shared. 33 # Doing so means that a shared library 34 # is being created but that all of the library's 35 # external references must be resolved by pulling 36 # in entries from static libraries." 37 38 5 39 try() { 6 added="$1" 7 shift 8 $debug && echo "Trying: $* $added" 9 "$@" $added 2>busybox_ld.err 10 } 40 printf "%s\n" "Output of:" >$EXE.out 41 printf "%s\n" "$*" >>$EXE.out 42 printf "%s\n" "==========" >>$EXE.out 43 $debug && echo "Trying: $*" 44 $@ >>$EXE.out 2>&1 45 return $? 46 } 47 48 check_cc() { 49 local tempname="/tmp/temp.$$.$RANDOM" 50 # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :( 51 # "-xc": C language. "/dev/null" is an empty source file. 52 if $CC $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then 53 echo "$1"; 54 else 55 echo "$2"; 56 fi 57 rm "$tempname".o 2>/dev/null 58 } 59 60 check_libc_is_glibc() { 61 local tempname="/tmp/temp.$$.$RANDOM" 62 echo "\ 63 #include <stdlib.h> 64 /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ 65 #if defined(__GLIBC__) && !defined(__UCLIBC__) 66 syntax error here 67 #endif 68 " >"$tempname".c 69 if $CC "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then 70 echo "$2"; 71 else 72 echo "$1"; 73 fi 74 rm "$tempname".c "$tempname".o 2>/dev/null 75 } 76 77 EXE="$1" 78 CC="$2" 79 CFLAGS="$3" 80 LDFLAGS="$4" 81 O_FILES="$5" 82 A_FILES="$6" 83 LDLIBS="$7" 84 85 # The --sort-section option is not supported by older versions of ld 86 SORT_SECTION=`check_cc "-Wl,--sort-section,alignment" ""` 87 88 START_GROUP="-Wl,--start-group" 89 END_GROUP="-Wl,--end-group" 90 INFO_OPTS="-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose" 91 92 # gold may not support --sort-common (yet) 93 SORT_COMMON=`check_cc "-Wl,--sort-common" ""` 94 95 # Static linking against glibc produces buggy executables 96 # (glibc does not cope well with ld --gc-sections). 97 # See sources.redhat.com/bugzilla/show_bug.cgi?id=3400 98 # Note that glibc is unsuitable for static linking anyway. 99 # We are removing -Wl,--gc-sections from link command line. 100 GC_SECTIONS=`( 101 . ./.config 102 if test x"$CONFIG_STATIC" = x"y"; then 103 check_libc_is_glibc "" "-Wl,--gc-sections" 104 else 105 echo "-Wl,--gc-sections" 106 fi 107 )` 108 109 # The --gc-sections option is not supported by older versions of ld 110 if test -n "$GC_SECTIONS"; then 111 GC_SECTIONS=`check_cc "$GC_SECTIONS" ""` 112 fi 11 113 12 114 # Sanitize lib list (dups, extra spaces etc) 13 #echo "BBOX_LIB_LIST=$BBOX_LIB_LIST" 14 BBOX_LIB_LIST=`echo "$BBOX_LIB_LIST" | xargs -n1 | sort | uniq | xargs` 115 LDLIBS=`echo "$LDLIBS" | xargs -n1 | sort | uniq | xargs` 15 116 16 117 # First link with all libs. If it fails, bail out 17 echo "Trying libraries: $BBOX_LIB_LIST" 18 l_list=`echo "$BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'` 19 test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group" 20 try "$l_list" "$@" \ 118 echo "Trying libraries: $LDLIBS" 119 # "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3" 120 l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'` 121 test "x$l_list" != "x" && l_list="$START_GROUP $l_list $END_GROUP" 122 try $CC $CFLAGS $LDFLAGS \ 123 -o $EXE \ 124 $SORT_COMMON \ 125 $SORT_SECTION \ 126 $GC_SECTIONS \ 127 $START_GROUP $O_FILES $A_FILES $END_GROUP \ 128 $l_list \ 21 129 || { 22 echo "Failed: $ * -Wl,--start-group $l_list -Wl,--end-group"23 cat busybox_ld.err130 echo "Failed: $l_list" 131 cat $EXE.out 24 132 exit 1 25 133 } … … 27 135 # Now try to remove each lib and build without it. 28 136 # Stop when no lib can be removed. 29 while test "$ BBOX_LIB_LIST"; do30 $debug && echo "Trying libraries: $ BBOX_LIB_LIST"137 while test "$LDLIBS"; do 138 $debug && echo "Trying libraries: $LDLIBS" 31 139 all_needed=true 32 for one in $BBOX_LIB_LIST; do 33 without_one=`echo " $BBOX_LIB_LIST " | sed "s/ $one / /g" | xargs` 140 last_needed=false 141 for one in $LDLIBS; do 142 without_one=`echo " $LDLIBS " | sed "s/ $one / /g" | xargs` 143 # "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3" 34 144 l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'` 35 test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group"145 test x"$l_list" != x"" && l_list="$START_GROUP $l_list $END_GROUP" 36 146 $debug && echo "Trying -l options: '$l_list'" 37 if try "$l_list" "$@"; then 38 echo "Library $one is not needed" 39 BBOX_LIB_LIST="$without_one" 40 all_needed=false 147 try $CC $CFLAGS $LDFLAGS \ 148 -o $EXE \ 149 $SORT_COMMON \ 150 $SORT_SECTION \ 151 $GC_SECTIONS \ 152 $START_GROUP $O_FILES $A_FILES $END_GROUP \ 153 $l_list 154 if test $? = 0; then 155 echo " Library $one is not needed, excluding it" 156 LDLIBS="$without_one" 157 all_needed=false 158 last_needed=false 41 159 else 42 echo "Library $one is needed" 160 echo " Library $one is needed, can't exclude it (yet)" 161 last_needed=true 43 162 fi 44 163 done 45 164 # All libs were needed, can't remove any 46 165 $all_needed && break 47 # If there is no space char, the list has just one lib. 48 # I'm not sure that in this case lib really is 100% needed. 49 # Let's try linking without it anyway... thus commented out. 50 #{ echo "$BBOX_LIB_LIST" | grep -q ' '; } || break 166 # Optimization: was the last tried lib needed? 167 if $last_needed; then 168 # Was it the only one lib left? Don't test again then. 169 { echo "$LDLIBS" | grep -q ' '; } || break 170 fi 51 171 done 52 172 53 173 # Make the binary with final, minimal list of libs 54 echo "Final link with: $ BBOX_LIB_LIST"55 l_list=`echo "$ BBOX_LIB_LIST" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`56 test "x$l_list" != "x" && l_list=" -Wl,--start-group $l_list -Wl,--end-group -Wl,--verbose"174 echo "Final link with: ${LDLIBS:-<none>}" 175 l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'` 176 test "x$l_list" != "x" && l_list="$START_GROUP $l_list $END_GROUP" 57 177 # --verbose gives us gobs of info to stdout (e.g. linker script used) 58 178 if ! test -f busybox_ldscript; then 59 try "$l_list -Wl,--verbose" "$@" >busybox_ld.out 179 try $CC $CFLAGS $LDFLAGS \ 180 -o $EXE \ 181 $SORT_COMMON \ 182 $SORT_SECTION \ 183 $GC_SECTIONS \ 184 $START_GROUP $O_FILES $A_FILES $END_GROUP \ 185 $l_list \ 186 $INFO_OPTS \ 187 || { 188 cat $EXE.out 189 exit 1 190 } 60 191 else 61 192 echo "Custom linker script 'busybox_ldscript' found, using it" 62 # Add SORT_BY_ALIGNMENT to linker script (found in busybox_ld.out):193 # Add SORT_BY_ALIGNMENT to linker script (found in $EXE.out): 63 194 # .rodata : { *(.rodata SORT_BY_ALIGNMENT(.rodata.*) .gnu.linkonce.r.*) } 64 195 # *(.data SORT_BY_ALIGNMENT(.data.*) .gnu.linkonce.d.*) 65 196 # *(.bss SORT_BY_ALIGNMENT(.bss.*) .gnu.linkonce.b.*) 66 # This will eliminate most of the data padding (~3kb). 67 try "$l_list -Wl,--verbose -Wl,-T -Wl,busybox_ldscript" "$@" >busybox_ld.out 68 fi 197 # This will eliminate most of the padding (~3kb). 198 # Hmm, "ld --sort-section alignment" should do it too. 199 try $CC $CFLAGS $LDFLAGS \ 200 -o $EXE \ 201 $SORT_COMMON \ 202 $SORT_SECTION \ 203 $GC_SECTIONS \ 204 -Wl,-T,busybox_ldscript \ 205 $START_GROUP $O_FILES $A_FILES $END_GROUP \ 206 $l_list \ 207 $INFO_OPTS \ 208 || { 209 cat $EXE.out 210 exit 1 211 } 212 fi 213 214 . ./.config 215 216 sharedlib_dir="0_lib" 217 218 if test "$CONFIG_BUILD_LIBBUSYBOX" = y; then 219 mkdir "$sharedlib_dir" 2>/dev/null 220 test -d "$sharedlib_dir" || { 221 echo "Cannot make directory $sharedlib_dir" 222 exit 1 223 } 224 ln -s "libbusybox.so.$BB_VER" "$sharedlib_dir"/libbusybox.so 2>/dev/null 225 226 EXE="$sharedlib_dir/libbusybox.so.${BB_VER}_unstripped" 227 try $CC $CFLAGS $LDFLAGS \ 228 -o $EXE \ 229 -shared -fPIC \ 230 -Wl,--enable-new-dtags \ 231 -Wl,-z,combreloc \ 232 -Wl,-soname="libbusybox.so.$BB_VER" \ 233 -Wl,--undefined=lbb_main \ 234 $SORT_COMMON \ 235 $SORT_SECTION \ 236 $START_GROUP $A_FILES $END_GROUP \ 237 $l_list \ 238 $INFO_OPTS \ 239 || { 240 echo "Linking $EXE failed" 241 cat $EXE.out 242 exit 1 243 } 244 $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/libbusybox.so.$BB_VER" 245 chmod a+x "$sharedlib_dir/libbusybox.so.$BB_VER" 246 echo "libbusybox: $sharedlib_dir/libbusybox.so.$BB_VER" 247 fi 248 249 if test "$CONFIG_FEATURE_SHARED_BUSYBOX" = y; then 250 EXE="$sharedlib_dir/busybox_unstripped" 251 try $CC $CFLAGS $LDFLAGS \ 252 -o $EXE \ 253 $SORT_COMMON \ 254 $SORT_SECTION \ 255 $GC_SECTIONS \ 256 $START_GROUP $O_FILES $END_GROUP \ 257 -L"$sharedlib_dir" -lbusybox \ 258 $INFO_OPTS \ 259 || { 260 echo "Linking $EXE failed" 261 cat $EXE.out 262 exit 1 263 } 264 $STRIP -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/busybox" 265 echo "busybox linked against libbusybox: $sharedlib_dir/busybox" 266 fi 267 268 if test "$CONFIG_FEATURE_INDIVIDUAL" = y; then 269 echo "Linking individual applets against libbusybox (see $sharedlib_dir/*)" 270 gcc -DNAME_MAIN_CNAME -E -include include/autoconf.h include/applets.h \ 271 | grep -v "^#" \ 272 | grep -v "^$" \ 273 > applet_lst.tmp 274 while read name main junk; do 275 276 echo "\ 277 void lbb_prepare(const char *applet, char **argv); 278 int $main(int argc, char **argv); 279 280 int main(int argc, char **argv) 281 { 282 lbb_prepare(\"$name\", argv); 283 return $main(argc, argv); 284 } 285 " >"$sharedlib_dir/applet.c" 286 287 EXE="$sharedlib_dir/$name" 288 try $CC $CFLAGS $LDFLAGS "$sharedlib_dir/applet.c" \ 289 -o $EXE \ 290 $SORT_COMMON \ 291 $SORT_SECTION \ 292 $GC_SECTIONS \ 293 -L"$sharedlib_dir" -lbusybox \ 294 -Wl,--warn-common \ 295 || { 296 echo "Linking $EXE failed" 297 cat $EXE.out 298 exit 1 299 } 300 rm -- "$sharedlib_dir/applet.c" $EXE.out 301 $STRIP -s --remove-section=.note --remove-section=.comment $EXE 302 303 done <applet_lst.tmp 304 fi 305 306 # libbusybox.so is needed only for -lbusybox at link time, 307 # it is not needed at runtime. Deleting to reduce confusion. 308 rm "$sharedlib_dir"/libbusybox.so 2>/dev/null 309 exit 0 # or else we may confuse make
Note:
See TracChangeset
for help on using the changeset viewer.