fbaec0410b3c79ee8eadb872c0d57c1d26b469ee
[oweals/busybox.git] / docs / busybox.net / FAQ.html
1 <!--#include file="header.html" -->
2
3 <h3>Frequently Asked Questions</h3>
4
5 This is a collection of some of the more frequently asked questions
6 about BusyBox.  Some of the questions even have answers. If you
7 have additions to this FAQ document, we would love to add them,
8
9 <h2>General questions</h2>
10 <ol>
11 <li><a href="#getting_started">How can I get started using BusyBox?</a></li>
12 <li><a href="#configure">How do I configure busybox?</a></li>
13 <li><a href="#build">How do I build BusyBox with a cross-compiler?</a></li>
14 <li><a href="#build_system">How do I build a BusyBox-based system?</a></li>
15 <li><a href="#kernel">Which Linux kernel versions are supported?</a></li>
16 <li><a href="#arch">Which architectures does BusyBox run on?</a></li>
17 <li><a href="#libc">Which C libraries are supported?</a></li>
18 <li><a href="#commercial">Can I include BusyBox as part of the software on my device?</a></li>
19 <li><a href="#external">Where can I find other small utilities since busybox does not include the features I want?</a></li>
20 <li><a href="#demanding">I demand that you to add &lt;favorite feature&gt; right now!   How come you don't answer all my questions on the mailing list instantly?  I demand that you help me with all of my problems <em>Right Now</em>!</a></li>
21 <li><a href="#helpme">I need help with BusyBox!  What should I do?</a></li>
22 <li><a href="#contracts">I need you to add &lt;favorite feature&gt;!  Are the BusyBox developers willing to be paid in order to fix bugs or add in &lt;favorite feature&gt;?  Are you willing to provide support contracts?</a></li>
23 </ol>
24
25 <h2>Troubleshooting</h2>
26 <ol>
27 <li><a href="#bugs">I think I found a bug in BusyBox!  What should I do?!</a></li>
28 <li><a href="#backporting">I'm using an ancient version from the dawn of time and something's broken.  Can you backport fixes for free?</a></li>
29 <li><a href="#init">Busybox init isn't working!</a></li>
30 <li><a href="#sed">I can't configure busybox on my system.</a></li>
31 <li><a href="#job_control">Why do I keep getting "sh: can't access tty; job control turned off" errors?  Why doesn't Control-C work within my shell?</a></li>
32 </ol>
33
34 <h2>Misc. questions</h2>
35 <ol>
36   <li><a href="#tz">How do I change the time zone in busybox?</a></li>
37 </ol>
38
39 <h2>Programming questions</h2>
40 <ol>
41   <li><a href="#goals">What are the goals of busybox?</a></li>
42   <li><a href="#design">What is the design of busybox?</a></li>
43   <li><a href="#source">How is the source code organized?</a>
44     <ul>
45     <li><a href="#source_applets">The applet directories.</a></li>
46     <li><a href="#source_libbb">The busybox shared library (libbb)</a></li>
47     </ul>
48   </li>
49   <li><a href="#optimize">I want to make busybox even smaller, how do I go about it?</a></li>
50   <li><a href="#adding">Adding an applet to busybox</a></li>
51   <li><a href="#standards">What standards does busybox adhere to?</a></li>
52   <li><a href="#portability">Portability.</a></li>
53   <li><a href="#tips">Tips and tricks.</a>
54     <ul>
55     <li><a href="#tips_encrypted_passwords">Encrypted Passwords</a></li>
56     <li><a href="#tips_vfork">Fork and vfork</a></li>
57     <li><a href="#tips_short_read">Short reads and writes</a></li>
58     <li><a href="#tips_memory">Memory used by relocatable code, PIC, and static linking.</a></li>
59     <li><a href="#tips_kernel_headers">Including Linux kernel headers.</a></li>
60     </ul>
61   </li>
62   <li><a href="#who">Who are the BusyBox developers?</a></li>
63 </ol>
64
65
66 <hr />
67 <h1>General questions</h1>
68
69 <hr />
70 <h2><a name="getting_started">How can I get started using BusyBox?</a></h2>
71
72 <p> If you just want to try out busybox without installing it, download the
73     tarball, extract it, run "make defconfig", and then run "make".
74 </p>
75 <p>
76     This will create a busybox binary with almost all features enabled.  To try
77     out a busybox applet, type "./busybox [appletname] [options]", for
78     example "./busybox ls -l" or "./busybox cat LICENSE".  Type "./busybox"
79     to see a command list, and "busybox appletname --help" to see a brief
80     usage message for a given applet.
81 </p>
82 <p>
83     BusyBox uses the name it was invoked under to determine which applet is
84     being invoked.  (Try "mv busybox ls" and then "./ls -l".)  Installing
85     busybox consists of creating symlinks (or hardlinks) to the busybox
86     binary for each applet in busybox, and making sure these links are in
87     the shell's command $PATH.  The special applet name "busybox" (or with
88     any optional suffix, such as "busybox-static") uses the first argument
89     to determine which applet to run, as shown above.
90 </p>
91 <p>
92     BusyBox also has a feature called the
93     <a name="standalone_shell">"standalone shell"</a>, where the busybox
94     shell runs any built-in applets before checking the command path.  This
95     feature is also enabled by "make allyesconfig", and to try it out run
96     the command line "PATH= ./busybox ash".  This will blank your command path
97     and run busybox as your command shell, so the only commands it can find
98     (without an explicit path such as /bin/ls) are the built-in busybox ones.
99     This is another good way to see what's built into busybox.
100     Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH
101     to be set appropriately, depending on whether or not /proc/self/exe is
102     available or not. If you do not have /proc, then point that config option
103     to the location of your busybox binary, usually /bin/busybox.
104     (So if you set it to /proc/self/exe, and happen to be able to chroot into
105     your rootfs, you must mount /proc beforehand.)
106 </p>
107 <p>
108     A typical indication that you set CONFIG_BUSYBOX_EXEC_PATH to proc but
109     forgot to mount proc is:
110 <pre>
111 $ /bin/echo $PATH
112 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
113 $ echo $PATH
114 /bin/sh: echo: not found
115 </pre>
116
117 <hr />
118 <h2><a name="configure">How do I configure busybox?</a></h2>
119
120 <p> Busybox is configured similarly to the linux kernel.  Create a default
121     configuration and then run "make menuconfig" to modify it.  The end
122     result is a .config file that tells the busybox build process what features
123     to include.  So instead of "./configure; make; make install" the equivalent
124     busybox build would be "make defconfig; make; make install".
125 </p>
126
127 <p> Busybox configured with all features enabled is a little under a megabyte
128     dynamically linked on x86.  To create a smaller busybox, configure it with
129     fewer features.  Individual busybox applets cost anywhere from a few
130     hundred bytes to tens of kilobytes.  Disable unneeded applets to save,
131     space, using menuconfig.
132 </p>
133
134 <p>The most important busybox configurators are:</p>
135
136 <ul>
137 <li><p>make <b>defconfig</b> - Create the maximum "sane" configuration.  This
138 enables almost all features, minus things like debugging options and features
139 that require changes to the rest of the system to work (such as selinux or
140 devfs device names).  Use this if you want to start from a full-featured
141 busybox and remove features until it's small enough.</p></li>
142 <li><p>make <b>allnoconfig</b> - Disable everything.  This creates a tiny version
143 of busybox that doesn't do anything.  Start here if you know exactly what
144 you want and would like to select only those features.</p></li>
145 <li><p>make <b>menuconfig</b> - Interactively modify a .config file through a
146 multi-level menu interface.  Use this after one of the previous two.</p></li>
147 </ul>
148
149 <p>Some other configuration options are:</p>
150 <ul>
151 <li><p>make <b>oldconfig</b> - Update an old .config file for a newer version
152 of busybox.</p></li>
153 <li><p>make <b>allyesconfig</b> - Select absolutely everything.  This creates
154 a statically linked version of busybox full of debug code, with dependencies on
155 selinux, using devfs names...  This makes sure everything compiles.  Whether
156 or not the result would do anything useful is an open question.</p></li>
157 <li><p>make <b>allbareconfig</b> - Select all applets but disable all sub-features
158 within each applet.  More build coverage testing.</p></li>
159 <li><p>make <b>randconfig</b> - Create a random configuration for test purposes.</p></li>
160 </ul>
161
162 <p> Menuconfig modifies your .config file through an interactive menu where you can enable or disable
163     busybox features, and get help about each feature.
164
165 <p>
166     To build a smaller busybox binary, run "make menuconfig" and disable the
167     features you don't need.  (Or run "make allnoconfig" and then use
168     menuconfig to add just the features you need.  Don't forget to recompile
169     with "make" once you've finished configuring.)
170 </p>
171
172 <hr />
173 <h2><a name="build">How do I build BusyBox with a cross-compiler?</a></h2>
174
175 <p>
176    To build busybox with a cross-compiler, specify CROSS_COMPILE=&lt;prefix&gt;.
177 </p>
178 <p>
179    CROSS_COMPILE specifies the prefix used for all executables used
180    during compilation. Only gcc and related binutils executables
181    are prefixed with $(CROSS_COMPILE) in the makefiles.
182    CROSS_COMPILE can be set on the command line:
183 </p>
184 <pre>
185    make CROSS_COMPILE=arm-linux-uclibcgnueabi-
186 </pre>
187 <p>
188    Alternatively CROSS_COMPILE can be set in the environment.
189    Default value for CROSS_COMPILE is not to prefix executables.
190 </p>
191 <p>
192    To store the cross-compiler in your .config, set the variable
193    CONFIG_CROSS_COMPILER_PREFIX accordingly in menuconfig or by
194    editing the .config file.
195 </p>
196
197 <hr />
198 <h2><a name="build_system">How do I build a BusyBox-based system?</a></h2>
199
200 <p>
201     BusyBox is a package that replaces a dozen standard packages, but it is
202     not by itself a complete bootable system.  Building an entire Linux
203     distribution from source is a bit beyond the scope of this FAQ, but it
204     understandably keeps cropping up on the mailing list, so here are some
205     pointers.
206 </p>
207 <p>
208     Start by learning how to strip a working system down to the bare essentials
209     needed to run one or two commands, so you know what it is you actually
210     need.  An excellent practical place to do
211     this is the <a href="http://www.tldp.org/HOWTO/Bootdisk-HOWTO/">Linux
212     BootDisk Howto</a>, or for a more theoretical approach try
213     <a href="http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html">From
214     PowerUp to Bash Prompt</a>.
215 </p>
216 <p>
217     To learn how to build a working Linux system entirely from source code,
218     the place to go is the <a href="http://www.linuxfromscratch.org/">Linux
219     From Scratch</a> project.  They have an entire book of step-by-step
220     instructions you can
221     <a href="http://www.linuxfromscratch.org/lfs/view/stable/">read online</a>
222     or
223     <a href="http://www.linuxfromscratch.org/lfs/downloads/stable/">download</a>.
224     Be sure to check out the other sections of their main page, including
225     Beyond Linux From Scratch, Hardened Linux From Scratch, their Hints
226     directory, and their LiveCD project.  (They also have mailing lists which
227     are better sources of answers to Linux-system building questions than
228     the busybox list.)
229 </p>
230 <p>
231     If you want an automated yet customizable system builder which produces
232     a BusyBox and uClibc based system, try
233     <a href="http://buildroot.uclibc.org/">buildroot</a>, which is
234     another project by the maintainer of the uClibc (Erik Andersen).
235     Download the tarball, extract it, unset CC, make.
236     For more instructions, see the website.
237 </p>
238
239 <hr />
240 <h2><a name="kernel">Which Linux kernel versions are supported?</a></h2>
241
242 <p>
243     Full functionality requires Linux 2.4.x or better.  (Earlier versions may
244     still work, but are no longer regularly tested.)  A large fraction of the
245     code should run on just about anything.  While the current code is fairly
246     Linux specific, it should be fairly easy to port the majority of the code
247     to support, say, FreeBSD or Solaris, or Mac OS X, or even Windows (if you
248     are into that sort of thing).
249 </p>
250
251 <hr />
252 <h2><a name="arch">Which architectures does BusyBox run on?</a></h2>
253
254 <p>
255     BusyBox in general will build on any architecture supported by gcc.
256     Kernel module loading for 2.4 Linux kernels is currently
257     limited to ARM, CRIS, H8/300, x86, ia64, x86_64, m68k, MIPS, PowerPC,
258     S390, SH3/4/5, Sparc, v850e, and x86_64 for 2.4.x kernels.
259 </p>
260 <p>
261     With 2.6.x kernels, module loading support should work on all architectures.
262 </p>
263
264 <hr />
265 <h2><a name="libc">Which C libraries are supported?</a></h2>
266
267 <p>
268     On Linux, BusyBox releases are tested against uClibc (0.9.27 or later) and
269     glibc (2.2 or later).  Both should provide full functionality with busybox,
270     and if you find a bug we want to hear about it.
271 </p>
272 <p>
273     Linux-libc5 is no longer maintained (and has no known advantages over
274     uClibc), dietlibc is known to have numerous unfixed bugs, and klibc is
275     missing too many features to build BusyBox.  If you require a small C
276     library for Linux, the busybox developers recommend uClibc.
277 </p>
278 <p>
279     Some BusyBox applets have been built and run under a combination
280     of newlib and libgloss (see
281     <a href="http://www.busybox.net/lists/busybox/2005-March/013759.html">this thread</a>).
282     This is still experimental, but may be supported in a future release.
283 </p>
284
285 <hr />
286 <h2><a name="commercial">Can I include BusyBox as part of the software on my device?</a></h2>
287
288 <p>
289     Yes.  As long as you <a href="http://busybox.net/license.html">fully comply
290     with the generous terms of the GPL BusyBox license</a> you can ship BusyBox
291     as part of the software on your device.
292 </p>
293
294 <hr />
295 <h2><a name="external">Where can I find other small utilities since busybox
296         does not include the features i want?</a></h2>
297
298 <p>
299         we maintain such a <a href="tinyutils.html">list</a> on this site!
300 </p>
301
302 <hr />
303 <h2><a name="demanding">I demand that you to add &lt;favorite feature&gt; right now!   How come you don't answer all my questions on the mailing list instantly?  I demand that you help me with all of my problems <em>Right Now</em>!</a></h2>
304
305 <p>
306     You have not paid us a single cent and yet you still have the product of
307     many years of our work.  We are not your slaves!  We work on BusyBox
308     because we find it useful and interesting.  If you go off flaming us, we
309     will ignore you.
310
311 <hr />
312 <h2><a name="helpme">I need help with BusyBox!  What should I do?</a></h2>
313
314 <p>
315     If you find that you need help with BusyBox, you can ask for help on the
316     BusyBox mailing list at busybox@busybox.net.</p>
317
318 <p> In addition to the mailing list, Erik Andersen (andersee), Manuel Nova
319     (mjn3), Rob Landley (landley), Mike Frysinger (SpanKY), Bernhard Fischer
320     (blindvt), and other long-time BusyBox developers are known to hang out
321     on the uClibc IRC channel: #uclibc on irc.freenode.net.  There is a
322     <a href="http://ibot.Rikers.org/%23uclibc/">web archive of
323     daily logs of the #uclibc IRC channel</a> going back to 2002.
324 </p>
325
326 <p>
327     <b>Please do not send private email to Rob, Erik, Manuel, or the other
328     BusyBox contributors asking for private help unless you are planning on
329     paying for consulting services.</b>
330 </p>
331
332 <p>
333     When we answer questions on the BusyBox mailing list, it helps everyone
334     since people with similar problems in the future will be able to get help
335     by searching the mailing list archives.  Private help is reserved as a paid
336     service.  If you need to use private communication, or if you are serious
337     about getting timely assistance with BusyBox, you should seriously consider
338     paying for consulting services.
339 </p>
340
341 <hr />
342 <h2><a name="contracts">I need you to add &lt;favorite feature&gt;!  Are the BusyBox developers willing to be paid in order to fix bugs or add in &lt;favorite feature&gt;?  Are you willing to provide support contracts?</a></h2>
343
344 <p>
345     Yes we are.  The easy way to sponsor a new feature is to post an offer on
346     the mailing list to see who's interested.  You can also email the project's
347     maintainer and ask them to recommend someone.
348 </p>
349
350 <hr />
351 <h1>Troubleshooting</h1>
352
353 <hr />
354 <h2><a name="bugs">I think I found a bug in BusyBox!  What should I do?</a></h2>
355
356 <p>
357     If you simply need help with using or configuring BusyBox, please submit a
358     detailed description of your problem to the BusyBox mailing list at <a
359     href="mailto:busybox@busybox.net">busybox@busybox.net</a>.
360     Please do not send email to individual developers asking
361     for private help unless you are planning on paying for consulting services.
362     When we answer questions on the BusyBox mailing list, it helps everyone,
363     while private answers help only you...
364 </p>
365
366 <p>
367     Bug reports and new feature patches sometimes get lost when posted to the
368     mailing list, because the developers of BusyBox are busy people and have
369     only so much they can keep in their brains at a time.   You can post a
370     polite reminder after 2-3 days without offending anybody.  If that doesn't
371     result in a solution, please use the
372     <a href="http://bugs.busybox.net/">BusyBox Bug
373     and Patch Tracking System</a> to submit a detailed explanation and we'll
374     get to it as soon as we can.
375 </p>
376
377 <p>
378     Note that bugs entered into the bug system without being mentioned on the
379     mailing list first may languish there for months before anyone even notices
380     them.  We generally go through the bug system when preparing for new
381     development releases, to see what fell through the cracks while we were
382     off writing new features.  (It's a fast/unreliable vs slow/reliable thing.
383     Saves retransits, but the latency sucks.)
384 </p>
385
386 <hr />
387 <h2><a name="backporting">I'm using an ancient version from the dawn of time and something's broken.  Can you backport fixes for free?</a></h2>
388
389 <p>Variants of this one get asked a lot.</p>
390
391 <p>The purpose of the BusyBox mailing list is to develop and improve BusyBox,
392 and we're happy to respond to our users' needs.  But if you're coming to the
393 list for free tech support we're going to ask you to upgrade to a current
394 version before we try to diagnose your problem.</p>
395
396 <p>If you're building BusyBox 0.50 with uClibc 0.9.19 and gcc 1.27 there's a
397 fairly large chance that whatever problem you're seeing has already been fixed.
398 To get that fix, all you have to do is upgrade to a newer version.  If you
399 don't at least _try_ that, you're wasting our time.</p>
400
401 <p>The volunteers are happy to fix any bugs you point out in the current
402 versions because doing so helps everybody and makes the project better.  We
403 want to make the current version work for you.  But diagnosing, debugging, and
404 backporting fixes to old versions isn't something we do for free, because it
405 doesn't help anybody but you.  The cost of volunteer tech support is using a
406 reasonably current version of the project.</p>
407
408 <p>If you don't want to upgrade, you have the complete source code and thus
409 the ability to fix it yourself, or hire a consultant to do it for you.  If you
410 got your version from a vendor who still supports the older version, they can
411 help you.  But there are limits as to what the volunteers will feel obliged to
412 do for you.</p>
413
414 <p>As a rule of thumb, volunteers will generally answer polite questions about
415 a given version for about three years after its release before it's so old
416 we don't remember the answer off the top of our head.  And if you want us to
417 put any _effort_ into tracking it down, we want you to put in a little effort
418 of your own by confirming it's still a problem with the current version.  It's
419 also hard for us to fix a problem of yours if we can't reproduce it because
420 we don't have any systems running an environment that old.</p>
421
422 <p>A consultant will happily set up a special environment just to reproduce
423 your problem, and you can always ask on the list if any of the developers
424 have consulting rates.</p>
425
426 <hr />
427 <h2><a name="init">Busybox init isn't working!</a></h2>
428
429 <p>
430     Init is the first program that runs, so it might be that no programs are
431     working on your new system because of a problem with your cross-compiler,
432     kernel, console settings, shared libraries, root filesystem...  To rule all
433     that out, first build a statically linked version of the following "hello
434     world" program with your cross compiler toolchain:
435 </p>
436 <pre>
437 #include &lt;stdio.h&gt;
438
439 int main(int argc, char *argv)
440 {
441   printf("Hello world!\n");
442   sleep(999999999);
443 }
444 </pre>
445
446 <p>
447     Now try to boot your device with an "init=" argument pointing to your
448     hello world program.  Did you see the hello world message?  Until you
449     do, don't bother messing with busybox init.
450 </p>
451
452 <p>
453     Once you've got it working statically linked, try getting it to work
454     dynamically linked.  Then read the FAQ entry <a href="#build_system">How
455     do I build a BusyBox-based system?</a>, and the
456     <a href="/downloads/BusyBox.html#item_init">documentation for BusyBox
457     init</a>.
458 </p>
459
460 <hr />
461 <h2><a name="sed">I can't configure busybox on my system.</a></h2>
462
463 <p>
464     Configuring Busybox depends on a recent version of sed.  Older
465     distributions (Red Hat 7.2, Debian 3.0) may not come with a
466     usable version.  Luckily BusyBox can use its own sed to configure itself,
467     although this leads to a bit of a chicken and egg problem.
468     You can work around this by hand-configuring busybox to build with just
469     sed, then putting that sed in your path to configure the rest of busybox
470     with, like so:
471 </p>
472
473 <pre>
474   tar xvjf sources/busybox-x.x.x.tar.bz2
475   cd busybox-x.x.x
476   make allnoconfig
477   make include/bb_config.h
478   echo "CONFIG_SED=y" >> .config
479   echo "#undef ENABLE_SED" >> include/bb_config.h
480   echo "#define ENABLE_SED 1" >> include/bb_config.h
481   make
482   mv busybox sed
483   export PATH=`pwd`:"$PATH"
484 </pre>
485
486 <p>Then you can run "make defconfig" or "make menuconfig" normally.</p>
487
488 <hr />
489 <h2><a name="job_control">Why do I keep getting "sh: can't access tty; job control turned off" errors?  Why doesn't Control-C work within my shell?</a></h2>
490
491 <p>
492     Job control will be turned off since your shell can not obtain a controlling
493     terminal.  This typically happens when you run your shell on /dev/console.
494     The kernel will not provide a controlling terminal on the /dev/console
495     device.  Your should run your shell on a normal tty such as tty1 or ttyS0
496     and everything will work perfectly.  If you <em>REALLY</em> want your shell
497     to run on /dev/console, then you can hack your kernel (if you are into that
498     sortof thing) by changing drivers/char/tty_io.c to change the lines where
499     it sets "noctty = 1;" to instead set it to "0".  I recommend you instead
500     run your shell on a real console...
501 </p>
502
503 <hr />
504 <h1>Misc. questions</h1>
505
506 <hr />
507 <h2><a name="tz">How do I change the time zone in busybox?</a></h2>
508
509 <p>Busybox has nothing to do with the timezone. Please consult your libc
510 documentation. (<a href="http://google.com/search?q=uclibc+glibc+timezone">http://google.com/search?q=uclibc+glibc+timezone</a>).</p>
511
512 <hr />
513 <h1>Development</h1>
514
515 <hr />
516 <h2><a name="goals">What are the goals of busybox?</a></h2>
517
518 <p>Busybox aims to be the smallest and simplest correct implementation of the
519 standard Linux command line tools.  First and foremost, this means the
520 smallest executable size we can manage.  We also want to have the simplest
521 and cleanest implementation we can manage, be <a href="#standards">standards
522 compliant</a>, minimize run-time memory usage (heap and stack), run fast, and
523 take over the world.</p>
524
525 <hr />
526 <h2><a name="design">What is the design of busybox?</a></h2>
527
528 <p>Busybox is like a swiss army knife: one thing with many functions.
529 The busybox executable can act like many different programs depending on
530 the name used to invoke it.  Normal practice is to create a bunch of symlinks
531 pointing to the busybox binary, each of which triggers a different busybox
532 function.  (See <a href="FAQ.html#getting_started">getting started</a> in the
533 FAQ for more information on usage, and <a href="BusyBox.html">the
534 busybox documentation</a> for a list of symlink names and what they do.)
535
536 <p>The "one binary to rule them all" approach is primarily for size reasons: a
537 single multi-purpose executable is smaller then many small files could be.
538 This way busybox only has one set of ELF headers, it can easily share code
539 between different apps even when statically linked, it has better packing
540 efficiency by avoding gaps between files or compression dictionary resets,
541 and so on.</p>
542
543 <p>Work is underway on new options such as "make standalone" to build separate
544 binaries for each applet, and a "libbb.so" to make the busybox common code
545 available as a shared library.  Neither is ready yet at the time of this
546 writing.</p>
547
548 <a name="source"></a>
549
550 <hr />
551 <h2><a name="source_applets">The applet directories</a></h2>
552
553 <p>The directory "applets" contains the busybox startup code (applets.c and
554 busybox.c), and several subdirectories containing the code for the individual
555 applets.</p>
556
557 <p>Busybox execution starts with the main() function in applets/busybox.c,
558 which sets the global variable applet_name to argv[0] and calls
559 run_applet_and_exit() in applets/applets.c.  That uses the applets[] array
560 (defined in include/busybox.h and filled out in include/applets.h) to
561 transfer control to the appropriate APPLET_main() function (such as
562 cat_main() or sed_main()).  The individual applet takes it from there.</p>
563
564 <p>This is why calling busybox under a different name triggers different
565 functionality: main() looks up argv[0] in applets[] to get a function pointer
566 to APPLET_main().</p>
567
568 <p>Busybox applets may also be invoked through the multiplexor applet
569 "busybox" (see busybox_main() in libbb/appletlib.c), and through the
570 standalone shell (grep for STANDALONE_SHELL in applets/shell/*.c).
571 See <a href="FAQ.html#getting_started">getting started</a> in the
572 FAQ for more information on these alternate usage mechanisms, which are
573 just different ways to reach the relevant APPLET_main() function.</p>
574
575 <p>The applet subdirectories (archival, console-tools, coreutils,
576 debianutils, e2fsprogs, editors, findutils, init, loginutils, miscutils,
577 modutils, networking, procps, shell, sysklogd, and util-linux) correspond
578 to the configuration sub-menus in menuconfig.  Each subdirectory contains the
579 code to implement the applets in that sub-menu, as well as a Config.in
580 file defining that configuration sub-menu (with dependencies and help text
581 for each applet), and the makefile segment (Makefile.in) for that
582 subdirectory.</p>
583
584 <p>The run-time --help is stored in usage_messages[], which is initialized at
585 the start of applets/applets.c and gets its help text from usage.h.  During the
586 build this help text is also used to generate the BusyBox documentation (in
587 html, txt, and man page formats) in the docs directory.  See
588 <a href="#adding">adding an applet to busybox</a> for more
589 information.</p>
590
591 <hr />
592 <h2><a name="source_libbb"><b>libbb</b></a></h2>
593
594 <p>Most non-setup code shared between busybox applets lives in the libbb
595 directory.  It's a mess that evolved over the years without much auditing
596 or cleanup.  For anybody looking for a great project to break into busybox
597 development with, documenting libbb would be both incredibly useful and good
598 experience.</p>
599
600 <p>Common themes in libbb include allocation functions that test
601 for failure and abort the program with an error message so the caller doesn't
602 have to test the return value (xmalloc(), xstrdup(), etc), wrapped versions
603 of open(), close(), read(), and write() that test for their own failures
604 and/or retry automatically, linked list management functions (llist.c),
605 command line argument parsing (getopt32.c), and a whole lot more.</p>
606
607 <hr />
608 <h2><a name="optimize">I want to make busybox even smaller, how do I go about it?</a></h2>
609
610 <p>
611         To conserve bytes it's good to know where they're being used, and the
612         size of the final executable isn't always a reliable indicator of
613         the size of the components (since various structures are rounded up,
614         so a small change may not even be visible by itself, but many small
615         savings add up).
616 </p>
617
618 <p>     The busybox Makefile builds two versions of busybox, one of which
619         (busybox_unstripped) has extra information that various analysis tools
620         can use.  (This has nothing to do with CONFIG_DEBUG, leave that off
621         when trying to optimize for size.)
622 </p>
623
624 <p>     The <b>"make bloatcheck"</b> option uses Matt Mackall's bloat-o-meter
625         script to compare two versions of busybox (busybox_unstripped vs
626         busybox_old), and report which symbols changed size and by how much.
627         To use it, first build a base version with <b>"make baseline"</b>.
628         (This creates busybox_old, which should have the original sizes for
629         comparison purposes.)  Then build the new version with your changes
630         and run "make bloatcheck" to see the size differences from the old
631         version.
632 </p>
633 <p>
634         The first line of output has totals: how many symbols were added or
635         removed, how many symbols grew or shrank, the number of bytes added
636         and number of bytes removed by these changes, and finally the total
637         number of bytes difference between the two files.  The remaining
638         lines show each individual symbol, the old and new sizes, and the
639         increase or decrease in size (which results are sorted by).
640 </p>
641 <p>
642         The <b>"make sizes"</b> option produces raw symbol size information for
643         busybox_unstripped.  This is the output from the "nm --size-sort"
644         command (see "man nm" for more information), and is the information
645         bloat-o-meter parses to produce the comparison report above.  For
646         defconfig, this is a good way to find the largest symbols in the tree
647         (which is a good place to start when trying to shrink the code).  To
648         take a closer look at individual applets, configure busybox with just
649         one applet (run "make allnoconfig" and then switch on a single applet
650         with menuconfig), and then use "make sizes" to see the size of that
651         applet's components.
652 </p>
653 <p>
654         The "showasm" command (in the scripts directory) produces an assembly
655         dump of a function, providing a closer look at what changed.  Try
656         "scripts/showasm busybox_unstripped" to list available symbols, and
657         "scripts/showasm busybox_unstripped symbolname" to see the assembly
658         for a sepecific symbol.
659 </p>
660
661 <hr />
662 <h2><a name="adding">Adding an applet to busybox</a></h2>
663
664 <p>To add a new applet to busybox, first pick a name for the applet and
665 a corresponding CONFIG_NAME.  Then do this:</p>
666
667 <ul>
668 <li>Figure out where in the busybox source tree your applet best fits,
669 and put your source code there.  Be sure to use APPLET_main() instead
670 of main(), where APPLET is the name of your applet.</li>
671
672 <li>Add your applet to the relevant Config.in file (which file you add
673 it to determines where it shows up in "make menuconfig").  This uses
674 the same general format as the linux kernel's configuration system.</li>
675
676 <li>Add your applet to the relevant Makefile.in file (in the same
677 directory as the Config.in you chose), using the existing entries as a
678 template and the same CONFIG symbol as you used for Config.in.  (Don't
679 forget "needlibm" or "needcrypt" if your applet needs libm or
680 libcrypt.)</li>
681
682 <li>Add your applet to "include/applets.h", using one of the existing
683 entries as a template.  (Note: this is in alphabetical order.  Applets
684 are found via binary search, and if you add an applet out of order it
685 won't work.)</li>
686
687 <li>Add your applet's runtime help text to "include/usage.h".  You need
688 at least appname_trivial_usage (the minimal help text, always included
689 in the busybox binary when this applet is enabled) and appname_full_usage
690 (extra help text included in the busybox binary with
691 CONFIG_FEATURE_VERBOSE_USAGE is enabled), or it won't compile.
692 The other two help entry types (appname_example_usage and
693 appname_notes_usage) are optional.  They don't take up space in the binary,
694 but instead show up in the generated documentation (BusyBox.html,
695 BusyBox.txt, and the man page BusyBox.1).</li>
696
697 <li>Run menuconfig, switch your applet on, compile, test, and fix the
698 bugs.  Be sure to try both "allyesconfig" and "allnoconfig" (and
699 "allbareconfig" if relevant).</li>
700
701 </ul>
702
703 <hr />
704 <h2><a name="standards">What standards does busybox adhere to?</a></h2>
705
706 <p>The standard we're paying attention to is the "Shell and Utilities"
707 portion of the <a href="http://www.opengroup.org/onlinepubs/009695399/">Open
708 Group Base Standards</a> (also known as the Single Unix Specification version
709 3 or SUSv3).  Note that paying attention isn't necessarily the same thing as
710 following it.</p>
711
712 <p>SUSv3 doesn't even mention things like init, mount, tar, or losetup, nor
713 commonly used options like echo's '-e' and '-n', or sed's '-i'.  Busybox is
714 driven by what real users actually need, not the fact the standard believes
715 we should implement ed or sccs.  For size reasons, we're unlikely to include
716 much internationalization support beyond UTF-8, and on top of all that, our
717 configuration menu lets developers chop out features to produce smaller but
718 very non-standard utilities.</p>
719
720 <p>Also, Busybox is aimed primarily at Linux.  Unix standards are interesting
721 because Linux tries to adhere to them, but portability to dozens of platforms
722 is only interesting in terms of offering a restricted feature set that works
723 everywhere, not growing dozens of platform-specific extensions.  Busybox
724 should be portable to all hardware platforms Linux supports, and any other
725 similar operating systems that are easy to do and won't require much
726 maintenance.</p>
727
728 <p>In practice, standards compliance tends to be a clean-up step once an
729 applet is otherwise finished.  When polishing and testing a busybox applet,
730 we ensure we have at least the option of full standards compliance, or else
731 document where we (intentionally) fall short.</p>
732
733 <hr />
734 <h2><a name="portability">Portability.</a></h2>
735
736 <p>Busybox is a Linux project, but that doesn't mean we don't have to worry
737 about portability.  First of all, there are different hardware platforms,
738 different C library implementations, different versions of the kernel and
739 build toolchain...  The file "include/platform.h" exists to centralize and
740 encapsulate various platform-specific things in one place, so most busybox
741 code doesn't have to care where it's running.</p>
742
743 <p>To start with, Linux runs on dozens of hardware platforms.  We try to test
744 each release on x86, x86-64, arm, power pc, and mips.  (Since qemu can handle
745 all of these, this isn't that hard.)  This means we have to care about a number
746 of portability issues like endianness, word size, and alignment, all of which
747 belong in platform.h.  That header handles conditional #includes and gives
748 us macros we can use in the rest of our code.  At some point in the future
749 we might grow a platform.c, possibly even a platform subdirectory.  As long
750 as the applets themselves don't have to care.</p>
751
752 <p>On a related note, we made the "default signedness of char varies" problem
753 go away by feeding the compiler -funsigned-char.  This gives us consistent
754 behavior on all platforms, and defaults to 8-bit clean text processing (which
755 gets us halfway to UTF-8 support).  NOMMU support is less easily separated
756 (see the tips section later in this document), but we're working on it.</p>
757
758 <p>Another type of portability is build environments: we unapologetically use
759 a number of gcc and glibc extensions (as does the Linux kernel), but these have
760 been picked up by packages like uClibc, TCC, and Intel's C Compiler.  As for
761 gcc, we take advantage of newer compiler optimizations to get the smallest
762 possible size, but we also regression test against an older build environment
763 using the Red Hat 9 image at "http://busybox.net/downloads/qemu".  This has a
764 2.4 kernel, gcc 3.2, make 3.79.1, and glibc 2.3, and is the oldest
765 build/deployment environment we still put any effort into maintaining.  (If
766 anyone takes an interest in older kernels you're welcome to submit patches,
767 but the effort would probably be better spent
768 <a href="http://www.selenic.com/linux-tiny/">trimming
769 down the 2.6 kernel</a>.)  Older gcc versions than that are uninteresting since
770 we now use c99 features, although
771 <a href="http://fabrice.bellard.free.fr/tcc/">tcc</a> might be worth a
772 look.</p>
773
774 <p>We also test busybox against the current release of uClibc.  Older versions
775 of uClibc aren't very interesting (they were buggy, and uClibc wasn't really
776 usable as a general-purpose C library before version 0.9.26 anyway).</p>
777
778 <p>Other unix implementations are mostly uninteresting, since Linux binaries
779 have become the new standard for portable Unix programs.  Specifically,
780 the ubiquity of Linux was cited as the main reason the Intel Binary
781 Compatability Standard 2 died, by the standards group organized to name a
782 successor to ibcs2: <a href="http://www.telly.org/86open/">the 86open
783 project</a>.  That project disbanded in 1999 with the endorsement of an
784 existing standard: Linux ELF binaries.  Since then, the major players at the
785 time (such as <a
786 href="http://www-03.ibm.com/servers/aix/products/aixos/linux/index.html">AIX</a>, <a
787 href="http://www.sun.com/software/solaris/ds/linux_interop.jsp#3">Solaris</a>, and
788 <a href="http://www.onlamp.com/pub/a/bsd/2000/03/17/linuxapps.html">FreeBSD</a>)
789 have all either grown Linux support or folded.</p>
790
791 <p>The major exceptions are newcomer MacOS X, some embedded environments
792 (such as newlib+libgloss) which provide a posix environment but not a full
793 Linux environment, and environments like Cygwin that provide only partial Linux
794 emulation.  Also, some embedded Linux systems run a Linux kernel but amputate
795 things like the /proc directory to save space.</p>
796
797 <p>Supporting these systems is largely a question of providing a clean subset
798 of BusyBox's functionality -- whichever applets can easily be made to
799 work in that environment.  Annotating the configuration system to
800 indicate which applets require which prerequisites (such as procfs) is
801 also welcome.  Other efforts to support these systems (swapping #include
802 files to build in different environments, adding adapter code to platform.h,
803 adding more extensive special-case supporting infrastructure such as mount's
804 legacy mtab support) are handled on a case-by-case basis.  Support that can be
805 cleanly hidden in platform.h is reasonably attractive, and failing that
806 support that can be cleanly separated into a separate conditionally compiled
807 file is at least worth a look.  Special-case code in the body of an applet is
808 something we're trying to avoid.</p>
809
810 <hr />
811 <h2><a name="tips">Programming tips and tricks.</a></h2>
812
813 <p>Various things busybox uses that aren't particularly well documented
814 elsewhere.</p>
815
816 <hr />
817 <h2><a name="tips_encrypted_passwords">Encrypted Passwords</a></h2>
818
819 <p>Password fields in /etc/passwd and /etc/shadow are in a special format.
820 If the first character isn't '$', then it's an old DES style password.  If
821 the first character is '$' then the password is actually three fields
822 separated by '$' characters:</p>
823 <pre>
824   <b>$type$salt$encrypted_password</b>
825 </pre>
826
827 <p>The "type" indicates which encryption algorithm to use: 1 for MD5 and 2 for SHA1.</p>
828
829 <p>The "salt" is a bunch of ramdom characters (generally 8) the encryption
830 algorithm uses to perturb the password in a known and reproducible way (such
831 as by appending the random data to the unencrypted password, or combining
832 them with exclusive or).  Salt is randomly generated when setting a password,
833 and then the same salt value is re-used when checking the password.  (Salt is
834 thus stored unencrypted.)</p>
835
836 <p>The advantage of using salt is that the same cleartext password encrypted
837 with a different salt value produces a different encrypted value.
838 If each encrypted password uses a different salt value, an attacker is forced
839 to do the cryptographic math all over again for each password they want to
840 check.  Without salt, they could simply produce a big dictionary of commonly
841 used passwords ahead of time, and look up each password in a stolen password
842 file to see if it's a known value.  (Even if there are billions of possible
843 passwords in the dictionary, checking each one is just a binary search against
844 a file only a few gigabytes long.)  With salt they can't even tell if two
845 different users share the same password without guessing what that password
846 is and decrypting it.  They also can't precompute the attack dictionary for
847 a specific password until they know what the salt value is.</p>
848
849 <p>The third field is the encrypted password (plus the salt).  For md5 this
850 is 22 bytes.</p>
851
852 <p>The busybox function to handle all this is pw_encrypt(clear, salt) in
853 "libbb/pw_encrypt.c".  The first argument is the clear text password to be
854 encrypted, and the second is a string in "$type$salt$password" format, from
855 which the "type" and "salt" fields will be extracted to produce an encrypted
856 value.  (Only the first two fields are needed, the third $ is equivalent to
857 the end of the string.)  The return value is an encrypted password in
858 /etc/passwd format, with all three $ separated fields.  It's stored in
859 a static buffer, 128 bytes long.</p>
860
861 <p>So when checking an existing password, if pw_encrypt(text,
862 old_encrypted_password) returns a string that compares identical to
863 old_encrypted_password, you've got the right password.  When setting a new
864 password, generate a random 8 character salt string, put it in the right
865 format with sprintf(buffer, "$%c$%s", type, salt), and feed buffer as the
866 second argument to pw_encrypt(text,buffer).</p>
867
868 <hr />
869 <h2><a name="tips_vfork">Fork and vfork</a></h2>
870
871 <p>On systems that haven't got a Memory Management Unit, fork() is unreasonably
872 expensive to implement (and sometimes even impossible), so a less capable
873 function called vfork() is used instead.  (Using vfork() on a system with an
874 MMU is like pounding a nail with a wrench.  Not the best tool for the job, but
875 it works.)</p>
876
877 <p>Busybox hides the difference between fork() and vfork() in
878 libbb/bb_fork_exec.c.  If you ever want to fork and exec, use bb_fork_exec()
879 (which returns a pid and takes the same arguments as execve(), although in
880 this case envp can be NULL) and don't worry about it.  This description is
881 here in case you want to know why that does what it does.</p>
882
883 <p>Implementing fork() depends on having a Memory Management Unit.  With an
884 MMU then you can simply set up a second set of page tables and share the
885 physical memory via copy-on-write.  So a fork() followed quickly by exec()
886 only copies a few pages of the parent's memory, just the ones it changes
887 before freeing them.</p>
888
889 <p>With a very primitive MMU (using a base pointer plus length instead of page
890 tables, which can provide virtual addresses and protect processes from each
891 other, but no copy on write) you can still implement fork.  But it's
892 unreasonably expensive, because you have to copy all the parent process'
893 memory into the new process (which could easily be several megabytes per fork).
894 And you have to do this even though that memory gets freed again as soon as the
895 exec happens.  (This is not just slow and a waste of space but causes memory
896 usage spikes that can easily cause the system to run out of memory.)</p>
897
898 <p>Without even a primitive MMU, you have no virtual addresses.  Every process
899 can reach out and touch any other process' memory, because all pointers are to
900 physical addresses with no protection.  Even if you copy a process' memory to
901 new physical addresses, all of its pointers point to the old objects in the
902 old process.  (Searching through the new copy's memory for pointers and
903 redirect them to the new locations is not an easy problem.)</p>
904
905 <p>So with a primitive or missing MMU, fork() is just not a good idea.</p>
906
907 <p>In theory, vfork() is just a fork() that writeably shares the heap and stack
908 rather than copying it (so what one process writes the other one sees).  In
909 practice, vfork() has to suspend the parent process until the child does exec,
910 at which point the parent wakes up and resumes by returning from the call to
911 vfork().  All modern kernel/libc combinations implement vfork() to put the
912 parent to sleep until the child does its exec.  There's just no other way to
913 make it work: the parent has to know the child has done its exec() or exit()
914 before it's safe to return from the function it's in, so it has to block
915 until that happens.  In fact without suspending the parent there's no way to
916 even store separate copies of the return value (the pid) from the vfork() call
917 itself: both assignments write into the same memory location.</p>
918
919 <p>One way to understand (and in fact implement) vfork() is this: imagine
920 the parent does a setjmp and then continues on (pretending to be the child)
921 until the exec() comes around, then the _exec_ does the actual fork, and the
922 parent does a longjmp back to the original vfork call and continues on from
923 there.  (It thus becomes obvious why the child can't return, or modify
924 local variables it doesn't want the parent to see changed when it resumes.)
925
926 <p>Note a common mistake: the need for vfork doesn't mean you can't have two
927 processes running at the same time.  It means you can't have two processes
928 sharing the same memory without stomping all over each other.  As soon as
929 the child calls exec(), the parent resumes.</p>
930
931 <p>If the child's attempt to call exec() fails, the child should call _exit()
932 rather than a normal exit().  This avoids any atexit() code that might confuse
933 the parent.  (The parent should never call _exit(), only a vforked child that
934 failed to exec.)</p>
935
936 <p>(Now in theory, a nommu system could just copy the _stack_ when it forks
937 (which presumably is much shorter than the heap), and leave the heap shared.
938 Even with no MMU at all
939 In practice, you've just wound up in a multi-threaded situation and you can't
940 do a malloc() or free() on your heap without freeing the other process' memory
941 (and if you don't have the proper locking for being threaded, corrupting the
942 heap if both of you try to do it at the same time and wind up stomping on
943 each other while traversing the free memory lists).  The thing about vfork is
944 that it's a big red flag warning "there be dragons here" rather than
945 something subtle and thus even more dangerous.)</p>
946
947 <hr />
948 <h2><a name="tips_sort_read">Short reads and writes</a></h2>
949
950 <p>Busybox has special functions, bb_full_read() and bb_full_write(), to
951 check that all the data we asked for got read or written.  Is this a real
952 world consideration?  Try the following:</p>
953
954 <pre>while true; do echo hello; sleep 1; done | tee out.txt</pre>
955
956 <p>If tee is implemented with bb_full_read(), tee doesn't display output
957 in real time but blocks until its entire input buffer (generally a couple
958 kilobytes) is read, then displays it all at once.  In that case, we _want_
959 the short read, for user interface reasons.  (Note that read() should never
960 return 0 unless it has hit the end of input, and an attempt to write 0
961 bytes should be ignored by the OS.)</p>
962
963 <p>As for short writes, play around with two processes piping data to each
964 other on the command line (cat bigfile | gzip &gt; out.gz) and suspend and
965 resume a few times (ctrl-z to suspend, "fg" to resume).  The writer can
966 experience short writes, which are especially dangerous because if you don't
967 notice them you'll discard data.  They can also happen when a system is under
968 load and a fast process is piping to a slower one.  (Such as an xterm waiting
969 on x11 when the scheduler decides X is being a CPU hog with all that
970 text console scrolling...)</p>
971
972 <p>So will data always be read from the far end of a pipe at the
973 same chunk sizes it was written in?  Nope.  Don't rely on that.  For one
974 counterexample, see <a href="http://www.faqs.org/rfcs/rfc896.html">rfc 896
975 for Nagle's algorithm</a>, which waits a fraction of a second or so before
976 sending out small amounts of data through a TCP/IP connection in case more
977 data comes in that can be merged into the same packet.  (In case you were
978 wondering why action games that use TCP/IP set TCP_NODELAY to lower the latency
979 on their their sockets, now you know.)</p>
980
981 <hr />
982 <h2><a name="tips_memory">Memory used by relocatable code, PIC, and static linking.</a></h2>
983
984 <p>The downside of standard dynamic linking is that it results in self-modifying
985 code.  Although each executable's pages are mmaped() into a process' address
986 space from the executable file and are thus naturally shared between processes
987 out of the page cache, the library loader (ld-linux.so.2 or ld-uClibc.so.0)
988 writes to these pages to supply addresses for relocatable symbols.  This
989 dirties the pages, triggering copy-on-write allocation of new memory for each
990 processes' dirtied pages.</p>
991
992 <p>One solution to this is Position Independent Code (PIC), a way of linking
993 a file so all the relocations are grouped together.  This dirties fewer
994 pages (often just a single page) for each process' relocations.  The down
995 side is this results in larger executables, which take up more space on disk
996 (and a correspondingly larger space in memory).  But when many copies of the
997 same program are running, PIC dynamic linking trades a larger disk footprint
998 for a smaller memory footprint, by sharing more pages.</p>
999
1000 <p>A third solution is static linking.  A statically linked program has no
1001 relocations, and thus the entire executable is shared between all running
1002 instances.  This tends to have a significantly larger disk footprint, but
1003 on a system with only one or two executables, shared libraries aren't much
1004 of a win anyway.</p>
1005
1006 <p>You can tell the glibc linker to display debugging information about its
1007 relocations with the environment variable "LD_DEBUG".  Try
1008 "LD_DEBUG=help /bin/true" for a list of commands.  Learning to interpret
1009 "LD_DEBUG=statistics cat /proc/self/statm" could be interesting.</p>
1010
1011 <p>For more on this topic, here's Rich Felker:</p>
1012 <blockquote>
1013 <p>Dynamic linking (without fixed load addresses) fundamentally requires
1014 at least one dirty page per dso that uses symbols. Making calls (but
1015 never taking the address explicitly) to functions within the same dso
1016 does not require a dirty page by itself, but will with ELF unless you
1017 use -Bsymbolic or hidden symbols when linking.</p>
1018
1019 <p>ELF uses significant additional stack space for the kernel to pass all
1020 the ELF data structures to the newly created process image. These are
1021 located above the argument list and environment. This normally adds 1
1022 dirty page to the process size.</p>
1023
1024 <p>The ELF dynamic linker has its own data segment, adding one or more
1025 dirty pages. I believe it also performs relocations on itself.</p>
1026
1027 <p>The ELF dynamic linker makes significant dynamic allocations to manage
1028 the global symbol table and the loaded dso's. This data is never
1029 freed. It will be needed again if libdl is used, so unconditionally
1030 freeing it is not possible, but normal programs do not use libdl. Of
1031 course with glibc all programs use libdl (due to nsswitch) so the
1032 issue was never addressed.</p>
1033
1034 <p>ELF also has the issue that segments are not page-aligned on disk.
1035 This saves up to 4k on disk, but at the expense of using an additional
1036 dirty page in most cases, due to a large portion of the first data
1037 page being filled with a duplicate copy of the last text page.</p>
1038
1039 <p>The above is just a partial list of the tiny memory penalties of ELF
1040 dynamic linking, which eventually add up to quite a bit. The smallest
1041 I've been able to get a process down to is 8 dirty pages, and the
1042 above factors seem to mostly account for it (but some were difficult
1043 to measure).</p>
1044 </blockquote>
1045
1046 <hr />
1047 <h2><a name="tips_kernel_headers"></a>Including kernel headers</h2>
1048
1049 <p>The &quot;linux&quot; or &quot;asm&quot; directories of /usr/include
1050 contain Linux kernel
1051 headers, so that the C library can talk directly to the Linux kernel.  In
1052 a perfect world, applications shouldn't include these headers directly, but
1053 we don't live in a perfect world.</p>
1054
1055 <p>For example, Busybox's losetup code wants linux/loop.c because nothing else
1056 #defines the structures to call the kernel's loopback device setup ioctls.
1057 Attempts to cut and paste the information into a local busybox header file
1058 proved incredibly painful, because portions of the loop_info structure vary by
1059 architecture, namely the type __kernel_dev_t has different sizes on alpha,
1060 arm, x86, and so on.  Meaning we either #include &lt;linux/posix_types.h&gt; or
1061 we hardwire #ifdefs to check what platform we're building on and define this
1062 type appropriately for every single hardware architecture supported by
1063 Linux, which is simply unworkable.</p>
1064
1065 <p>This is aside from the fact that the relevant type defined in
1066 posix_types.h was renamed to __kernel_old_dev_t during the 2.5 series, so
1067 to cut and paste the structure into our header we have to #include
1068 &lt;linux/version.h&gt; to figure out which name to use.  (What we actually
1069 do is
1070 check if we're building on 2.6, and if so just use the new 64 bit structure
1071 instead to avoid the rename entirely.)  But we still need the version
1072 check, since 2.4 didn't have the 64 bit structure.</p>
1073
1074 <p>The BusyBox developers spent <u>two years</u> trying to figure
1075 out a clean way to do all this.  There isn't one.  The losetup in the
1076 util-linux package from kernel.org isn't doing it cleanly either, they just
1077 hide the ugliness by nesting #include files.  Their mount/loop.h
1078 #includes &quot;my_dev_t.h&quot;, which #includes &lt;linux/posix_types.h&gt;
1079 and &lt;linux/version.h&gt; just like we do.  There simply is no alternative.
1080 </p>
1081
1082 <p>Just because directly #including kernel headers is sometimes
1083 unavoidable doesn't me we should include them when there's a better
1084 way to do it.  However, block copying information out of the kernel headers
1085 is not a better way.</p>
1086
1087 <hr />
1088 <h2><a name="who">Who are the BusyBox developers?</a></h2>
1089
1090 <p>The following login accounts currently exist on busybox.net.  (I.E. these
1091 people can commit <a href="http://busybox.net/downloads/patches/">patches</a>
1092 into subversion for the BusyBox, uClibc, and buildroot projects.)</p>
1093
1094 <pre>
1095 aldot     :Bernhard Reutner-Fischer
1096 andersen  :Erik Andersen      - uClibc and BuildRoot maintainer.
1097 bug1      :Glenn McGrath
1098 davidm    :David McCullough
1099 gkajmowi  :Garrett Kajmowicz  - uClibc++ maintainer
1100 jbglaw    :Jan-Benedict Glaw
1101 jocke     :Joakim Tjernlund
1102 landley   :Rob Landley
1103 lethal    :Paul Mundt
1104 mjn3      :Manuel Novoa III
1105 osuadmin  :osuadmin
1106 pgf       :Paul Fox
1107 pkj       :Peter Kjellerstedt
1108 prpplague :David Anders
1109 psm       :Peter S. Mazinger
1110 russ      :Russ Dill
1111 sandman   :Robert Griebl
1112 sjhill    :Steven J. Hill
1113 solar     :Ned Ludd
1114 timr      :Tim Riker
1115 tobiasa   :Tobias Anderberg
1116 vapier    :Mike Frysinger
1117 vda       :Denys Vlasenko     - BusyBox maintainer
1118 </pre>
1119
1120 <p>The following accounts used to exist on busybox.net, but don't anymore so
1121 I can't ask /etc/passwd for their names.  Rob Wentworth
1122 &lt;robwen at gmail.com&gt; asked Google and recovered the names:</p>
1123
1124 <pre>
1125 aaronl   :Aaron Lehmann
1126 beppu    :John Beppu
1127 dwhedon  :David Whedon
1128 erik     :Erik Andersen
1129 gfeldman :Gennady Feldman
1130 jimg     :Jim Gleason
1131 kraai    :Matt Kraai
1132 markw    :Mark Whitley
1133 miles    :Miles Bader
1134 proski   :Pavel Roskin
1135 rjune    :Richard June
1136 tausq    :Randolph Chung
1137 vodz     :Vladimir N. Oleynik
1138 </pre>
1139
1140
1141 <br>
1142 <br>
1143 <br>
1144
1145 <!--#include file="footer.html" -->