At Wed, 23 Mar 2011 00:40:13 +0000 (GMT), ov3runity <ov3runity%yahoo.de@localhost> wrote: Subject: 2 Questions: Static building: How is it done? / A.out unsupported? > > while trying building 5.1 amd64 i tried out several ways for building > NetBSD statically linked, but none of them worked. Thes way included > running build.sh in an environment with CRUNCHEDPROG=1 (inspirated by > the /rescue Makefile) and of course the way described in the NetBSD > guide, setting LDSTATIC in /etc/mk.conf. > > Sadly neither of these worked, so i want to ask humble what the way > for making static builds is the preferred one these days. Basic static linking of everything still works OK for me, and I've been doing that since the 1.3 days on several different ports including alpha, i386, and sparc. Static linking does indeed provide many advantages, not the least of which is avoiding running a stupidly complex and expensive program for every exec of every process. :-) It also avoids entirely a whole class of complexity problems when dealing with multiple ABIs (not unlike the horrid mess of incompatible DLLs more common on Microsoft Windows). As Matthias mentioned in his reply though a.out is not a possible binary format, especially not for amd64. You really don't need/want it. :-) Also, CRUNCHEDPROG=1 doesn't do what I think you think it does, at least for the overall build. More below. I have made some changes to assist with basic static linking. There is one think you have to turn off in your build if you want a working system: PAM. I also don't build many other things in the base OS, such as AMD, NIS/YP, HESIOD, Postfix, OpenSSH, Kerberos, and of course CSH, but they should all work in static-linked systems. At the moment I still don't build/use INET6 stuff either. I've also integrated the PR which allows the CITRUS iconv library to have compile-time selected charset support built in, though normally I only include UTF8 and UTF1632 locales in my builds. I'm not 100% certain, but at least the following changes to the share/mk files may also be necessary (I have a several more changes in the mk files, but I think these are the only ones mostly relevant to static linking). Basically they replace the unnecessary use of $CPPFLAGS on linker lines with the probably necessary use of $LDSTATIC. They also dis-entangle the overloaded meaning of $DBG and add a better named $OTPIM: Index: share/mk/sys.mk =================================================================== RCS file: /cvs/master/m-NetBSD/main/src/share/mk/sys.mk,v retrieving revision 1.99 diff -u -r1.99 sys.mk --- share/mk/sys.mk 7 Sep 2008 15:54:52 -0000 1.99 +++ share/mk/sys.mk 12 Apr 2010 22:34:58 -0000 @@ -14,9 +14,9 @@ AS?= as AFLAGS?= COMPILE.s?= ${CC} ${AFLAGS} -c -LINK.s?= ${CC} ${AFLAGS} ${LDFLAGS} +LINK.s?= ${CC} ${AFLAGS} ${LDSTATIC} ${LDFLAGS} COMPILE.S?= ${CC} ${AFLAGS} ${CPPFLAGS} -c -traditional-cpp -LINK.S?= ${CC} ${AFLAGS} ${CPPFLAGS} ${LDFLAGS} +LINK.S?= ${CC} ${AFLAGS} ${LDSTATIC} ${LDFLAGS} CC?= cc .if ${MACHINE_ARCH} == "alpha" || \ @@ -31,22 +31,25 @@ ${MACHINE_ARCH} == "powerpc" || \ ${MACHINE_ARCH} == "sparc" || \ ${MACHINE_ARCH} == "sparc64" -DBG?= -O2 +OPTIM?= -O2 .elif ${MACHINE_ARCH} == "sh3el" || ${MACHINE_ARCH} == "sh3eb" # -O2 is too -falign-* zealous for low-memory sh3 machines -DBG?= -Os -freorder-blocks +OPTIM?= -Os -freorder-blocks .elif ${MACHINE_ARCH} == "vax" -DBG?= -O1 -fgcse -fstrength-reduce -fgcse-after-reload +OPTIM?= -O1 -fgcse -fstrength-reduce -fgcse-after-reload .elif ${MACHINE_ARCH} == "m68000" # see src/doc/HACKS for details -DBG?= -O1 +OPTIM?= -O1 .else -DBG?= -O +OPTIM?= -O .endif -CFLAGS?= ${DBG} +DBG?= # nothing -- just defined +OPTIM?= # nothing -- just defined + +CFLAGS?= ${OPTIM} ${DBG} LDFLAGS?= COMPILE.c?= ${CC} ${CFLAGS} ${CPPFLAGS} -c -LINK.c?= ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} +LINK.c?= ${CC} ${CFLAGS} ${LDSTATIC} ${LDFLAGS} CXX?= c++ CXXFLAGS?= ${CFLAGS:N-Wno-traditional:N-Wstrict-prototypes:N-Wmissing-prototypes:N-Wno-pointer-sign:N-ffreestanding:N-std=gnu99} @@ -58,12 +61,12 @@ _CXXSEED?= ${BUILDSEED:D-frandom-seed=${BUILDSEED:Q}/${__ALLSRC3:O:Q}/${.TARGET:Q}} COMPILE.cc?= ${CXX} ${_CXXSEED} ${CXXFLAGS} ${CPPFLAGS} -c -LINK.cc?= ${CXX} ${CXXFLAGS} ${CPPFLAGS} ${LDFLAGS} +LINK.cc?= ${CXX} ${CXXFLAGS} ${LDSTATIC} ${LDFLAGS} OBJC?= ${CC} OBJCFLAGS?= ${CFLAGS} COMPILE.m?= ${OBJC} ${OBJCFLAGS} ${CPPFLAGS} -c -LINK.m?= ${OBJC} ${OBJCFLAGS} ${CPPFLAGS} ${LDFLAGS} +LINK.m?= ${OBJC} ${OBJCFLAGS} ${LDSTATIC} ${LDFLAGS} CPP?= cpp CPPFLAGS?= @@ -72,11 +75,11 @@ FFLAGS?= -O RFLAGS?= COMPILE.f?= ${FC} ${FFLAGS} -c -LINK.f?= ${FC} ${FFLAGS} ${LDFLAGS} +LINK.f?= ${FC} ${FFLAGS} ${LDSTATIC} ${LDFLAGS} COMPILE.F?= ${FC} ${FFLAGS} ${CPPFLAGS} -c -LINK.F?= ${FC} ${FFLAGS} ${CPPFLAGS} ${LDFLAGS} +LINK.F?= ${FC} ${FFLAGS} ${LDSTATIC} ${LDFLAGS} COMPILE.r?= ${FC} ${FFLAGS} ${RFLAGS} -c -LINK.r?= ${FC} ${FFLAGS} ${RFLAGS} ${LDFLAGS} +LINK.r?= ${FC} ${FFLAGS} ${LDSTATIC} ${LDFLAGS} INSTALL?= install @@ -98,7 +101,7 @@ PC?= pc PFLAGS?= COMPILE.p?= ${PC} ${PFLAGS} ${CPPFLAGS} -c -LINK.p?= ${PC} ${PFLAGS} ${CPPFLAGS} ${LDFLAGS} +LINK.p?= ${PC} ${PFLAGS} ${LDSTATIC} ${LDFLAGS} SHELL?= sh Index: share/mk/bsd.sys.mk =================================================================== RCS file: /cvs/master/m-NetBSD/main/src/share/mk/bsd.sys.mk,v retrieving revision 1.179 diff -u -r1.179 bsd.sys.mk --- share/mk/bsd.sys.mk 26 Oct 2008 23:13:24 -0000 1.179 +++ share/mk/bsd.sys.mk 12 Apr 2010 17:25:45 -0000 @@ -99,9 +99,9 @@ HOST_COMPILE.c?=${HOST_CC} ${HOST_CFLAGS} ${HOST_CPPFLAGS} -c HOST_COMPILE.cc?= ${HOST_CXX} ${HOST_CXXFLAGS} ${HOST_CPPFLAGS} -c .if defined(HOSTPROG_CXX) -HOST_LINK.c?= ${HOST_CXX} ${HOST_CXXFLAGS} ${HOST_CPPFLAGS} ${HOST_LDFLAGS} +HOST_LINK.c?= ${HOST_CXX} ${HOST_CXXFLAGS} ${HOST_LDSTATIC} ${HOST_LDFLAGS} .else -HOST_LINK.c?= ${HOST_CC} ${HOST_CFLAGS} ${HOST_CPPFLAGS} ${HOST_LDFLAGS} +HOST_LINK.c?= ${HOST_CC} ${HOST_CFLAGS} ${HOST_LDSTATIC} ${HOST_LDFLAGS} .endif HOST_CXX?= c++ @@ -112,6 +112,9 @@ HOST_LD?= ld HOST_LDFLAGS?= +.if defined(LDSTATIC) +HOST_LDSTATIC?= ${LDSTATIC} +.endif HOST_AR?= ar HOST_RANLIB?= ranlib Index: share/mk/bsd.prog.mk =================================================================== RCS file: /cvs/master/m-NetBSD/main/src/share/mk/bsd.prog.mk,v retrieving revision 1.239.2.2 diff -u -r1.239.2.2 bsd.prog.mk --- share/mk/bsd.prog.mk 6 Jun 2009 22:10:12 -0000 1.239.2.2 +++ share/mk/bsd.prog.mk 12 Apr 2010 22:31:50 -0000 @@ -199,10 +199,14 @@ .if defined(PROG_CXX) PROG= ${PROG_CXX} +# XXX for some compilers and/or object formats the linker needs to +# know about any debug and optimizer flags too _CCLINK= ${CXX} ${_CCLINKFLAGS} .endif .if defined(PROG) +# XXX for some compilers and/or object formats the linker needs to +# know about any debug and optimizer flags too _CCLINK?= ${CC} ${_CCLINKFLAGS} . if defined(MAN) MAN.${PROG}= ${MAN} @@ -267,7 +271,9 @@ OBJCOPTS+= ${OBJCOPTS.${_P}} LDADD+= ${LDADD.${_P}} LDFLAGS+= ${LDFLAGS.${_P}} +.if defined(LDSTATIC.${_P}) LDSTATIC+= ${LDSTATIC.${_P}} +.endif _COPTS.${_P}= ${COPTS} ${COPTS.${_P}} _CPPFLAGS.${_P}= ${CPPFLAGS} ${CPPFLAGS.${_P}} From there I simply set the following in my mk.conf: # set LDSTATIC=-static in order to build a static-only system # # (note you need a *LOT* of disk for '-g' and '-static' -- the debug set # is _huge_) # LDSTATIC = -static HOST_LDSTATIC = -static # after 1.6? (2002/09/22) everything goes dynamic but I don't like that! # MKDYNAMICROOT = no STRIPFLAG= -s I've have gone one step further to build an entirely crunchgen'ed static-linked system, at least in netbsd-4 (still testing this in netbsd-5 -- the build works A-OK and it boots and gives me a working single user shell in virtualbox). The single crunchgen binary I build and run in a ramdisk-based system includes almost all of the entire base set of tools and it is so efficient that an entire system can be contained in as little as 8 MB in a ramdisk. I think the only thing I had to leave out was "named" because of incompatible APIs in the different variants of common code included with both "named" and "dhcpd". I don't use "named" any more though so I don't care one bit about it. I will have to integrate its replacement into my custom netbsd sources though so that I can crunchgen it into embedded platforms like this. $ ls -l *EMBED.gz -r--r--r-- 3 woods wheel 7366921 Apr 1 09:41 netbsd-PCE-ALIX.EMBED.gz There are some useful runtime files still missing from this (as well as all the other stuff I don't normally build in the base OS, though OpenSSH _is_ included in there), but this much gives the basis for a quite capable embedded system, such as an access point or router. From within the above system: # uname -a NetBSD 5.1_STABLE NetBSD 5.1_STABLE (PCE-ALIX.EMBED) #3: Wed Mar 30 21:35:55 PDT 2011 woods@once:/rest/build/woods/once/netbsd-5-i386-i386-ppro-obj/rest/work/woods/m-NetBSD-5/sys/arch/i386/compile/PCE-ALIX.EMBED i386 # df Filesystem 1K-blocks Used Avail %Cap Mounted on /dev/md0a 12415 10651 1764 85% / mfs:3 131 38 87 30% /dev # ls -l /bin/sh -r-xr-xr-x 295 root wheel 9501160 Apr 1 16:40 /bin/sh -- Greg A. Woods Planix, Inc. <woods%planix.com@localhost> +1 250 762-7675 http://www.planix.com/
Attachment:
pgpn_S7jCW274.pgp
Description: PGP signature