home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / comp / lang / c / 19179 < prev    next >
Encoding:
Text File  |  1993-01-04  |  5.6 KB  |  117 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!mcsun!news.funet.fi!hydra!klaava!wirzeniu
  3. From: wirzeniu@klaava.Helsinki.FI (Lars Wirzenius)
  4. Subject: Re: Followup on size of executables.
  5. Message-ID: <1993Jan4.122907.18756@klaava.Helsinki.FI>
  6. Organization: University of Helsinki
  7. References: <93004.051358RVK@psuvm.psu.edu>
  8. Date: Mon, 4 Jan 1993 12:29:07 GMT
  9. Lines: 106
  10.  
  11. <RVK@psuvm.psu.edu> writes:
  12. [ assembly program is 548 bytes, the equivalent C program is 6762
  13.   bytes ]
  14.  
  15. >This brings us to another question: Who cares for a few K's
  16. >more or less?
  17.  
  18. Plenty of people, including for myself, when there are hundreds of
  19. small programs, each using a few extra kilobytes.  Wastes disk space,
  20. which is a scarce enough resource for me (gotta fit those c.l.c
  21. archives on the same disk :-), so 100 utilities using each 5 kB extra
  22. waste half a megabyte.  Luckily, I don't quite have to suffer that
  23. much, see below.
  24.  
  25. Then again, there are plenty of people who don't care, and with good
  26. reasons: _they_ have the disk space so they don't have to care about
  27. the size that much, and for most larger programs, an overhead of 5 kB
  28. is, well, like a galaxy in the universe.
  29.  
  30. >why do I have to link with everything that's there in stdio.h to
  31. >produce an executable?
  32.  
  33. You don't.  A header is (or should be) just a lot of _declarations_,
  34. and declarations don't take up space in the compiled program, only in
  35. the compiler's symbol table (the part of the compiler that keeps track
  36. of all declared and defined variables, functions, etc).
  37.  
  38. What happens is that when you use any of the standard I/O functions in
  39. your program, not only that function, but also a lot of supporting
  40. functions also get linked into the program.  These functions include
  41. stuff for buffer management, conversion for text-mode files, etc.
  42. This can be a lot of stuff, and might take several kilobytes.  On top
  43. of that, printf is usually one of the biggest functions of those
  44. declared in the stdio library, because it so much more complex than,
  45. for instance, puts.
  46.  
  47. >This brings me to my final question: Is there no way other than
  48. >programming in assembly, to produce a really small executable?
  49. >I would like to use C, but I don't know how (if at all possible)
  50. >to do that.
  51.  
  52. It depends on the operating system and C compiler.  On _my_ machine, a
  53. 386 running Linux, using the same source code you used,
  54.  
  55. >#include <stdio.h>
  56. >int main() { printf("Hello, World\n"); return 0;}
  57.  
  58. I get an executable that is 9216 bytes.  It is actually smaller, but
  59. it is padded to two full 4 kB pages (one for data, one for code) so
  60. that Linux can dynamically load any part of it while running the
  61. program without having to parse the file to find the thousand bytes or
  62. so it actually needs.  (This means that the operating system will only
  63. load those parts of the program that are actually used when running
  64. it, and can re-load them if it has to discard them because it runs out
  65. of memory.  The wonders of good operating systems.)  The extra
  66. kilobyte is a header that contains information about the layout of
  67. various parts in the program file; it has to be a full disk block 
  68. (1 kB) so that the 4 kB pages are aligned on disk block boundaries.
  69.  
  70. Now, for small programs that run quickly, there is actually no need to
  71. be able to reload pages from the executable.  If I link the program so
  72. that it uses an executable format that cannot be loaded, I can get rid
  73. of the 1 kB header and don't have to make the code and data segments
  74. occupy full 4 kB blocks.  The result is an executable of 1228 bytes.
  75.  
  76. Another useful feature of Linux is that it has shared libraries, which
  77. means that the library routines are not actually linked into the
  78. program, but are loaded only once for the whole system and all
  79. programs using the library share the same copy in memory of it.  This
  80. reduced both the size of the disk file and the amount of memory it
  81. uses while running.  (It is possible to link "statically", so that the
  82. shared library is not used; hello linked this way is 37888 bytes, or
  83. 31076 bytes if dynamic loading is disabled.)
  84.  
  85. Yet another thing which helps is that none of the above executables
  86. contains symbol table information, which is useful mostly for
  87. debugging, nor any other information not necessary for running the
  88. program, such as support for source level debuggers.
  89.  
  90. Dynamic linking (and disabling it) and shared libraries (or dynamic
  91. libraries, which are slightly different) are available on most modern
  92. versions of Unix, and, I assume, most other modern operating systems.
  93.  
  94. Under DOS, with at least some versions of Borland's compilers, you can
  95. try similar tricks by using a non-standard startup module, the c0x.obj
  96. file that is linked before any of your own modules and which takes
  97. care of all the stuff that has to be done before calling main.  Stuff
  98. like breaking the command line to an argv array, and initializing the
  99. standard I/O library.
  100.  
  101. The source code for c0x.obj is provided, and you can try hacking it so
  102. that you can link the program without including any of the standard
  103. libraries, if you can write the program so that it doesn't need any
  104. functions thereof.  This means that you have to write everything in
  105. terms of builtin functions, such as those for generating interrupts,
  106. and this can be a pain in the parts below your back, but it might be
  107. worth it if every byte counts.  I believe there is an example of doing
  108. this somewhere in the files that come with the compiler.
  109.  
  110. Note that trying to write a program with no support from the standard
  111. libraries (and that means _any_ support, not even string functions)
  112. will result in a program that is, um, somewhat unportable.
  113.  
  114. --
  115. Lars.Wirzenius@helsinki.fi  (finger wirzeniu@klaava.helsinki.fi)
  116.    MS-DOS, you can't live with it, you can live without it.
  117.