reviving libbusybox, adding CONFIG_INDIVIDUAL part 4
This commit is contained in:
parent
def8898596
commit
f545be083d
48
Config.in
48
Config.in
@ -311,24 +311,32 @@ config BUILD_LIBBUSYBOX
|
||||
###
|
||||
### Say 'N' if in doubt.
|
||||
|
||||
config FEATURE_SHARED_BUSYBOX
|
||||
bool "Produce additional busybox binary linked against libbusybox"
|
||||
default y if BUILD_LIBBUSYBOX
|
||||
config FEATURE_INDIVIDUAL
|
||||
bool "Produce a binary for each applet, linked against libbusybox"
|
||||
default y
|
||||
depends on !STATIC && BUILD_LIBBUSYBOX
|
||||
help
|
||||
You need to have a working dynamic linker to use this variant.
|
||||
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.
|
||||
|
||||
config LFS
|
||||
bool "Build with Large File Support (for accessing files > 2 GB)"
|
||||
default n
|
||||
select FDISK_SUPPORT_LARGE_DISKS
|
||||
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
|
||||
depends on !STATIC && BUILD_LIBBUSYBOX
|
||||
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'.
|
||||
Build busybox, dynamically linked against libbusybox.so.N.N.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'
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user