<<

Starting a Program

• Two phases from to • Build time From Source to Execution » creates assembly code » assembler creates CSE 410, Spring 2005 » linker creates an Systems • Run time » moves the executable into memory and starts the program http://www.cs.washington.edu/410

Build Time Symbol Table

• You’re experts on compiling from source to assembly and hand crafted assembly • Symbols are names of global variables or labels • Two parts to translating from assembly to (including procedure entry points) machine language: • Symbol table associates symbols with their addresses in the object file » Instruction encoding (including translating pseudoinstructions) • This allows files compiled separately to be linked » Translating labels to addresses

• Label translations go in the symbol table LabelA: 0x01031ff0 bigArray 0x10006000 Modular Program Design The Compiler + Assembler

• Small projects might use only one file • Translate source files to object files » Any time any one line changes, recompile and • Object files reassemble the whole thing » Contain machine instructions (1’s & 0’s) • For larger projects, recompilation time and » Bookkeeping information complexity management is significant • Procedures and variables the object file defines • Solution: split project into modules • Procedures and variables the source files use but are undefined (unresolved references) » compile and assemble modules separately • Debugging information associating machine » link the object files instructions with lines of source code

The Linker Determining Addresses

• Some addresses change during memory layout • The linker’s job is to “stitch together” the • Modules were compiled in isolation object files: • Absolute addresses must be relocated 1. Place the modules in memory space • Object file keeps track of instructions that use 2. Determine the addresses of data and labels absolute addresses 3. Match up references between modules • Creates an executable file text text Resolving References Linker Example main.o area.o • For example, in a word processing program, code: main: code: A=area(5.0) ! Area:return PI*r*r an input module calls a spell check module static data: static data: ! PI = 3.1415 • Module address is unresolved at defined symbols: defined symbols: ! main, PI ! Area • The linker matches unresolved symbols to undefined symbols: undefined symbols: locations in other modules at ! Area ! PI main.exe • In SPIM, “main” is resolved when your header program is loaded code: main:A=area(5.0) Area:return PI*r*r static data: PI = 3.1415 defined symbols: main, PI, Area

Libraries The Executable

• Some code is used so often, it is bundled into • End result of compiling, assembling, and libraries for common access linking: the executable • Libraries contain most of the code you use but » Header, listing the lengths of the other segments didn’t write: e.g., printf() » Text segment • code is (often) merged with yours at » Static data segment link time » Potentially other segments, depending on architecture & OS conventions main.o main.exe libc.a Run Time

• When a program is started ... » Some dynamic linking may occur • some symbols aren’t defined until run time • Windows’ dlls (dynamic link library) » The segments are loaded into memory » The OS transfers control to the program and it runs • We’ll learn a lot more about this during the OS part of the course