diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-10-07 20:46:34 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-10-07 20:46:34 +0000 |
| commit | d62fd84d4b309bc5fa6548288b82f21189d4f53f (patch) | |
| tree | 323ecf50e92a496908b6749c1e0cc41a0669d8c3 | |
| parent | 7930bcf7368e42b327b2a234f4e1be897fc25b1d (diff) | |
| download | busybox-w32-d62fd84d4b309bc5fa6548288b82f21189d4f53f.tar.gz busybox-w32-d62fd84d4b309bc5fa6548288b82f21189d4f53f.tar.bz2 busybox-w32-d62fd84d4b309bc5fa6548288b82f21189d4f53f.zip | |
libbusybox: move (possibly compressed) help stuff into libbusybox.
Makes individual binaries much smaller.
| -rw-r--r-- | Config.in | 13 | ||||
| -rw-r--r-- | applets/Kbuild | 6 | ||||
| -rw-r--r-- | applets/applets.c | 116 | ||||
| -rw-r--r-- | include/busybox.h | 3 | ||||
| -rw-r--r-- | libbb/Kbuild | 1 | ||||
| -rwxr-xr-x | scripts/trylink | 39 |
6 files changed, 25 insertions, 153 deletions
| @@ -283,14 +283,15 @@ config STATIC | |||
| 283 | config BUILD_LIBBUSYBOX | 283 | config BUILD_LIBBUSYBOX |
| 284 | bool "Build shared libbusybox" | 284 | bool "Build shared libbusybox" |
| 285 | default n | 285 | default n |
| 286 | depends on !FEATURE_PREFER_APPLETS | ||
| 286 | help | 287 | help |
| 287 | Build a shared library libbusybox.so which contains all | 288 | Build a shared library libbusybox.so.N.N.N which contains all |
| 288 | libraries used inside busybox. | 289 | busybox code. |
| 289 | 290 | ||
| 290 | This is an experimental feature intended to support the upcoming | 291 | This feature allows every applet to be built as a tiny |
| 291 | "make standalone" mode. Enabling it against the one big busybox | 292 | separate executable. Enabling it for "one big busybox binary" |
| 292 | binary serves no purpose (and increases the size). You should | 293 | approach serves no purpose and increases code size. |
| 293 | almost certainly say "no" to this right now. | 294 | You should almost certainly say "no" to this. |
| 294 | 295 | ||
| 295 | ### config FEATURE_FULL_LIBBUSYBOX | 296 | ### config FEATURE_FULL_LIBBUSYBOX |
| 296 | ### bool "Feature-complete libbusybox" | 297 | ### bool "Feature-complete libbusybox" |
diff --git a/applets/Kbuild b/applets/Kbuild index cf7d29751..289c5def4 100644 --- a/applets/Kbuild +++ b/applets/Kbuild | |||
| @@ -4,13 +4,13 @@ | |||
| 4 | # | 4 | # |
| 5 | # Licensed under the GPL v2, see the file LICENSE in this tarball. | 5 | # Licensed under the GPL v2, see the file LICENSE in this tarball. |
| 6 | 6 | ||
| 7 | obj-y:= | 7 | obj-y := |
| 8 | obj-y += applets.o | 8 | obj-y += applets.o |
| 9 | 9 | ||
| 10 | hostprogs-y:= | 10 | hostprogs-y:= |
| 11 | hostprogs-y += usage | 11 | hostprogs-y += usage |
| 12 | 12 | ||
| 13 | always:= $(hostprogs-y) | 13 | always:= $(hostprogs-y) |
| 14 | 14 | ||
| 15 | # Generated files need additional love | 15 | # Generated files need additional love |
| 16 | 16 | ||
diff --git a/applets/applets.c b/applets/applets.c index f91884b13..49ad8599f 100644 --- a/applets/applets.c +++ b/applets/applets.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <assert.h> | 15 | #include <assert.h> |
| 16 | #include "busybox.h" | 16 | #include "busybox.h" |
| 17 | 17 | ||
| 18 | |||
| 18 | /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ | 19 | /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ |
| 19 | #if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__) | 20 | #if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__) |
| 20 | #warning Static linking against glibc produces buggy executables | 21 | #warning Static linking against glibc produces buggy executables |
| @@ -27,32 +28,8 @@ | |||
| 27 | #endif | 28 | #endif |
| 28 | 29 | ||
| 29 | 30 | ||
| 30 | /* Declare <applet>_main() */ | ||
| 31 | #define PROTOTYPES | ||
| 32 | #include "applets.h" | ||
| 33 | #undef PROTOTYPES | ||
| 34 | |||
| 35 | #if ENABLE_SHOW_USAGE && !ENABLE_FEATURE_COMPRESS_USAGE | ||
| 36 | /* Define usage_messages[] */ | ||
| 37 | static const char usage_messages[] ALIGN1 = "" | ||
| 38 | #define MAKE_USAGE | ||
| 39 | #include "usage.h" | ||
| 40 | #include "applets.h" | ||
| 41 | ; | ||
| 42 | #undef MAKE_USAGE | ||
| 43 | #else | ||
| 44 | #define usage_messages 0 | ||
| 45 | #endif /* SHOW_USAGE */ | ||
| 46 | |||
| 47 | /* Define struct bb_applet applets[] */ | ||
| 48 | #include "applets.h" | ||
| 49 | /* The -1 arises because of the {0,NULL,0,-1} entry. */ | ||
| 50 | |||
| 51 | #if ENABLE_FEATURE_SH_STANDALONE | ||
| 52 | const unsigned short NUM_APPLETS = ARRAY_SIZE(applets); | ||
| 53 | #endif | ||
| 54 | const struct bb_applet *current_applet; | 31 | const struct bb_applet *current_applet; |
| 55 | const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE; | 32 | const char *applet_name; |
| 56 | #if !BB_MMU | 33 | #if !BB_MMU |
| 57 | bool re_execed; | 34 | bool re_execed; |
| 58 | #endif | 35 | #endif |
| @@ -419,82 +396,6 @@ static void check_suid(const struct bb_applet *applet) | |||
| 419 | #endif /* FEATURE_SUID */ | 396 | #endif /* FEATURE_SUID */ |
| 420 | 397 | ||
| 421 | 398 | ||
| 422 | #if ENABLE_FEATURE_COMPRESS_USAGE | ||
| 423 | |||
| 424 | #include "usage_compressed.h" | ||
| 425 | #include "unarchive.h" | ||
| 426 | |||
| 427 | static const char *unpack_usage_messages(void) | ||
| 428 | { | ||
| 429 | char *outbuf = NULL; | ||
| 430 | bunzip_data *bd; | ||
| 431 | int i; | ||
| 432 | |||
| 433 | i = start_bunzip(&bd, | ||
| 434 | /* src_fd: */ -1, | ||
| 435 | /* inbuf: */ packed_usage, | ||
| 436 | /* len: */ sizeof(packed_usage)); | ||
| 437 | /* read_bunzip can longjmp to start_bunzip, and ultimately | ||
| 438 | * end up here with i != 0 on read data errors! Not trivial */ | ||
| 439 | if (!i) { | ||
| 440 | /* Cannot use xmalloc: will leak bd in NOFORK case! */ | ||
| 441 | outbuf = malloc_or_warn(SIZEOF_usage_messages); | ||
| 442 | if (outbuf) | ||
| 443 | read_bunzip(bd, outbuf, SIZEOF_usage_messages); | ||
| 444 | } | ||
| 445 | dealloc_bunzip(bd); | ||
| 446 | return outbuf; | ||
| 447 | } | ||
| 448 | #define dealloc_usage_messages(s) free(s) | ||
| 449 | |||
| 450 | #else | ||
| 451 | |||
| 452 | #define unpack_usage_messages() usage_messages | ||
| 453 | #define dealloc_usage_messages(s) ((void)(s)) | ||
| 454 | |||
| 455 | #endif /* FEATURE_COMPRESS_USAGE */ | ||
| 456 | |||
| 457 | |||
| 458 | void bb_show_usage(void) | ||
| 459 | { | ||
| 460 | if (ENABLE_SHOW_USAGE) { | ||
| 461 | const char *format_string; | ||
| 462 | const char *p; | ||
| 463 | const char *usage_string = p = unpack_usage_messages(); | ||
| 464 | int i; | ||
| 465 | |||
| 466 | i = current_applet - applets; | ||
| 467 | while (i) { | ||
| 468 | while (*p++) continue; | ||
| 469 | i--; | ||
| 470 | } | ||
| 471 | |||
| 472 | fprintf(stderr, "%s multi-call binary\n", bb_banner); | ||
| 473 | format_string = "\nUsage: %s %s\n\n"; | ||
| 474 | if (*p == '\b') | ||
| 475 | format_string = "\nNo help available.\n\n"; | ||
| 476 | fprintf(stderr, format_string, applet_name, p); | ||
| 477 | dealloc_usage_messages((char*)usage_string); | ||
| 478 | } | ||
| 479 | xfunc_die(); | ||
| 480 | } | ||
| 481 | |||
| 482 | |||
| 483 | static int applet_name_compare(const void *name, const void *vapplet) | ||
| 484 | { | ||
| 485 | const struct bb_applet *applet = vapplet; | ||
| 486 | |||
| 487 | return strcmp(name, applet->name); | ||
| 488 | } | ||
| 489 | |||
| 490 | const struct bb_applet *find_applet_by_name(const char *name) | ||
| 491 | { | ||
| 492 | /* Do a binary search to find the applet entry given the name. */ | ||
| 493 | return bsearch(name, applets, ARRAY_SIZE(applets)-1, sizeof(applets[0]), | ||
| 494 | applet_name_compare); | ||
| 495 | } | ||
| 496 | |||
| 497 | |||
| 498 | #if ENABLE_FEATURE_INSTALLER | 399 | #if ENABLE_FEATURE_INSTALLER |
| 499 | /* create (sym)links for each applet */ | 400 | /* create (sym)links for each applet */ |
| 500 | static void install_links(const char *busybox, int use_symbolic_links) | 401 | static void install_links(const char *busybox, int use_symbolic_links) |
| @@ -635,16 +536,9 @@ void run_applet_and_exit(const char *name, char **argv) | |||
| 635 | } | 536 | } |
| 636 | 537 | ||
| 637 | 538 | ||
| 638 | #ifdef __GLIBC__ | ||
| 639 | /* Make it reside in R/W memory: */ | ||
| 640 | int *const bb_errno __attribute__ ((section (".data"))); | ||
| 641 | #endif | ||
| 642 | |||
| 643 | int main(int argc, char **argv) | 539 | int main(int argc, char **argv) |
| 644 | { | 540 | { |
| 645 | #ifdef __GLIBC__ | 541 | bbox_prepare_main(); |
| 646 | (*(int **)&bb_errno) = __errno_location(); | ||
| 647 | #endif | ||
| 648 | 542 | ||
| 649 | #if !BB_MMU | 543 | #if !BB_MMU |
| 650 | /* NOMMU re-exec trick sets high-order bit in first byte of name */ | 544 | /* NOMMU re-exec trick sets high-order bit in first byte of name */ |
| @@ -660,10 +554,6 @@ int main(int argc, char **argv) | |||
| 660 | 554 | ||
| 661 | parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ | 555 | parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ |
| 662 | 556 | ||
| 663 | /* Set locale for everybody except 'init' */ | ||
| 664 | if (ENABLE_LOCALE_SUPPORT && getpid() != 1) | ||
| 665 | setlocale(LC_ALL, ""); | ||
| 666 | |||
| 667 | run_applet_and_exit(applet_name, argv); | 557 | run_applet_and_exit(applet_name, argv); |
| 668 | bb_error_msg_and_die("applet not found"); | 558 | bb_error_msg_and_die("applet not found"); |
| 669 | } | 559 | } |
diff --git a/include/busybox.h b/include/busybox.h index 8b3647f57..3ab90d5c7 100644 --- a/include/busybox.h +++ b/include/busybox.h | |||
| @@ -48,8 +48,9 @@ struct bb_applet { | |||
| 48 | #endif | 48 | #endif |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | /* Defined in applet.c */ | 51 | /* Defined in appletlib.c */ |
| 52 | extern const struct bb_applet applets[]; | 52 | extern const struct bb_applet applets[]; |
| 53 | extern const unsigned short NUM_APPLETS; | 53 | extern const unsigned short NUM_APPLETS; |
| 54 | void bbox_prepare_main(void); | ||
| 54 | 55 | ||
| 55 | #endif /* _BB_INTERNAL_H_ */ | 56 | #endif /* _BB_INTERNAL_H_ */ |
diff --git a/libbb/Kbuild b/libbb/Kbuild index 55b3658b4..c6c33bd6b 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | lib-y:= | 7 | lib-y:= |
| 8 | 8 | ||
| 9 | lib-y += appletlib.o | ||
| 9 | lib-y += ask_confirmation.o | 10 | lib-y += ask_confirmation.o |
| 10 | lib-y += bb_askpass.o | 11 | lib-y += bb_askpass.o |
| 11 | lib-y += bb_basename.o | 12 | lib-y += bb_basename.o |
diff --git a/scripts/trylink b/scripts/trylink index a87d67225..e756461c8 100755 --- a/scripts/trylink +++ b/scripts/trylink | |||
| @@ -128,6 +128,7 @@ if test "$CONFIG_BUILD_LIBBUSYBOX" = y; then | |||
| 128 | exit 1 | 128 | exit 1 |
| 129 | } | 129 | } |
| 130 | strip -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/libbusybox.so.$BB_VER" | 130 | strip -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/libbusybox.so.$BB_VER" |
| 131 | chmod a+x "$sharedlib_dir/libbusybox.so.$BB_VER" | ||
| 131 | echo "libbusybox: $sharedlib_dir/libbusybox.so.$BB_VER" | 132 | echo "libbusybox: $sharedlib_dir/libbusybox.so.$BB_VER" |
| 132 | fi | 133 | fi |
| 133 | 134 | ||
| @@ -160,41 +161,15 @@ if test "$CONFIG_FEATURE_INDIVIDUAL" = y; then | |||
| 160 | test x"$cname" = "x[[" && cname=test | 161 | test x"$cname" = "x[[" && cname=test |
| 161 | 162 | ||
| 162 | echo "\ | 163 | echo "\ |
| 163 | #include <errno.h> | 164 | void bbox_prepare_main(void); |
| 164 | #include <unistd.h> | 165 | int $main(int argc, char **argv); |
| 165 | #include <stdlib.h> | ||
| 166 | #include <stdio.h> | ||
| 167 | #include \"../include/autoconf.h\" | ||
| 168 | #include \"../include/usage.h\" | ||
| 169 | |||
| 170 | #ifdef __GLIBC__ | ||
| 171 | /* Make it reside in R/W memory: */ | ||
| 172 | int *const bb_errno __attribute__ ((section (\".data\"))); | ||
| 173 | #endif | ||
| 174 | 166 | ||
| 175 | const char *applet_name = \"$name\"; | 167 | const char *applet_name = \"$name\"; |
| 176 | 168 | ||
| 177 | void bb_show_usage(void) | ||
| 178 | { | ||
| 179 | fprintf(stderr, \"Usage: $name \" | ||
| 180 | #ifdef ${cname}_trivial_usage | ||
| 181 | ${cname}_trivial_usage | ||
| 182 | #endif | ||
| 183 | #ifdef ${cname}_full_usage | ||
| 184 | \"\\n\\n\" ${cname}_full_usage | ||
| 185 | #endif | ||
| 186 | \"\\n\\n\"); | ||
| 187 | exit(1); | ||
| 188 | } | ||
| 189 | |||
| 190 | int $main(int argc, char **argv); | ||
| 191 | |||
| 192 | int main(int argc, char **argv) | 169 | int main(int argc, char **argv) |
| 193 | { | 170 | { |
| 194 | #ifdef __GLIBC__ | 171 | bbox_prepare_main(); |
| 195 | (*(int **)&bb_errno) = __errno_location(); | 172 | return $main(argc, argv); |
| 196 | #endif | ||
| 197 | return $main(argc, argv); | ||
| 198 | } | 173 | } |
| 199 | " >"$sharedlib_dir/applet.c" | 174 | " >"$sharedlib_dir/applet.c" |
| 200 | 175 | ||
| @@ -215,3 +190,7 @@ int main(int argc, char **argv) | |||
| 215 | 190 | ||
| 216 | done <applet.lst | 191 | done <applet.lst |
| 217 | fi | 192 | fi |
| 193 | |||
| 194 | # libbusybox.so is needed only for -lbusybox at link time, | ||
| 195 | # it is not needed at runtime. Deleting to reduce confusion. | ||
| 196 | rm "$sharedlib_dir"/libbusybox.so >/dev/null | ||
