48 Chapter 2
What Happens When You Compile and Link a Program
Running the Program
Running the Program
An executable file is created after the program has been compiled and
linked. The next step is to run or load the program.
Loading Programs: exec
When you run an executable file created by ld, the program is loaded
into memory by the HP-UX program loader, exec. This routine is
actually a system call and can be called by other programs to load a new
program into the current process space. The exec function performs
many tasks; some of the more important ones are:
• Determine how to load the executable file by looking at its magic
number. (See Also “The a.out File”.)
• Determine where to begin execution of the program — that is, the
entry point — usually in crt0.o. (See Also “The crt0.o Startup
File”.)
• When the program uses shared libraries, the crt0.o startup code
invokes the dynamic loader (dld.sl), which in turn attaches any
required shared libraries. If immediate binding was specified at link
time, then the libraries are bound immediately. If deferred binding
was specified, then libraries are bound as they are referenced. (See
Also “What are Shared Libraries?” on page 126.)For details on exec,
see the exec(2) page in the HP-UX Reference.
Binding Routines to a Program
Since shared library routines and data are not actually contained in the
a.out file, the dynamic loader must attach the routines and data to the
program at run time. Attaching a shared library entails mapping the
shared library code and data into the process's address space, relocating
any pointers in the shared library data that depend on actual virtual
addresses, allocating the bss segment, and binding routines and data
in the shared library to the program.
The dynamic loader binds only those symbols that are reachable during
the execution of the program. This is similar to how archive libraries are
treated by the linker; namely, ld pulls in an object file from an archive
library only if the object file is needed for program execution.