linker and loader upload

Post on 16-Apr-2017

194 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

Linker and Loader

2

Agenda

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

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.

4

Compile Process

5

ELF – Three Types

6

ELF – Format

7

ELF – Two Views

8

ELF – Two Views

9

ELF - Sections

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

11

Static Linker - Allocator Space

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

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

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

15

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

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++

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

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

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

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

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

22

Dynamic Linker - PIE

Compile option: -fpie

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

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

25

• Implicit

Prelink

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

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

28

Process Memory Map

29

Backup

30

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

Relation Between Gcc, Glibc and Binutils

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

32

• Linker Ld under Linux

• Loader /system/bin/linker

Linker and Loader in Android

33

Android Java loader

System.loadlibrary

Runtime.loadlibrary

Runtime.doLoad

JVM_NativeLoad

LoadNativeLibrary

dlopen

nativeLoad

top related