© 2017 МГУ/ВМК/СП. Загрузка динамически скомпонованного исполняемого файла (1/2). snoopjezek:~/samples/2017/linking$ ldd hello-dlib linux-gate.so.1 &gt (0xb772d000) hello.so &gt /home/snoop/lib/hello.so


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
©

2017 МГУ/ВМК/СП

Лекция
0x14

19
апреля

©

2017 МГУ/ВМК/СП

2

[email protected]:~/samples/2017/linking$ readelf
-
l libhello.so


Elf file type is DYN (Shared object file)

Entry point 0x430



Program Headers:




LOAD 0x000000 0x00000000 0x00000000 0x00634 0x00634 R E 0x1000


LOAD 0x000efc 0x00001efc 0x00001efc 0x00120 0x00124 RW 0x1000

...


Section to Segment mapping:


Segment Sections...


00 ... .init .plt .text .fini .rodata ...


01 ... .got .got.plt .data .bss

...

©

2017 МГУ/ВМК/СП

Procedure Linkage Table


GOT
должна быть полностью заполнена при
динамической
компоновке


Не все переменные могут реально использоваться


Обращение к функциям происходит только через
инструкцию
call



возможно выполнить
ленивое
связывание

(
lazy binding
)


В
GOT
вместо адреса реальной функции помещается адрес
функции
-
заглушки


При первом вызове заглушка выполняет поиск адреса реальной
функции, помещает его в
GOT
вместо своего и производит прыжок
по этому адресу


Все следующие вызовы используют реальный адрес из
GOT


Заглушки размещаются в секции
.
plt


По соглашению при вызове заглушки
ebx

должен содержать
базовый адрес
GOT

3

©

2017 МГУ/ВМК/СП

4

[email protected]
:~/samples/2017/linking$
objdump

-
d
-
r
-
M
intel

hello2_pic.o

hello2_pic.o: file format elf32
-
i386



Disassembly of section .text:


00000000
func
�:


0: 53 push
ebx


1: e8
fc

ff
ff

ff

call 2 func+0x2?-2;&#xu3n3;Ã+3;�-2x;㈰


2: R_386_PC32 __x86.get_pc_thunk.bx


6: 81 c3 02 00 00 00add ebx,0x2


8: R_386_GOTPC _GLOBAL_OFFSET_TABLE_


c: 83
ec

10 sub esp,0x10


f: 8b 83 00 00 00 00mov
eax,DWORD

PTR [ebx+0x0]


11: R_386_GOT32
buf


15: ff 30 push DWORD PTR [
eax
]


17: 8d 83 00 00 00 00lea
eax
,[ebx+0x0]


19: R_386_GOTOFF .LC0


1d: 50 push
eax


1e: e8
fc

ff
ff

ff

call 1f func+0x1f&#x-2f3;&#xu3n3;Ã+-;ȃx;1-2;


1f: R_386_PLT32
printf


23: 83 c4 18 add esp,0x18


26: 5b pop
ebx


27: c3 ret


Тип перебазирования
R_386_PLT


новое значение ссылки =

L + A


P


L



абсолютный адрес элемента
PLT
,

используемого для вызова заданного символа


A



дополнительное слагаемое (
addend
),
хранимое непосредственно в байтах ссылки


P


абсолютный адрес ссылки


Наличие такого типа перебазирования в файле
требует от компоновщика создавать
PLT
и
дополнительный элемент в
GOT


Новое значение ссылки



смещение от данной
инструкции до соответствующего элемента
PLT

©

2017 МГУ/ВМК/СП

5

[email protected]:~/samples/2017/linking$ objdump
-
d
-
M intel libhello.so

...

00000400
[email protected]
�:


400: ff a3 0c 00 00 00jmp DWORD PTR [ebx+0xc]


406: 68 00 00 00 00 push 0x0


40b: e9 e0 ff
ff

ff

jmp

3f0 _init+0x30_3i;n3i;&#x-2t3;&#x+30-;x33;〰

...

00000570
func
�:


570: 53 push
ebx


571: e8
ba

fe

ff
ff



576: 81 c3 8a 1a 00 00add ebx,0x1a8a


57c: 83
ec

10 sub esp,0x10


57f: 8b 83 f4 ff
ff

ffmov

eax,DWORD

PTR [ebx
-
0xc]


585: ff 30 push DWORD PTR [
eax
]


587: 8d 83 ac e5 ff
fflea

eax
,[ebx
-
0x1a54]


58d: 50 push
eax


58e: e8 6d
fe

ff
ff

call 400
[email protected]



593: 83 c4 18 add esp,0x18


596: 5b pop
ebx


597: c3 ret

.got

.
got.plt

_GLOBAL_OFFSET_TABLE_

©

2017 МГУ/ВМК/СП

[email protected]:~/samples/2017/linking$ objdump
-
d
-
M intel libhello.so

...

Disassembly of section .
plt
:


000003f0 [email protected]
-
0x10�:


3f0: ff b3 04 00 00 00push DWORD PTR [ebx+0x4]


3f6: ff a3 08 00 00 00jmp DWORD PTR [ebx+0x8]


3fc: 00 00 add BYTE PTR [
eax
],al


...


00000400
[email protected]
�:


400: ff a3 0c 00 00 00jmp DWORD PTR [ebx+0xc]


406: 68 00 00 00 00 push 0x0


40b: e9 e0 ff
ff

ff

jmp

3f0 _init+0x30_3i;n3i;&#x-2t3;&#x+30-;x33;〰

Динамический компоновщик

Первый вызов функции
printf


6


.
got.plt

+4

+8



Ленивое связывание

printf


в модуле
libc.so


Обновление записи в
.
got.plt

адресом
printf

Описание модуля
libhello.so

.
dynamic

©

2017 МГУ/ВМК/СП

7

[email protected]:~/samples/2017/linking$ readelf
-
l hello
-
dlib


Elf file type is EXEC (Executable file)

Entry point 0x8048481



Program Headers:




PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4


INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1


-
linux.so.2]


LOAD 0x000000 0x08048000 0x08048000 0x00708 0x00708 R E 0x1000


LOAD 0x000f00 0x08049f00 0x08049f00 0x00124 0x00128 RW 0x1000


DYNAMIC 0x000f0c 0x08049f0c 0x08049f0c 0x000f0 0x000f0 RW 0x4

...


Section to Segment mapping:


Segment Sections...

...


02 .interp
...

.plt .text .fini .rodata

...


03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss


04 .dynamic

...

©

2017 МГУ/ВМК/СП

Загрузка динамически скомпонованного
исполняемого файла (1/2)


Начальная часть загрузки происходит аналогично, но на
_start
не «идем»


В секции
.
interp

хранится имя программы
-
интерпретатора, т.е. динамического
компоновщика.

Указанный в секции интерпретатор загружается в память.


ld
-
linux.so

скомпонован полностью статически


Компоновщику передается адрес секции
.
dynamic
, где собраны описания
зависимостей, таблиц символов и других служебных данных, используемых в
динамической компоновке.


Содержимое

GOT
, относящееся к переменным, обновляется при загрузке


Необходимые динамические библиотеки ищутся по списку директорий из
переменной окружения
LD_LIBRARY_PATH


Отработавший динамический компоновщик передает управление на точку входа

8

[email protected]
:~/samples/2017/linking$
ldd

hello
-
dlib



linux
-
gate.so.�1 = (0xb772d000)


hello.so

�= /home/snoop/lib/
hello.so

(0xb7725000)


�libc.so.6 = /lib/i386
-
linux
-
gnu/libc.so.6 (0xb754f000)


/lib/ld
-
linux.so.2 (0x80077000)

[email protected]
:~/samples/2017/linking$ cp
libhello.so

$HOME/lib

[email protected]
:~/samples/2017/linking$ export LD_LIBRARY_PATH=$HOME/lib

[email protected]
:~/samples/2017/linking$ ./hello
-
dlib


Hello, world!

©

2017 МГУ/ВМК/СП

Динамическая загрузка библиотек


Загрузка динамической библиотеки возможна
непосредственно во время работы программы


Вся необходимая информация помещена в секции
.
dynsym

и
.dynamic


API
для явного управления загрузкой


void *
dlopen
(const char *filename,
int

flag);


char *
dlerror
(void);


void *
dlsym
(void *handle, const char *symbol);


int

dlclose
(void *handle);


Доступ к переменным и функциям библиотеки посредством
указателей


Необходима возможность экспортировать символы
исполняемого файла


Дублирование описания символов из
.
symtab

в
.
dynsym


9

©

2017 МГУ/ВМК/СП

10

#include
stdio.h



extern char*
buf
;


void
func
() {


printf
("%s",
buf
);

}

hello2.c

all: hello
-
dl


hello
-
dl: hello1
-
dl.o


gcc

-
rdynamic

-
o hello
-
dl hello1
-
dl.o
-
ldl


libhello.so
: hello2_pic.o


gcc

-
shared
-
o
libhello.so

hello2_pic.o


hello2_pic.o:
hello.h

hello2.c


gcc

-
fPIC

-
O3
-
D_FORTIFY_SOURCE=0
-
c
-
o hello2_pic.o hello2.c


hello1
-
dl.o: hello1
-
dl.c


gcc

-
c
-
O3
-
D_FORTIFY_SOURCE=0
-
o hello1
-
dl.o hello1
-
dl.c


Makefile


Преобразуется в ключ компоновщика

-
export
-
dynamic



Указание компоновщику внести в
.
dynsym

все символы, а не только те, которые
участвуют в динамической компоновке


В противном случае
hello2.c
не
«увидит» переменной
buf

©

2017 МГУ/ВМК/СП

Поддержка компоновки времени
загрузки

Трансляторы


(
cpp
,
cc1
,
as
)

hello1
-
dl.c

hello1
-
dl.o

lib
hello
.so


Компоновщик

(
ld
)

hello
-
dl

Динамический компоновщик

(
ld
-
linux.so
)

Частично
скомпонованный
исполняемый объектный
файл

Перемещаемый
объектный файл

Полностью
скомпонованный
исполняемый код в
памяти

hello.h

Загрузчик

ОС
(
execve
)

Трансляторы


(
cpp
,
cc1
,
as
)

hello2.c

hello2_pic.o

Перемещаемый
позиционно
независимый
объектный файл

hello.h

Компоновщик

(
ld
)

Динамическая
библиотека
(разделяемый
объектный файл)

11

libdl.so
,
libc.so
, …


Запуск программы

(передача управления на _
start
)

hello
-
dl
libdl.so

libc.so

linux
-
gate.so
ld
-
linux.so

©

2017 МГУ/ВМК/СП

12

#include
stdio.h


#include
dlfcn.h


#include
stdlib.h



#include "
hello.h
"


char *
buf

= "Hello, world!
\
n";


int

main() {


void *handle;


void (*
func_p
)();


char *error;



/*


*
Динамически загружаем библиотеку,


* содержащую функцию
func
()


*/


handle =
dlopen
("./
libhello.so
", RTLD_LAZY);


if (!handle) {


fprintf
(
stderr
, "
dlopen
: %s
\
n",
dlerror
());


exit(1);


}

hello1
-
dl.c

main:

...


push 1 ; RTLD_LAZY


push .LC0 ; "./
libhello.so
"


call
dlopen


add
esp
, 16


test
eax
,
eax


mov

ebx
,
eax


je .L7 ;
обработка ошибки

...

©

2017 МГУ/ВМК/СП

13



/* получить указатель на функцию
func
() */


func_p

=
dlsym
(handle, "
func
");


if ((error =
dlerror
()) != NULL) {


fprintf
(
stderr
, "
dlsym
: %s
\
n", error);


exit(1);


}



/*
Теперь можно вызывать
func
()
как обычную функцию */


func_p
();


hello1
-
dl.c

main:

...


sub
esp
, 8


push .LC2 ; "
func
"


push
eax

; handle


call
dlsym


mov

esi
,
eax


call
dlerror


add
esp
, 16


test
eax
,
eax


jne

.L8 ;
обработка ошибки


call
esi

;
вызов
func_p
()

...

©

2017 МГУ/ВМК/СП

14




/*
Выгружаем динамическую библиотеку из памяти */


if (
dlclose
(handle) 0) {


fprintf
(
stderr
, "
dlclose
: %s
\
n",
dlerror
());


exit(1);


}



return 0;

}

hello1
-
dl.c

main:

...


sub
esp
, 12


push
ebx


call
dlclose


add
esp
, 16


test
eax
,
eax


js

.L9

;
обработка ошибки

...

©

2017 МГУ/ВМК/СП

Далее: Архитектура ЭВМ


Организация аппаратного обеспечения
компьютера


Физические основы, шины, периферийные устройства


Организация памяти


НЖМД, кэш


Производительность


Организация ЦПУ


Конвейер, система команд


Многозадачная работа компьютера


Изоляция пользовательских программ

16

©

2017 МГУ/ВМК/СП

Логические вентили

17

©

2017 МГУ/ВМК/СП

Сравнение битов

18

©

2017 МГУ/ВМК/СП

Сравнение слов

19

©

2017 МГУ/ВМК/СП

Полусумматор


Суммирует биты
A
и
B


Результат


бит
S


Перенос


бит
C

20

©

2017 МГУ/ВМК/СП

Полный двоичный сумматор

21

©

2017 МГУ/ВМК/СП

Суммирование слов

22

©

2017 МГУ/ВМК/СП

Мультиплексор

23

©

2017 МГУ/ВМК/СП

АЛУ

24

©

2017 МГУ/ВМК/СП

Регистр: сохранение 1 бита

25

©

2017 МГУ/ВМК/СП

Статическая память

26

Защелка

Синхронная
SR
-
защелка

Синхронная
D
-
защелка

Шеститранзисторная

ячейка статической
двоичной памяти (бит) SRAM

©

2017 МГУ/ВМК/СП

Динамическая память


Один транзистор и
один конденсатор


Занимает мало места


Заряд утекает через
транзистор


Требуются циклы
регенерации


чтение ячейки в
качестве регенерации

27


Приложенные файлы

  • pdf 6992419
    Размер файла: 4 MB Загрузок: 0

Добавить комментарий