reviving libbusybox, adding CONFIG_INDIVIDUAL part 4
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 7 Oct 2007 17:06:26 +0000 (17:06 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 7 Oct 2007 17:06:26 +0000 (17:06 -0000)
Config.in
include/applets.h
scripts/trylink

index 64281f03e2c85a532d5dc255922ad32e3683147f..b046812c73bf336c860d19fdb7ba483b106d6d0c 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -311,24 +311,32 @@ config BUILD_LIBBUSYBOX
 ###
 ###      Say 'N' if in doubt.
 
+config FEATURE_INDIVIDUAL
+       bool "Produce a binary for each applet, linked against libbusybox"
+       default y
+       depends on !STATIC && BUILD_LIBBUSYBOX
+       help
+         If your CPU architecture doesn't allow for sharing text/rodata
+         sections of running binaries, but allows for runtime dynamic
+         libraries, this option will allow you to reduce memory footprint
+         when you have many different applets running at once.
+
+         If your CPU architecture allows for sharing text/rodata,
+         having single binary is more optimal.
+
+         Each applet will be a tiny program, dynamically linked
+         against libbusybox.so.N.N.N.
+
+         You need to have a working dynamic linker.
+
 config FEATURE_SHARED_BUSYBOX
        bool "Produce additional busybox binary linked against libbusybox"
-       default y if BUILD_LIBBUSYBOX
+       default y
        depends on !STATIC && BUILD_LIBBUSYBOX
        help
-         You need to have a working dynamic linker to use this variant.
+         Build busybox, dynamically linked against libbusybox.so.N.N.N.
 
-config LFS
-       bool "Build with Large File Support (for accessing files > 2 GB)"
-       default n
-       select FDISK_SUPPORT_LARGE_DISKS
-       help
-         If you want to build BusyBox with large file support, then enable
-         this option.  This will have no effect if your kernel or your C
-         library lacks large file support for large files.  Some of the
-         programs that can benefit from large file support include dd, gzip,
-         cp, mount, tar, and many others.  If you want to access files larger
-         than 2 Gigabytes, enable this option.  Otherwise, leave it set to 'N'.
+         You need to have a working dynamic linker.
 
 ### config BUILD_AT_ONCE
 ###    bool "Compile all sources at once"
@@ -349,6 +357,18 @@ config LFS
 ###
 ###      Say 'N' unless you know what you are doing.
 
+config LFS
+       bool "Build with Large File Support (for accessing files > 2 GB)"
+       default n
+       select FDISK_SUPPORT_LARGE_DISKS
+       help
+         If you want to build BusyBox with large file support, then enable
+         this option.  This will have no effect if your kernel or your C
+         library lacks large file support for large files.  Some of the
+         programs that can benefit from large file support include dd, gzip,
+         cp, mount, tar, and many others.  If you want to access files larger
+         than 2 Gigabytes, enable this option.  Otherwise, leave it set to 'N'.
+
 endmenu
 
 menu 'Debugging Options'
index e88192d245e2e33fbea455c1f62137b99197e20a..ac3f65f6df854de2aa601b494dcaaa59b471f11e 100644 (file)
@@ -30,6 +30,13 @@ s     - suid type:
 # define APPLET_NOEXEC(name,main,l,s,name2)  int main##_main(int argc, char **argv);
 # define APPLET_NOFORK(name,main,l,s,name2)  int main##_main(int argc, char **argv);
 
+#elif defined(NAME_MAIN_CNAME)
+# define APPLET(name,l,s)                    name name##_main name
+# define APPLET_NOUSAGE(name,main,l,s)       name main##_main name
+# define APPLET_ODDNAME(name,main,l,s,name2) name main##_main name2
+# define APPLET_NOEXEC(name,main,l,s,name2)  name main##_main name2
+# define APPLET_NOFORK(name,main,l,s,name2)  name main##_main name2
+
 #elif defined(MAKE_USAGE) && ENABLE_FEATURE_VERBOSE_USAGE
 # define APPLET(name,l,s)                    name##_trivial_usage "\n\n" name##_full_usage "\0"
 # define APPLET_NOUSAGE(name,main,l,s)       "\b\0"
@@ -373,7 +380,7 @@ USE_YES(APPLET_NOFORK(yes, yes, _BB_DIR_USR_BIN, _BB_SUID_NEVER, yes))
 USE_GUNZIP(APPLET_ODDNAME(zcat, gunzip, _BB_DIR_BIN, _BB_SUID_NEVER, zcat))
 USE_ZCIP(APPLET(zcip, _BB_DIR_SBIN, _BB_SUID_NEVER))
 
-#if !defined(PROTOTYPES) && !defined(MAKE_USAGE)
+#if !defined(PROTOTYPES) && !defined(NAME_MAIN_CNAME) && !defined(MAKE_USAGE)
        { NULL }
 };
 #endif
index de60a2cf726757f5d73e7b6537b995818480a02c..a87d6722521514ce9b286bc5fd654930743365cd 100755 (executable)
@@ -137,7 +137,7 @@ if test "$CONFIG_FEATURE_SHARED_BUSYBOX" = y; then
        -o $EXE -Wl,-Map -Wl,$EXE.map \
        -Wl,--warn-common -Wl,--sort-common -Wl,--gc-sections \
        -Wl,--start-group $O_FILES -Wl,--end-group \
-       $l_list -Wl,--verbose \
+       -Wl,--verbose \
        -L"$sharedlib_dir" -lbusybox \
        >/dev/null \
     || {
@@ -148,3 +148,70 @@ if test "$CONFIG_FEATURE_SHARED_BUSYBOX" = y; then
     strip -s --remove-section=.note --remove-section=.comment $EXE -o "$sharedlib_dir/busybox"
     echo "busybox linked against libbusybox: $sharedlib_dir/busybox"
 fi
+
+if test "$CONFIG_FEATURE_INDIVIDUAL" = y; then
+    gcc -DNAME_MAIN_CNAME -E -include include/autoconf.h include/applets.h \
+    | grep -v "^#" \
+    | grep -v "^$" \
+    > applet.lst
+    while read name main cname; do
+
+       test x"$cname" = "x[" && cname=test
+       test x"$cname" = "x[[" && cname=test
+
+       echo "\
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include \"../include/autoconf.h\"
+#include \"../include/usage.h\"
+
+#ifdef __GLIBC__
+/* Make it reside in R/W memory: */
+int *const bb_errno __attribute__ ((section (\".data\")));
+#endif
+
+const char *applet_name = \"$name\";
+
+void bb_show_usage(void)
+{
+       fprintf(stderr, \"Usage: $name \"
+#ifdef ${cname}_trivial_usage
+               ${cname}_trivial_usage
+#endif
+#ifdef ${cname}_full_usage
+               \"\\n\\n\" ${cname}_full_usage
+#endif
+               \"\\n\\n\");
+       exit(1);
+}
+
+int $main(int argc, char **argv);
+
+int main(int argc, char **argv)
+{
+#ifdef __GLIBC__
+        (*(int **)&bb_errno) = __errno_location();
+#endif
+        return $main(argc, argv);
+}
+" >"$sharedlib_dir/applet.c"
+
+       EXE="$sharedlib_dir/$name"
+       try $CC $LDFLAGS "$sharedlib_dir/applet.c" \
+           -o $EXE \
+           -Wl,--warn-common -Wl,--sort-common -Wl,--gc-sections \
+           -L"$sharedlib_dir" -lbusybox \
+           >/dev/null \
+       || {
+           echo "Linking $EXE failed"
+           cat -- $EXE.out
+           exit 1
+       }
+       rm -- "$sharedlib_dir/applet.c" $EXE.out
+       strip -s --remove-section=.note --remove-section=.comment $EXE
+       echo "applet linked against libbusybox: $EXE"
+
+    done <applet.lst
+fi