Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!seismo!lll-lcc!mordor!styx!ames!ucbcad!ucbvax!wsuvm1.BITNET!HOWESDW
From: HOWESDW@wsuvm1.BITNET
Newsgroups: comp.sys.atari.st
Subject: C Compiler Startup Code
Message-ID: <8701082100.AA14694@ucbvax.Berkeley.EDU>
Date: Thu, 8-Jan-87 15:59:34 EST
Article-I.D.: ucbvax.8701082100.AA14694
Posted: Thu Jan  8 15:59:34 1987
Date-Received: Thu, 8-Jan-87 23:38:36 EST
Sender: daemon@ucbvax.BERKELEY.EDU
Reply-To: HOWESDW%WSUVM1.BITNET@forsythe.stanford.edu
Organization: The ARPA Internet
Lines: 54

Received: by WSUVM1 (Mailer X1.23) id 7097; Thu, 08 Jan 87 12:57:14 PLT
Date:         Thu, 08 Jan 87 12:56:28 PLT
From:         Don Howes 
Subject:      C Compiler Startup Code
To:           INFO-ATARI16@SCORE.STANFORD.EDU


In a recent posting, Moshe Braner asked why the code generated by a C
compiler is longer than that for an equivalent assembler program, and if
it would be possible to eliminate the additional code. In a word, the
answer to that is no, since the additional code is generated by the
compiler to handle program startup and termination.

(The following discussion is abstracted from: Rex Jaeschke, 1986,
"Solutions in C", chapter 6, Program Startup and Termination, pp. 169-194.,
see his account for the details)

Unlike other programming languages, C does not make a distinction beteen
the main() function and other C functions. In addition, the ability to pass
arguments to main() (argc, argv) suggests the presence of additional code
which calls main() and acts as the actual entry point for the program. This
code, generally called _main, is the startup code for the compiler and is
present in every program generated by the compiler.

The startup code preforms a number of tasks, such as:
(1) setting up the stack for the definition of auto variables and the storage
    of function argument lists.
(2) reserving space for the heap, to perform dynamic memory allocation by
    malloc() and calloc().
(3) ensuring the correct opening of the files, "stdin", "stdout", "stderr".
(4) passing "argc" and "argv" to main().
(5) ensuring the graceful termination of the program.
(6) an additional series of environment specific functions related to the
    hardware/software environment (variable).

To check for the size of the startup code for your compiler, compile and
link the shortest legal C program:

         main()
         {}

Here are the results from some compilers I have access to, to compare
against:

Ecosoft Eco-C88              (MSDOS)          1536 bytes
Datalight C                  (MSDOS)          2674 bytes
Microsoft C 4.0              (MSDOS)          1986 bytes
Alcyon C (pre 4.14)          (GEM)            6271 bytes

The much larger size for the Alcyon compiler may be related to a more
complex environment, or simply to bloated code. What do other people get
for their ST C compilers?

Don Howes     HOWESDW@WSUVM1  (BITNET)