or data definition can be either a local definition or global definition. Any reference to a symbol outside the object file is known as an external reference.

To keep track of where all the symbols and external references occur, an object file has a symbol table. The linker uses the symbol tables of all input object files to match external references to global definitions.

Local Definitions

A local definition is a definition of a routine or data that is accessible only within the object file in which it is defined. Such a definition cannot be accessed from another object file. Local definitions are used primarily by debuggers, such as adb. More important for this discussion are the global definitions and external references.

Global Definitions

A global definition is a definition of a procedure, function, or data item that can be accessed by code in another object file. For example, the C compiler generates global definitions for all variable and function definitions that are not static. The FORTRAN compiler generates global definitions for subroutines and common blocks. In Pascal, global definitions are generated for external procedures, external variables, and global data areas for each module.

External References

An external reference is an attempt by code in one object file to access a global definition in another object file. A compiler cannot resolve external references because it works on only one source file at a time. Therefore, the compiler simply places external references in an object file's symbol table; the matching of external references to global definitions is left to the linker or loader.

Compiler-Linker Interaction

As described in “Looking Inside a Compiler” (page 18), the compilers automatically call the linker to create an executable file. To see how the compilers call ld, run the compiler with the -v(verbose) option.

For example, compiling a C program to produce an IPF 32-bit share-bound application, produces the output below:

$ cc -v main.c func.c -lm main.c:

/opt/ansic/lbin/ecom -ia64abi all -architecture 32 -ext on -lang c \ -exception off -sysdir /usr/include - inline_power 1 -link_type dynamic \ -fpeval float - tls_dyn on -target_os 11.23 --sys_include /usr/include \ -D__hpux -D__unix -D__ia64=1 -D_BIG_ENDIAN=1 -D_ILP32 -D__HP_cc=60200 \ -D__STDC_EXT__ -D_HPUX_SOURCE -D_INCLUDE_LONGLONG -D_INLINE_ASM \ -D_BIND_LIBCALLS -D_Math_errhandling=MATH_ERREXCEPT -D_FLT_EVAL_METHOD=O \ -ucode hdriver=optlevel%1% -plusolistoption -O106const! -plusolistoption \

-O113moderate! -plusooption -Oq01,al,ag,cn,sz,ic,vo,Mf,Po,es,rs,Rf,Pr,sp,\ in,cl,om,vc,pi,fa,pe,rr,pa,pv,nf,cp,1x,Pg,ug,1u,lb,uj,dn,sg,pt,kt,em,np,ar,\ rp,dl,fs,bp,wp,pc,mp,1r,cx,cr,pi,so,Rc,fa,ft,fe,ap,st,lc,Bl,sr,ib,pl,sd,ll,\ rl,dl,Lt,ol,fl,lm,ts,rd,dp,If! main.c

func.c:

/opt/ansic/lbin/ecom -ia64abi all -architecture 32 -ext on -lang c \

-exception off -sysdir /usr/include - inline_power 1 -link_type dynamic \

-fpeval float - tls_dyn on -target_os 11.23 --sys_include /usr/include \

Compiling Programs on HP-UX: An Example 19