© 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

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