anne bracy cs 3410 · • assembler: creates object files (= machine code) • linker: joins object...

60
See: P&H Appendix A1-2, A.3-4 and 2.12 Anne Bracy CS 3410 Computer Science Cornell University The slides are the product of many rounds of teaching CS 3410 by Professors Weatherspoon, Bala, Bracy, McKee, and Sirer.

Upload: others

Post on 30-Apr-2020

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

See:P&HAppendixA1-2,A.3-4and2.12

AnneBracyCS3410

ComputerScienceCornellUniversity

The slides are the product of many rounds of teaching CS 3410 by Professors Weatherspoon, Bala, Bracy, McKee, and Sirer.

Page 2: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

• Compiler:createsassemblyfiles

• Assembler:createsobjectfiles(=machinecode)

• Linker: joinsobjectfilesintooneexecutable

• Loader: bringsexecutableintomemoryandstartsexecutingaprocess

Page 3: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

calc.c

math.c

io.s

calc.s

math.s

Compiler

Csourcefiles

assemblyfiles libc.o

libm.o

io.o

calc.o

math.o

Assembler

obj files

calc.exe

Linker

executableprogram

Executingin

Memory

loader

process

existsondisk

Page 4: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Howdowe(ashumansorcompiler)programontopofagivenISA?

Page 5: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Assemblylanguageà binary machinecodeInput=Program:• MIPSinstructions• Programdata(strings,variables,etc)

Output=objectfile:.ofileinUnix,.obj inWindows,containingMIPSinstructionsinexecutableform

addi r5, r0, 10muli r5, r5, 2addi r5, r5, 15

001000000000010100000000000010100000000000000101001010000100000000100000101001010000000000001111

Page 6: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Assemblylanguageisusedtospecifyprogramsatalow-level

WillIprograminassembly?A:Ido...• ForCS3410(andsomeCS4410/4411)• Forkernelhacking,devicedrivers,GPU,etc.• Forperformance(butcompilersaregettingbetter)• Forhighlytimecriticalsections• Forhardwarewithouthighlevellanguages• Fornew&advancedinstructions:rdtsc,debugregisters,performancecounters,synchronization,...

Page 7: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Input:• assemblyinstructions• psuedo-instructions• dataandlayoutdirectives

Output:ObjectFile

Slightlyhigherlevelthanplainassemblye.g:takescareofdelayslots

(willreorderinstructionsorinsertnops)

Page 8: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Arithmetic/Logical• ADD,ADDU,SUB,SUBU,AND,OR,XOR,NOR,SLT,SLTU• ADDI,ADDIU,ANDI,ORI,XORI,LUI,SLL,SRL,SLLV,SRLV,SRAV,SLTI,SLTIU

• MULT,DIV,MFLO,MTLO,MFHI,MTHIMemoryAccess• LW,LH,LB,LHU,LBU,LWL,LWR• SW,SH,SB,SWL,SWR

Controlflow• BEQ,BNE,BLEZ,BLTZ,BGEZ,BGTZ• J,JR,JAL,JALR,BEQL,BNEL,BLEZL,BGTZL

Special• LL,SC,SYSCALL,BREAK,SYNC,COPROC

Page 9: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Input:• assemblyinstructions• psuedo-instructions• dataandlayoutdirectives

Output:Objectfile

Slightlyhigherlevelthanplainassemblye.g:takescareofdelayslots

(willreorderinstructionsorinsertnops)

Page 10: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Pseudo-InstructionsNOP#donothing• SLLr0,r0,0

MOVEreg,reg #copybetweenregs• ADDr2,r0,r1#copiescontentsofr1tor2

LIreg,imm #loadimmediate(upto32bits)LAreg,label#loadaddress(32bits)Blabel#unconditionalbranchBLTreg,reg,label#branchlessthan• SLTr1,rA,rB #r1=1ifR[rA]<R[rB];o.w.r1=0• BNEr1,r0,label#gotoaddresslabelifr1!=r0;i.t.rA <rB

Page 11: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Input:• assemblyinstructions• psuedo-instructions• dataandlayoutdirectives

Output:Objectfile

Slightlyhigherlevelthanplainassemblye.g:takescareofdelayslots

(willreorderinstructionsorinsertnops)

Page 12: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Programsconsistofsegmentsusedfordifferentpurposes• Text:holdsinstructions• Data:holdsstaticallyallocated

programdatasuchasvariables,strings,etc.

addr1,r2,r3

ori r2,r4,3

...

“cornell cs”

13

25data

text

Page 13: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Assemblyfilesconsistofamixof• Instructions• pseudo-instructions• assembler(data/layout)directives on

howtolayoutvaluesinmemory

AssembledtoanObjectFile• Header• TextSegment• DataSegment• RelocationInformation• SymbolTable• DebuggingInformation

.text

.ent mainmain: la $4, Larray

li $5, 15...li $4, 0jal exit

.end main

.dataLarray:

.long 51, 491, 3991

Page 14: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Assemblyisalow-leveltask• Needtoassembleassemblylanguageintomachinecodebinary.Requires– Assemblylanguageinstructions– pseudo-instructions– AndSpecifylayoutanddatausingassemblerdirectives

• Modern(Harvard VonNeumann)processorsstorebothdataandinstructionsinmemory…butkeptinseparatesegments…andhasseparatecaches

Page 15: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Putitalltogether:Anexampleofcompilingaprogramfromsourcetoassemblytomachineobjectcode.

Page 16: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

add100.c add100.s

Compiler

Csourcefiles

assemblyfiles

add100.o

Assembler

obj filesadd100

Linkerexecutableprogram

Executingin

Memory

loader

process

existsondisk

Page 17: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

int n=100;intmain(int argc,char*argv[]){

int i;intm=n;int sum=0;

for(i =1;i <=m;i++)sum+=i;

printf ("Sum1to%dis%d\n",n,sum);}#Compile[csug03] mipsel-linux-gcc –S add1To100.cexportPATH=${PATH}:/courses/cs3410/mipsel-linux/bin:/courses/cs3410/mips-sim/binorsetenv PATH${PATH}:/courses/cs3410/mipsel-linux/bin:/courses/cs3410/mips-sim/bin

Page 18: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

$L2: lw $2,24($fp)lw $3,28($fp)slt $2,$3,$2bne $2,$0,$L3lw $3,32($fp)lw $2,24($fp)addu $2,$3,$2sw $2,32($fp)lw $2,24($fp)addiu $2,$2,1sw $2,24($fp)b $L2

$L3: la $4,$str0lw $5,28($fp)lw $6,32($fp)jal printfmove $sp,$fplw $31,44($sp)lw $fp,40($sp)addiu $sp,$sp,48j $31

.data

.globl n

.align 2 n: .word 100

.rdata

.align 2$str0: .asciiz

"Sum 1 to %d is %d\n".text.align 2.globl main

main: addiu $sp,$sp,-48sw $31,44($sp)sw $fp,40($sp)move $fp,$spsw $4,48($fp)sw $5,52($fp)la $2,nlw $2,0($2)sw $2,28($fp)sw $0,32($fp)li $2,1sw $2,24($fp)

Example: Add 1 to 100

prologue

epilogue

printf

Page 19: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

$L2: lw $2,24($fp)lw $3,28($fp)slt $2,$3,$2bne $2,$0,$L3lw $3,32($fp)lw $2,24($fp)addu $2,$3,$2sw $2,32($fp)lw $2,24($fp)addiu $2,$2,1sw $2,24($fp)b $L2

$L3: la $4,$str0lw $5,28($fp)lw $6,32($fp)jal printfmove $sp,$fplw $31,44($sp)lw $fp,40($sp)addiu $sp,$sp,48j $31

.data

.globl n

.align 2 n: .word 100

.rdata

.align 2$str0: .asciiz

"Sum 1 to %d is %d\n".text.align 2.globl main

main: addiu $sp,$sp,-48sw $31,44($sp)sw $fp,40($sp)move $fp,$spsw $4,48($fp)sw $5,52($fp)la $2,nlw $2,0($2)sw $2,28($fp)sw $0,32($fp)li $2,1sw $2,24($fp)

Example: Add 1 to 100

prologue

epilogue

printf

$v0

$v0$v1

$v0=100m=100sum=0

i=1

i=1m=100

if(m<i)100<1

v0=1(i)v1=0(sum)

v0=1(0+1)

i=1sum=1

i=2(1+1)i=2

$a0$a1$a2

strm=100sum

$a0$a1

Page 20: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

# Assemble[csug01] mipsel-linux-gcc –c add1To100.s

# Link[csug01] mipsel-linux-gcc –o add1To100 add1To100.o ${LINKFLAGS}# -nostartfiles –nodefaultlibs# -static -mno-xgot -mno-embedded-pic -mno-abicalls -G 0 -DMIPS -Wall

# Load[csug01] simulate add1To100Sum 1 to 100 is 5050MIPS program exits with status 0 (approx. 2007 instructions in 143000 nsec at 14.14034 MHz)

Page 21: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

int n=100;int main(int argc,char*argv[]){

int i,m=n,sum=0;int*A=malloc(4*m+4);for(i =1;i <=m;i++){sum+=i;A[i]=sum;}printf ("Sum1to%dis%d\n",n,sum);

}

Variables Visibility Lifetime Location

Function-Local

Global

Dynamic

Page 22: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

int *trouble(){ int a; …return &a;

}char *evil() { char s[20];gets(s); return s;

}int *bad() { s = malloc(20); … free(s); … return s;

}

//“addr of”somethingonthestack!//invalidafterreturn

//bufferoverflow

//freed(i.e.adangling)pointer

Page 23: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

calc.c

math.c

io.s

calc.s

math.s

Compiler

Csourcefiles

assemblyfiles libc.o

libm.o

io.o

calc.o

math.o

Assembler

obj files

calc.exe

Linker

executableprogram

Executingin

Memory

loader

process

existsondisk

Page 24: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

vector* v = malloc(8);v->x = prompt(“enter x”);v->y = prompt(“enter y”);int c = pi + tnorm(v);print(“result %d”, c);

calc.c

int tnorm(vector* v) {return abs(v->x)+abs(v->y);}

math.c

global variable: pientry point: promptentry point: printentry point: malloc

lib3410.o

systemreserved

stack

systemreserved

code(text)

staticdata

dynamicdata(heap)

Page 25: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Compiller producesassemblyfiles• (containMIPSassembly,pseudo-instructions,directives,etc.)

Assemblerproducesobjectfiles• (containMIPSmachinecode,missingsymbols,somelayoutinformation,etc.)

Linkerproducesexecutablefile• (containsMIPSmachinecode,nomissingsymbols,somelayoutinformation)

Loaderputsprogramintomemoryandjumpstofirstinstruction• (machinecode)

Page 26: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Compiler outputisassemblyfiles

Assembler outputisobj files• Howdoestheassemblerresolvereferences/labels?• Howdoestheassemblerresolveexternalreferences?

Linker joinsobjectfilesintooneexecutable• Howdoesthelinkercombineseparatelycompiledfiles?• Howdoeslinkerresolveunresolvedreferences?• Howdoeslinkerrelocatedataandcodesegments

Loader bringsitintomemoryandstartsexecution• Howdoestheloaderstartexecutingaprogram?• Howdoestheloaderhandlesharedlibraries?

Page 27: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

calc.c

math.c

io.s

calc.s

math.s

Compiler

Csourcefiles

assemblyfiles

io.o

calc.o

math.o

Assembler

obj files

.o=Linux

.objWindows

Outputofassembler:objectfiles• Binarymachinecode,butnotexecutable

Eachfileassembledseparately• Howdoesassemblerhandleforwardreferences?

Page 28: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Howdoestheassemblerhandlelocalreferences?

Page 29: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Two-pass assembly• Firstpassthroughwholeprogram:allocateinstructions,layoutdata,determineaddresses

• Secondpass:emitinstructionsanddata,usinglabeloffsetsfrom1st pass

One-pass (orbackpatch)assembly• Onepassthroughwholeprogram:emittinstructions,emit0forjumpstolabelsnotyetdetermined(keeptrackofthese)

• Backpatch,fillin0offsetsaslabelsaredefined

Page 30: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Example:bne $1,$2,Lsll $0,$0,0

L:addiu $2,$3,0x2

Theassemblerwillchangethistobne $1,$2,+1sll $0,$0,0addiu $2,$3,$0x2

Finalmachinecode0X14220001 #bne0x00000000#sll0x24620002#addiu

000101000010001000000000000000010000000000000000000000000000000000100100011000100000000000000010

Page 31: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Outputofassembler:objectfiles• Binarymachinecode,notexecutable• Howdoesassemblerhandleforwardreferences?• Mayrefertoexternalsymbols• Eachobjectfilehasillusionofitsownaddressspace

– Addresseswillneedtobefixedlater

math.c math.o .o=Linux.objWindows

e.g..text(code)startsataddr 0x00000000.datastarts@addr 0x10000000

needa“symboltable”

math.s

Page 32: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Howdoestheassemblerhandleexternalreferences?

Page 33: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Globallabels: Externallyvisible“exported”symbols• Canbereferencedfromotherobjectfiles• Exportedfunctions,globalvariables

Locallabels: Internalvisibleonlysymbols• Onlyusedwithinthisobjectfile• staticfunctions,staticvariables,looplabels,…

e.g.pi(fromacoupleofslides ago)

e.g.staticfoostaticbarstaticbaz

e.g.$str$L0$L2

Page 34: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Header• Sizeandpositionofpiecesoffile

TextSegment• instructions

DataSegment• staticdata(local/globalvars,strings,constants)

DebuggingInformation• linenumberà codeaddressmap,etc.

SymbolTable• External(exported)references• Unresolved(imported)references

ObjectFile

Page 35: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

int pi=3;int e=2;staticint randomval =7;

externchar*username;externint printf(char*str,…);

int square(int x){…}staticint is_prime(int x){…}int pick_prime(){…}int pick_random(){

returnrandomval;}

math.cgcc -S …math.cgcc -c …math.sobjdump --disassemblemath.oobjdump --syms math.o

CompilerAssemblerglobal

local(tocurrentfile)

external(defined inanother file)

globallocal

Page 36: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

csug01 ~$ mipsel-linux-objdump --disassemble math.omath.o: file format elf32-tradlittlemipsDisassembly of section .text:

00000000<pick_random>:0: 27bdfff8 addiu sp,sp,-84: afbe0000 sw s8,0(sp)8: 03a0f021 move s8,spc: 3c020000 lui v0,0x010: 8c420008 lw v0,8(v0)14: 03c0e821 move sp,s818: 8fbe0000 lw s8,0(sp)1c: 27bd0008 addiu sp,sp,820: 03e00008 jr ra24: 00000000 nop

00000028<square>:28: 27bdfff8 addiu sp,sp,-82c: afbe0000 sw s8,0(sp)30: 03a0f021 move s8,sp34: afc40008 sw a0,8(s8)…

Page 37: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

csug01 ~$ mipsel-linux-objdump --disassemble math.omath.o: file format elf32-tradlittlemipsDisassembly of section .text:

00000000<pick_random>:0: 27bdfff8 addiu sp,sp,-84: afbe0000 sw s8,0(sp)8: 03a0f021 move s8,spc: 3c020000 lui v0,0x010: 8c420008 lw v0,8(v0)14: 03c0e821 move sp,s818: 8fbe0000 lw s8,0(sp)1c: 27bd0008 addiu sp,sp,820: 03e00008 jr ra24: 00000000 nop

00000028<square>:28: 27bdfff8 addiu sp,sp,-82c: afbe0000 sw s8,0(sp)30: 03a0f021 move s8,sp34: afc40008 sw a0,8(s8)…

Address instruction Mem[8]=instruction0x03a0f021(moves8,sp)

prologue

body

epilogue

symbol

resolved(fixed)later

Page 38: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

csug01 ~$ mipsel-linux-objdump --syms math.omath.o: file format elf32-tradlittlemips

SYMBOL TABLE:00000000 l df *ABS* 00000000 math.c00000000 l d .text 00000000 .text00000000 l d .data 00000000 .data00000000 l d .bss 00000000 .bss00000000 l d .mdebug.abi32 00000000 .mdebug.abi3200000008 l O .data 00000004 randomval00000060 l F .text 00000028 is_prime00000000 l d .rodata 00000000 .rodata00000000 l d .comment 00000000 .comment00000000 g O .data 00000004 pi00000004 g O .data 00000004 e00000000 g F .text 00000028 pick_random00000028 g F .text 00000038 square00000088 g F .text 0000004c pick_prime00000000 *UND* 00000000 username00000000 *UND* 00000000 printf

Page 39: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

csug01 ~$ mipsel-linux-objdump --syms math.omath.o: file format elf32-tradlittlemips

SYMBOL TABLE:00000000 l df *ABS* 00000000 math.c00000000 l d .text 00000000 .text00000000 l d .data 00000000 .data00000000 l d .bss 00000000 .bss00000000 l d .mdebug.abi32 00000000 .mdebug.abi3200000008 l O .data 00000004 randomval00000060 l F .text 00000028 is_prime00000000 l d .rodata 00000000 .rodata00000000 l d .comment 00000000 .comment00000000 g O .data 00000004 pi00000004 g O .data 00000004 e00000000 g F .text 00000028 pick_random00000028 g F .text 00000038 square00000088 g F .text 0000004c pick_prime00000000 *UND* 00000000 username00000000 *UND* 00000000 printf

Address l:localg:global

segmentsize

segment

Staticlocalfunc@addr=0x60size=0x28bytes

f:funcO:obj

externalreference

Page 40: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

• Compiler:createsassemblyfiles

• Assembler: createsobjectfiles(=machinecode)

• Linker: joinsobjectfilesintooneexecutable

• Loader: bringsexecutableintomemoryandstartsexecutingaprocess

Page 41: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Howdowelinktogetherseparatelycompiledandassembledmachineobjectfiles?

Page 42: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

calc.c

math.c

io.s

calc.s

math.s

Compiler

Csourcefiles

assemblyfiles libc.o

libm.o

io.o

calc.o

math.o

Assembler

obj files

calc.exe

Linker

executableprogram

Executingin

Memory

loader

process

existsondisk

Page 43: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Linker combinesobjectfilesintoanexecutablefile• Relocateeachobject’stextanddatasegments• Resolveas-yet-unresolvedsymbols• Recordtop-levelentrypointinexecutablefile

Endresult:aprogramondisk,readytoexecute• E.g. ./calc Linux

./calc.exe Windowssimulatecalc ClassMIPSsimulator

.

Page 44: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

main.o...

0C000000210350001b80050C8C040000210470020C000000

...00 T main00 D uname*UND* printf*UND* pi40,JAL, printf4C,LW/gp, pi50,JAL, square

math.o...

210320400C0000001b3014023C04000034040000

...20 T square00 D pi*UND* printf*UND* uname28,JAL, printf30,LUI, uname34,LA, uname

printf.o...

3C T printf

.text

Symbo

ltbl

Relocatio

ninfo

Externalreferencesneedtoberesolved(fixed)

Steps1) FindUNDsymbolsin

symboltable2) Relocatesegmentsthat

collide

e.g.uname@0x00pi@0x00square@0x00main@0x00

Page 45: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

main.o...

0C000000210350001b80050C8C040000210470020C000000

...00 T main00 D uname*UND* printf*UND* pi40,JAL, printf4C,LW/gp, pi50,JAL, square

math.o...

210320400C0000001b3014023C04000034040000

...20 T square00 D pi*UND* printf*UND* uname28,JAL, printf30,LUI, uname34,LA, uname

printf.o...

3C T printf

...210320400C40023C1b3014023C04100034040004

...0C40023C210350001b80050c8C048004210470020C400020

...102010002104033022500102

...

Entry:0040 0100text:0040 0000data:1000 0000

calc.exe

000000030077616B

2 1

BA

3

1

2

3

00400000

00400100

00400200

1000000010000004

LUI1000ORI0004

unamepi

math

main

printf

.text

Symbo

ltbl

Relocatio

ninfo

LW$4,-32764($gp)$4=pi

JALsquare

JALprintfLAuname

Page 46: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Header• locationofmainentrypoint(ifany)

TextSegment• instructions

DataSegment• staticdata(local/globalvars,strings,constants)

RelocationInformation• Instructionsanddatathatdependonactualaddresses• Linkerpatchesthesebitsafterrelocatingsegments

SymbolTable• Exportedandimportedreferences

DebuggingInformation

ObjectFile

Page 47: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Unix• a.out• COFF:CommonObjectFileFormat• ELF:ExecutableandLinkingFormat• …

Windows• PE:PortableExecutable

Allsupportbothexecutableandobjectfiles

Page 48: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

• Compiler:createsassemblyfiles

• Assembler: createsobjectfiles(=machinecode)

• Linker: joinsobjectfilesintooneexecutable

• Loader: bringsexecutableintomemoryandstartsexecutingaprocess

Page 49: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

calc.c

math.c

io.s

calc.s

math.s

Compiler

Csourcefiles

assemblyfiles libc.o

libm.o

io.o

calc.o

math.o

Assembler

obj files

calc.exe

Linker

executableprogram

Executingin

Memory

loader

process

existsondisk

Page 50: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Loader readsexecutablefromdiskintomemory• Initializesregisters,stack,argumentstofirstfunction• Jumpstoentry-point

PartoftheOperatingSystem(OS)

Page 51: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

StaticLibrary:Collectionofobjectfiles(think:likeaziparchive)

Q:Buteveryprogramcontainsentirelibrary!A:Linkerpicksonlyobjectfilesneededtoresolveundefinedreferencesatlinktime

e.g.libc.a containsmanyobjects:• printf.o,fprintf.o,vprintf.o,sprintf.o,snprintf.o,…• read.o,write.o,open.o,close.o,mkdir.o,readdir.o,…• rand.o,exit.o,sleep.o,time.o,….

Page 52: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Q:Buteveryprogramstillcontainspartoflibrary!A:sharedlibraries• executablefilesallpointtosinglesharedlibrary ondisk

• finallinking(andrelocations)donebytheloader

Optimizations:• Librarycompiledatfixednon-zeroaddress

• Jumptableineachprograminsteadofrelocations• Canevenpatchjumpson-the-fly

Page 53: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Directcall:00400010 <main>:

...jal 0x00400330...jal 0x00400620...jal 0x00400330...

00400330 <printf>:...

00400620 <gets>:...

Drawbacks:Linkerorloadermustediteveryuseofasymbol(callsite,globalvar use,…)

Idea:Putallsymbolsinasingle“globaloffsettable”

Codedoeslookupasneeded

Page 54: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

00400010 <main>:...jal 0x00400330...jal 0x00400620...jal 0x00400330...

00400330 <printf>:...

00400620 <gets>:...

GOT:globaloffsettable

0x00400330#printf0x00400620#gets

0x00400010#main

Indirectcall:

Page 55: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

00400010 <main>:...jal 0x00400330...jal 0x00400620...jal 0x00400330...

00400330 <printf>:...

00400620 <gets>:...

GOT:globaloffsettable

0x00400330#printf0x00400620#gets

0x00400010#main

Indirectcall: # data segment

# global offset table# to be loaded# at -32712($gp)# printf = 4+(-32712)+$gp# gets = 8+(-32712)+$gp

048

lw $t9,-32708($gp)jalr $t9

lw $t9,-32704($gp)jalr $t9

lw $t9,-32708($gp)jalr $t9

Page 56: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

00400010 <main>:...jal 0x00400330...jal 0x00400620...jal 0x00400330...

00400330 <printf>:...

00400620 <gets>:...

.got

0x00400330#printf0x00400620#gets

0x00400010#main

Indirectcall: # data segment

# global offset table# to be loaded# at -32712($gp)# printf = 4+(-32712)+$gp# gets = 8+(-32712)+$gp

.word

.word.word

lw $t9,-32708($gp)jalr $t9

lw $t9,-32704($gp)jalr $t9

lw $t9,-32708($gp)jalr $t9

Page 57: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Indirectcallwithon-demanddynamiclinking:00400010 <main>:

...# load address of prints# from .got[1]lw t9, -32708(gp)

# now call itjalr t9...

.got .word 00400888 # open.word 00400888 # prints.word 00400888 # gets.word 00400888 # foo

Page 58: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Indirectcallwithon-demanddynamiclinking:00400010 <main>:

...# load address of prints# from .got[1]lw t9, -32708(gp)# also load the index 1li t8, 1# now call itjalr t9...

.got .word 00400888 # open.word 00400888 # prints.word 00400888 # gets.word 00400888 # foo

...00400888 <dlresolve>:

# t9 = 0x400888# t8 = index of func that# needs to be loaded

# load that func... # t7 = loadfromdisk(t8)

# save func’s address so# so next call goes direct... # got[t8] = t7

# also jump to funcjr t7# it will return directly # to main, not here

Page 59: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Windows:dynamicallyloadedlibrary(DLL)• PEformat

Unix:dynamicsharedobject(DSO)• ELFformat

UnixalsosupportsPositionIndependentCode(PIC)– Programdeterminesitscurrentaddresswheneverneeded(noabsolutejumps!)

– Localdata:accessviaoffsetfromcurrentPC,etc.– Externaldata:indirectionthroughGlobalOffsetTable(GOT)

– …whichinturnisaccessedviaoffsetfromcurrentPC

Page 60: Anne Bracy CS 3410 · • Assembler: creates object files (= machine code) • Linker: joins object files into one executable • Loader: brings executable into memory and starts

Staticlinking• Bigexecutablefiles(all/mostofneededlibrariesinside)

• Don’tbenefitfromupdatestolibrary• Noload-timelinking

Dynamiclinking• Smallexecutablefiles(justpointtosharedlibrary)• Libraryupdatebenefitsallprogramsthatuseit• Load-timecosttodofinallinking

– Butdll codeisprobablyalreadyinmemory– Andcandothelinkingincrementally,on-demand