Add /rescue bits. This basically encompasses all of bin and sbin along

with a couple of bits from usr.bin in a crunchgen'd binary.

Submitted by:	Tim Kientzle <kientzle@acm.org>
This commit is contained in:
gordon 2003-06-29 18:35:37 +00:00
parent 040430fc2e
commit 9beb6458f5
6 changed files with 386 additions and 0 deletions

View File

@ -63,6 +63,8 @@
..
proc mode=0555
..
rescue
..
root
..
sbin

View File

@ -100,4 +100,39 @@ __BEGIN_DECLS
const char *getbootfile(void);
__END_DECLS
#ifdef RESCUE
#undef _PATH_DEFPATH
#define _PATH_DEFPATH "/rescue:/usr/bin:/bin"
#undef _PATH_STDPATH
#define _PATH_STDPATH "/rescue:/usr/bin:/bin:/usr/sbin:/sbin"
#undef _PATH_SYSPATH
#define _PATH_SYSPATH "/rescue:/sbin:/usr/sbin"
#undef _PATH_BSHELL
#define _PATH_BSHELL "/rescue/sh"
#undef _PATH_CP
#define _PATH_CP "/rescue/cp"
#undef _PATH_CSHELL
#define _PATH_CSHELL "/rescue/csh"
#undef _PATH_HALT
#define _PATH_HALT "/rescue/halt"
#undef _PATH_IFCONFIG
#define _PATH_IFCONFIG "/rescue/ifconfig"
#undef _PATH_MDCONFIG
#define _PATH_MDCONFIG "/rescue/mdconfig"
#undef _PATH_MOUNT
#define _PATH_MOUNT "/rescue/mount"
#undef _PATH_NEWFS
#define _PATH_NEWFS "/rescue/newfs"
#undef _PATH_RCP
#define _PATH_RCP "/rescue/rcp"
#undef _PATH_REBOOT
#define _PATH_REBOOT "/rescue/reboot"
#undef _PATH_RM
#define _PATH_RM "/rescue/rm"
#undef _PATH_VI
#define _PATH_VI "/rescue/vi"
#undef _PATH_WALL
#define _PATH_WALL "/rescue/wall"
#endif /* RESCUE */
#endif /* !_PATHS_H_ */

6
rescue/Makefile Normal file
View File

@ -0,0 +1,6 @@
# $FreeBSD$
SUBDIR= librescue \
rescue
.include <bsd.subdir.mk>

44
rescue/README Normal file
View File

@ -0,0 +1,44 @@
The /rescue build system here has three goals:
1) Produce a reliable standalone set of /rescue tools.
The contents of /rescue are all statically linked and do not depend on
anything in /bin or /sbin. In particular, they'll continue to
function even if you've hosed your dynamic /bin and /sbin. For
example, note that /rescue/mount runs /rescue/mount_nfs and not
/sbin/mount_nfs. This is more subtle than it looks.
As an added bonus, /rescue is fairly small (thanks to crunchgen) and
includes a number of tools (such as gzip, bzip2, vi) that are not
normally found in /bin and /sbin.
2) Demonstrate robust use of crunchgen.
These Makefiles recompile each of the crunchgen components and include
support for overriding specific library entries. Such techniques
should be useful elsewhere. For example, boot floppies could use this
to conditionally compile out features to reduce executable size.
3) Produce a toolkit suitable for small distributions.
Install /rescue on a CD or CompactFlash disk, and symlink /bin and
/sbin to /rescue to produce a small and fairly complete FreeBSD
system.
These tools have one big disadvantage: being statically linked, they
cannot use some advanced library functions that rely on dynamic
linking. In particular, nsswitch, locales, and pam are likely to all
rely on dynamic linking in the near future.
To compile:
# cd /usr/src/rescue
# make obj
# make
# make install
Note that rebuilds don't always work correctly; if you run into
trouble, try 'make clean' before recompiling.
$FreeBSD$

36
rescue/librescue/Makefile Normal file
View File

@ -0,0 +1,36 @@
#
# $FreeBSD$
#
# Certain library entries have hard-coded references to
# /bin, /sbin, etc, that require those entries to be
# recompiled for use in /rescue. This Makefile
# accomplishes that. Note that this is pure build hackery.
# This library should never be installed, and isn't even linked
# with in the normal way. (See ../rescue/Makefile for details.)
LIB= rescue
NOPROFILE= yes # Don't generate profile version
INTERNALLIB= yes # Don't install this library
CFLAGS+= -DRESCUE
# Flags copied from src/lib/libc and src/lib/libutil
CFLAGS+= -I${.CURDIR}/../../lib/libc/include
CFLAGS+= -I${.CURDIR}/../../include
CFLAGS+= -D__DBINTERFACE_PRIVATE
CFLAGS+= -DINET6
CFLAGS+= -I${.OBJDIR}/../../lib/libc
CFLAGS+= -DPOSIX_MISTAKE
CFLAGS+= -I${.CURDIR}/../../lib/libc/locale
CFLAGS+= -DBROKEN_DES
CFLAGS+= -DPORTMAP
CFLAGS+= -DDES_BUILTIN
CFLAGS+= -DYP
CFLAGS+= -DHESIOD
CFLAGS+= -Wall -Wwrite-strings -Wpointer-arith
.PATH: ${.CURDIR}/../../lib/libc/gen ${.CURDIR}/../../lib/libutil ${.CURDIR}/../../lib/libc/net ${.CURDIR}/../../lib/libc/stdlib
SRCS = exec.c getusershell.c login_class.c popen.c rcmdsh.c sysctl.c system.c
.include <bsd.lib.mk>

263
rescue/rescue/Makefile Normal file
View File

@ -0,0 +1,263 @@
#$FreeBSD$
# @(#)Makefile 8.1 (Berkeley) 6/2/93
PROG= rescue
BINDIR?= /rescue
# Uncomment to exclude tcsh
#NO_TCSH=1
# Shell scripts need #! line to be edited from /bin/sh to /rescue/sh
SCRIPTS= nextboot_FIXED
SCRIPTSNAME_nextboot_FIXED= nextboot.sh
nextboot_FIXED: ../../sbin/reboot/nextboot.sh
sed '1s/\/bin\//\/rescue\//' ${.ALLSRC} > ${.TARGET}
CLEANFILES+= nextboot_FIXED
SCRIPTS+= dhclient_FIXED
SCRIPTSNAME_dhclient_FIXED= dhclient-script
dhclient_FIXED: ../../contrib/isc-dhcp/client/scripts/freebsd
sed '1s/\/bin\//\/rescue\//' ${.ALLSRC} > ${.TARGET}
CLEANFILES+= dhclient_FIXED
#################################################################
#
# General notes:
#
# A number of Make variables are used to generate the crunchgen config file.
#
# CRUNCH_SRCDIRS: lists directories to search for included programs
# CRUNCH_PROGS: lists programs to be included
# CRUNCH_LIBS: libraries to link with
# CRUNCH_BUILDOPTS: generic build options to be added to every program
#
# Special options can be specified for individual programs
# CRUNCH_SRCDIR_$(P): base source directory for program $(P)
# CRUNCH_BUILDOPTS_$(P): additional build options for $(P)
# CRUNCH_ALIAS_$(P): additional names to be used for $(P)
#
# By default, any name appearing in CRUNCH_PROGS or CRUNCH_ALIAS_${P}
# will be used to generate a hard link to the resulting binary.
# Specific links can be suppressed by setting
# CRUNCH_SUPPRESS_LINK_$(NAME) to 1.
#
# Define Makefile variable RESCUE
CRUNCH_BUILDOPTS+= -DRESCUE
# Define compile-time RESCUE symbol when compiling components
CRUNCH_BUILDOPTS+= CRUNCH_CFLAGS=-DRESCUE
#MAKEFLAGS= -m ${.CURDIR} ${.MAKEFLAGS}
# Hackery: 'librescue' exists merely as a tool for appropriately
# recompiling specific library entries. We _know_ they're needed, and
# regular archive searching creates ugly library ordering problems.
# Easiest fix: tell the linker to include them into the executable
# first, so they are guaranteed to override the regular lib entries.
# Note that if 'librescue' hasn't been compiled, we'll just get the
# regular lib entries from libc and friends.
CRUNCH_LIBS+= ${.OBJDIR}/../librescue/*.o
###################################################################
# Programs from stock /bin
#
# WARNING: Changing this list may require adjusting
# /usr/include/paths.h as well! You were warned!
#
CRUNCH_SRCDIRS+=$(.CURDIR)/../../bin $(.CURDIR)/../../usr.bin
CRUNCH_PROGS=cat chflags chio chmod cp date dd df domainname echo ed \
expr getfacl hostname kenv kill ln ls mkdir mv pax ps pwd \
realpath rm rmdir setfacl sh sleep stty sync test
CRUNCH_LIBS+=-lcrypt -lcrypto -ledit -lkvm -ll -lm -ltermcap -lutil
# Additional options for specific programs
CRUNCH_ALIAS_test= [
CRUNCH_ALIAS_sh= -sh
# The -sh alias shouldn't appear in /rescue as a hard link
CRUNCH_SUPPRESS_LINK_-sh=1
CRUNCH_ALIAS_ln= link
CRUNCH_ALIAS_rm= unlink
CRUNCH_ALIAS_ed= red
.if !defined(NO_RCMNDS)
CRUNCH_PROGS+= rcp
.endif
.if !defined(NO_TCSH)
CRUNCH_PROGS+= csh
CRUNCH_ALIAS_csh= -csh tcsh -tcsh
CRUNCH_SUPPRESS_LINK_-csh=1
CRUNCH_SUPPRESS_LINK_-tcsh=1
.endif
#Is rmail of any use at all here? I think not.
#CRUNCH_PROGS+= rmail
###################################################################
# Programs from standard /sbin
#
# WARNING: Changing this list may require adjusting
# /usr/include/paths.h as well! You were warned!
#
# Note that mdmfs and shutdown have their own private 'pathnames.h'
# headers in addition to the standard 'paths.h' header.
#
CRUNCH_SRCDIRS+=$(.CURDIR)/../../sbin
CRUNCH_PROGS+=atm adjkerntz atacontrol badsect camcontrol ccdconfig \
clri comcontrol conscontrol devfs disklabel dmesg dump \
dumpfs dumpon fdisk fore_dnld fsck fsck_ffs fsck_msdosfs fsdb \
fsirand gbde growfs ifconfig ilmid init ip6fw ipf ipfs ipfstat \
ipfw ipmon ipnat kldconfig kldload kldstat kldunload ldconfig \
md5 mdconfig mdmfs mknod mount mount_cd9660 mount_ext2fs \
mount_msdosfs mount_nfs mount_ntfs mount_nullfs mount_portalfs \
mount_std mount_udf mount_umapfs mount_unionfs natd newfs \
newfs_msdos nfsiod nos-tun ping ping6 quotacheck raidctl reboot \
restore rcorder route routed rtquery rtsol savecore shutdown \
slattach spppcontrol startslip swapon sysctl tunefs umount vinum
# crunchgen does not like C++ programs; this should be fixed someday
# CRUNCH_PROGS+= devd
CRUNCH_LIBS+=-lalias -latm -lbsdxml -lcam -lcurses -ldevstat -lipsec -lipx \
-lgeom -lmd -lncp -lreadline -lsbuf -lsmb -lufs -lz
.if ${MACHINE_ARCH} == "i386"
CRUNCH_PROGS+= cxconfig mount_nwfs mount_smbfs
.endif
.if ${MACHINE} == "pc98"
CRUNCH_PROGS+= fdisk_pc98
.endif
.if ${MACHINE_ARCH} == "ia64"
CRUNCH_PROGS+= mca gpt
.endif
.if ${MACHINE_ARCH} == "sparc"
.endif
.if ${MACHINE_ARCH} == "alpha"
.endif
CRUNCH_SRCDIR_atm=$(.CURDIR)/../../sbin/atm/atm
CRUNCH_SRCDIR_fore_dnld=$(.CURDIR)/../../sbin/atm/fore_dnld
CRUNCH_SRCDIR_ilmid=$(.CURDIR)/../../sbin/atm/ilmid
CRUNCH_SRCDIR_rtquery=$(.CURDIR)/../../sbin/routed/rtquery
CRUNCH_ALIAS_reboot= fastboot halt fasthalt
CRUNCH_ALIAS_restore=rrestore
CRUNCH_ALIAS_dump= rdump
CRUNCH_ALIAS_fsck_ffs=fsck_4.2bsd fsck_ufs
CRUNCH_ALIAS_mount_std= mount_devfs mount_fdescfs mount_linprocfs mount_procfs
# dhclient has historically been troublesome...
CRUNCH_PROGS+=dhclient
CRUNCH_BUILDOPTS_dhclient=-DRELEASE_CRUNCH -Dlint
##################################################################
# Programs from stock /usr/bin
#
CRUNCH_SRCDIRS+=$(.CURDIR)/../../usr.bin
CRUNCH_SRCDIRS+=$(.CURDIR)/../../gnu/usr.bin
CRUNCH_PROGS+=wall
CRUNCH_PROGS+=gzip
CRUNCH_ALIAS_gzip=gunzip gzcat zcat
CRUNCH_PROGS+=bzip2
CRUNCH_ALIAS_bzip2=bunzip2 bzcat
CRUNCH_LIBS+=-lbz2
CRUNCH_PROGS+=tar
CRUNCH_PROGS+=vi
CRUNCH_ALIAS_vi=ex
##################################################################
# The following is pretty nearly a generic crunchgen-handling makefile
#
CONF= $(PROG).conf
OUTMK= $(PROG).mk
OUTC= $(PROG).c
OUTPUTS= $(OUTMK) $(OUTC) $(PROG).cache
CRUNCHOBJS= ${.OBJDIR}
.if defined(MAKEOBJDIRPREFIX)
CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
.else
CANONICALOBJDIR:=/usr/obj${.CURDIR}
.endif
NOMAN= true
CLEANFILES+= $(CONF) *.o *.lo *.c *.mk *.cache *.a *.h
# Program names and their aliases contribute hardlinks to 'rescue' executable,
# except for those that get suppressed.
.for P in $(CRUNCH_PROGS)
.ifndef CRUNCH_SUPPRESS_LINK_${P}
LINKS += $(BINDIR)/$(PROG) $(BINDIR)/$(P)
.endif
.for A in $(CRUNCH_ALIAS_$(P))
.ifndef CRUNCH_SUPPRESS_LINK_${A}
LINKS += $(BINDIR)/$(PROG) $(BINDIR)/$(A)
.endif
.endfor
.endfor
all: $(PROG)
exe: $(PROG)
$(CONF): Makefile
echo \# Auto-generated, do not edit >$(.TARGET)
.for D in $(CRUNCH_SRCDIRS)
echo srcdirs $(D) >>$(.TARGET)
.endfor
.ifdef CRUNCH_BUILDOPTS
echo buildopts $(CRUNCH_BUILDOPTS) >>$(.TARGET)
.endif
.ifdef CRUNCH_LIBS
echo libs $(CRUNCH_LIBS) >>$(.TARGET)
.endif
.for P in $(CRUNCH_PROGS)
echo progs $(P) >>$(.TARGET)
.ifdef CRUNCH_SRCDIR_${P}
echo special $(P) srcdir $(CRUNCH_SRCDIR_${P}) >>$(.TARGET)
.endif
.ifdef CRUNCH_BUILDOPTS_${P}
echo special $(P) buildopts $(CRUNCH_BUILDOPTS_${P}) >>$(.TARGET)
.endif
.for A in $(CRUNCH_ALIAS_$(P))
echo ln $(P) $(A) >>$(.TARGET)
.endfor
.endfor
$(OUTPUTS): $(CONF)
MAKEOBJDIRPREFIX=${CRUNCHOBJS} crunchgen -q -m $(OUTMK) -c $(OUTC) $(CONF)
# -m here forces make to treat the bsd.prog.mk and bsd.lib.mk in
# this directory as overrides for the standard shared ones.
$(PROG): $(OUTPUTS)
MAKEOBJDIRPREFIX=${CRUNCHOBJS} make -f $(OUTMK)
objs:
MAKEOBJDIRPREFIX=${CRUNCHOBJS} make -f $(OUTMK) objs
# Use a separate build tree to hold files compiled for this crunchgen binary
# Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't
# get that to cooperate with bsd.prog.mk. Besides, many of the standard
# targets should NOT be propagated into the components.
cleandepend cleandir obj objlink:
.for D in $(CRUNCH_SRCDIRS)
cd ${D} && MAKEOBJDIRPREFIX=${CANONICALOBJDIR} make ${.TARGET}
.endfor
clean:
rm -f ${CLEANFILES}
if [ -e ${.OBJDIR}/$(OUTMK) ]; then \
MAKEOBJDIRPREFIX=${CRUNCHOBJS} make -f $(OUTMK) clean; \
fi
.for D in $(CRUNCH_SRCDIRS) $(EXTRA_SRCDIRS)
cd ${D} && MAKEOBJDIRPREFIX=${CRUNCHOBJS} make clean
.endfor
.include <bsd.prog.mk>