[comp.lang.c] lib

arnold2@violet.berkeley.edu (mchawi) (06/05/88)

intro:
  linking together lots of utility-type files along with the main driver
  produces a fairly large (500K+) program, e.g.,
	"cc main.c stringsubs.o sort.o timesubs.o ttystuff.o"
  each 'utility' file has many functions (e.g., 'stringsubs.c' has
  50 functions). however, the program might use only a few of those.
wanted:
  find a way to link into the program only those functions that are used,
  in order to minimize program size (another case of VAX->ibm-pc porting).
vision:
  have a linker that can extract the code (probably would have to include
  all the data space for each file) into the executable file. perhaps you
  can link from a library you create first? 
alternatives:
	1) break up the utility files. the most obvious solution.
	disadvantages: lots of little files, e.g.
	"cc main.c string1.o string2.o string3.o sort.o ..."; you
	have to remember what functions are where. not elegant.

if i were to use only the functions i needed, i could make a 1 meg program
down to probably 250K. any ideas, system software engineers?
gregory, arnold2@violet.berkeley
:-

leo@philmds.UUCP (Leo de Wit) (06/22/88)

In article <10566@agate.BERKELEY.EDU> arnold2@violet.berkeley.edu (mchawi) writes:
>intro:
>  linking together lots of utility-type files along with the main driver
>  produces a fairly large (500K+) program, e.g.,
>	"cc main.c stringsubs.o sort.o timesubs.o ttystuff.o"
>  each 'utility' file has many functions (e.g., 'stringsubs.c' has
>  50 functions). however, the program might use only a few of those.
>wanted:
>  find a way to link into the program only those functions that are used,
>  in order to minimize program size (another case of VAX->ibm-pc porting).
>vision:
>  have a linker that can extract the code (probably would have to include
>  all the data space for each file) into the executable file. perhaps you
>  can link from a library you create first? 
>alternatives:
>	1) break up the utility files. the most obvious solution.
>	disadvantages: lots of little files, e.g.
>	"cc main.c string1.o string2.o string3.o sort.o ..."; you
>	have to remember what functions are where. not elegant.
>
>if i were to use only the functions i needed, i could make a 1 meg program
>down to probably 250K. any ideas, system software engineers?

Since no one yet replied, I will lay my egg 8-).

You have indicated the solution yourself already: create a library that
contains all the objects (except main probably). If space is critical,
it is also important to keep the utility files, and hence the object
modules small. I'm pretty sure that most linkers can only extract all
functions from a module that is in a library (or you have a clever
linker). So I would suggest the following recipe:

1) Break up the utility files into small coherent pieces (breaking the egg)
2) Compile each object (add salt, milk and beat it up).
3) Put it into the library, using ar on Un*x (pour it into the frying pan).
4) Run ranlib on the library if you have a Un*x system to create a
random access library which speeds up linking (bake it on each side).
5) Link your compiled main with this library and any other library you
need (add ham and cheese and tomatoes and ... and ...).
6) Voila, here's your omelet! ;-)

Note that you don't have to worry about your functions, the library has
them (could even get a contents). What is your problem with little
files?  I think they are much nicer! You can better see what's in them,
they are faster edited, faster compiled. A good idea is to keep all
operations on a object in one file, so you can keep the locally needed
functions static.  The exported functions, variables, constants and
types (i.e. those used by other modules) you should declare in a header
file.
In this way you have a separation between the definition (header) part
and the implementation (C-source module) part.