linker and loader upload

33
1 Linker and Loader

Upload: bin-yang

Post on 16-Apr-2017

193 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Linker and loader   upload

1

Linker and Loader

Page 2: Linker and loader   upload

2

Agenda

• What is Linker and Loader• ELF Format• Static Linker vs Dynamic Linker• Run An Executable File• Backup

Page 3: Linker and loader   upload

3

What is Linker and Loader

A programming tool which combines one or more partial Object Files and libraries into a (more) complete executable object file.

Page 4: Linker and loader   upload

4

Compile Process

Page 5: Linker and loader   upload

5

ELF – Three Types

Page 6: Linker and loader   upload

6

ELF – Format

Page 7: Linker and loader   upload

7

ELF – Two Views

Page 8: Linker and loader   upload

8

ELF – Two Views

Page 9: Linker and loader   upload

9

ELF - Sections

Page 10: Linker and loader   upload

10

• Allocator Space• Resolve symbols• Relocation symbols• Create sections

Static Linker

Using ld in binutils

Printf.oStrlen.oRand.o

foo.ofoo2.ofoo3.o

Static Linker

Main.o

Main.oPrintf.oFoo.o

Test executable file

Run

process

Main.oPrintf.oFoo.o

Test executable file

Page 11: Linker and loader   upload

11

Static Linker - Allocator Space

Page 12: Linker and loader   upload

12

Static Linker – Resolve symbols

Scans input relocatable files from left to right as on command line• Maintains Set E of object files req to form

executable. Set U of unresolved symbols Set D of symbols defined in prev files.• Update E,U and D while scanning input

relocatable files• U must be empty at the end – contents of E

used to form executable

Page 13: Linker and loader   upload

13

Static Linker - RelocationA process of assigning load addresses to various parts of a program and adjusting the code and data in the program to reflect the assigned addresses

Page 14: Linker and loader   upload

14

Static Linker – Relocation

.rel .text .symtab .strtab

Find and iterate .rel sections. Every entry includes of

Typedef struct {Elf32_Addr r_offset;Elf32_Word r_info;} Elf32_Rel

Find the address in .text section by r_offset

Find the symbol index in .symbol section by

r_info

Find the symbol type by r_info

Got information about the responding symbol

in .symbol sectioin

Compute the latest address by symbol type

1

2

3

4

5

6

Page 15: Linker and loader   upload

15

Static Linker – Linker scriptBe passed to GNU ld to exercise greater control over the linking process

Page 16: Linker and loader   upload

16

ld –static crt1.o crti.o crtbeginT.o XXX.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o

Static Linker –Init/Finit Sections

Object Definition Owner RuntimeCrt1.o _start Glibc C、 C++Crti.o .init and .finit section Glibc CCrtn.o .init and .finit section Glibc CcrtbeginT.o .init_array and .finit_array

sectionGcc C++

Crtend.o .init_array and .finit_array section

Gcc C++

Page 17: Linker and loader   upload

17

Static Linker –Init/Finit Sections

Crti.o.init

.finit

a.o.init

.finit

b.o.init

.finit

Crtn.o.init

.finit

A.out

.init

.finit

Linker

Contain the code of beginning for

init function

Contain the code of beginning for finit function

Contain the code of end for init

functionContain code of to init global variable

Contain code of to de-init global

variableContain the code of end for finit

functionInit function

FInit function

Page 18: Linker and loader   upload

18

Static Linker –Init_array/Finit_array Sections

CRTBeginT.o.init_array

.finit_array

a.o.init_array

.finit_array

b.o(b.cpp)

.init_array

.finit_array

CrtEnd.o

.init_array

.finit_arrayA.out

.init_array

.finit_array

Linker

Contain the code of beginning for

init_array functionContain the code of beginning for

finit_array function

Contain the code of end for

init_array functionContain pointer to point global constructor

Contain the code of end for finit_array function

Pointer table.text

Global constructor

Global de-constructor

Contain pointer to point global de-

constructor

pointer1

pointer2pointer3

NumberCollect all pointers who point global constructor into

an array

Page 19: Linker and loader   upload

19

Dynamic Linker

Printf.oStrlen.oRand.o

Libc.so

foo.ofoo2.ofoo3.o

Libtest.so Dynamic Linker

Main.o

Main.oRequire

so

Test executable file

Main.oRequire

so

Test executable file

Printf.oStrlen.oRand.o

Libc.so

foo.ofoo2.ofoo3.o

Libtest.so

Run

process

Page 20: Linker and loader   upload

20

Dynamic Linker - PIC

Position-independent code (PIC) or position-independent executable (PIE) is a body of machine code that, being placed somewhere in the primary memory,

Compile option: -fpic

Code section can be un-modified when load into memory so that it can be shared in different process

Page 21: Linker and loader   upload

21

Dynamic Linker - PLTStands for Procedure Linkage Table which is, put simply, used to call external procedures/functions whose address isn't known in the time of linking, and is left to be resolved by the dynamic linker at run time.

First Cal l Second Call

Page 22: Linker and loader   upload

22

Dynamic Linker - PIE

Compile option: -fpie

Page 23: Linker and loader   upload

23

• Implicit Referred to as static load or load-time dynamic linking.

• Explicit Referred to as dynamic load or run-time dynamic linking.

Dlopen Dlsym Dlclose

Dynamic Linker – Two Mode

Page 24: Linker and loader   upload

24

Dynamic Linker vs Static Linker

Dynamic Static

Memory usage Small Bigger

Storage usage Small Bigger

Performance Low (But with PLT, 5% down)

Update easy Hard

Compatibility Hard No

Page 25: Linker and loader   upload

25

• Implicit

Prelink

Page 26: Linker and loader   upload

26

Run Executable File – Static Linker

• Fork• Exec• Kernel load executable file• Run from the start entry of

executable

Run a executable fileLoad and Map executable file(load_elf_bina

ry)

Do_execve system call

Kernel

Read header of executable file

Read other headers of

executable file

NO

User space

__libc_init

Do_execve system call finished

Return address is set to entry of executable file

Fork process

New Process

If .interp is existing, read the

ld.so(system/bin/linker)

Run the executable file

from entry point(_start)

main

exit

Running and quit

Init main thread

Init globals

system_properties_init

Call preinit_arra

y and init_array

Set __cxa_atexi

t

Page 27: Linker and loader   upload

27

Run Executable File – Dynamic Linker

• Fork• Exec• Kernel load executable file• Kernel load ld.so• Ld.so load the dependent so• Relocation• Run from the start entry of

executable

Run a executable file who relies on other so

Load and Map executable file(load_elf_bina

ry)

Do_execve system call

Kernel

Read header of exe file

Got the path for linker and map it to get entry

point

Yes

User space

main

Return address is set to entry of linker

Fork process

New Process

If .interp is existing, read the ld.so(system/bin/linker)

Run the executable file

from entry point(_start)

exit

Running and quit

Do_execve system call finished

_start -> __linker_init t

Init main thread

Init globals

call_constructors(DT_I

NIT DT_INIT_AR

RAY)

__libc_preinit

__libc_init

prelink_image and

link_image for linker

__linker_init_post_relocation

debuggerd_init

Init globals

init_default_namespac

e

__system_properties_

init

Load needed .So one by one

Page 28: Linker and loader   upload

28

Process Memory Map

Page 29: Linker and loader   upload

29

Backup

Page 30: Linker and loader   upload

30

• Gcc drivers the compile process.• Glibc provide runtime/libc/libm/libthread …• Binutils provides as/ar/ld

Relation Between Gcc, Glibc and Binutils

Page 31: Linker and loader   upload

31

• GPL License• 400K• BinUtils• Gcc• Glibc• Multi-thread• LD(BinUtils)• Loader• System Call

Glibc vs Android Bionic

• APACHE License• 200 K• Ld• Linker• pThread• System Call

Page 32: Linker and loader   upload

32

• Linker Ld under Linux

• Loader /system/bin/linker

Linker and Loader in Android

Page 33: Linker and loader   upload

33

Android Java loader

System.loadlibrary

Runtime.loadlibrary

Runtime.doLoad

JVM_NativeLoad

LoadNativeLibrary

dlopen

nativeLoad