Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
26 / 4 / 0
Регистрация: 17.04.2018
Сообщений: 53

Теория, библиотеки, динамические библиотеки

06.10.2018, 23:56. Показов 5251. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как происходит сам процесс использования, что происходит при include, как они загружаются?

Добавлено через 11 минут
статические библиотеки компилируются в объективе файлы (как эти файлы используются программой?)
динамические загружаются единожды(опять же как программа к ним обращается?) - из википедии

Добавлено через 4 минуты
то есть я хочу узнать как это происходит на низком уровне
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2018, 23:56
Ответы с готовыми решениями:

GNU assembler x86_64 и динамические библиотеки
Добрый день! Пытаюсь разобраться в ассемблере по учебнику, дошел-таки до динамических библиотек. В общем, есть код, который написан в...

Библиотеки ввода-вывода для ассемблера
Здравствуйте, форумчане! Помогите мне, пожалуйста, разобраться с таким вопросом. Существуют ли для популярных ассемблеров, таких...

Динамические библиотеки
Как подключить .dll библиотеку к проэкту на C#?

29
26 / 4 / 0
Регистрация: 17.04.2018
Сообщений: 53
10.10.2018, 20:18  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от shmkv Посмотреть сообщение
(он работать не будет)
почему? jmp адресс:смещение

Добавлено через 3 минуты
shmkv, я хочу сделать динамические библиотеки

Добавлено через 11 минут
Цитата Сообщение от shmkv Посмотреть сообщение
pe, elf
я так понял что это форматы при которых библиотеки линкуются не динамически?
0
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
10.10.2018, 20:55
FrideakisAB, большинство программ в современных линуксовых дистрибутивах в формате динамических (shared object ) ELF.

ubuntu@ubuntu:~$ objdump -f /bin/echo

/bin/echo: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000001c50

ubuntu@ubuntu:~$ readelf -h /bin/echo
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1c50
Start of program headers: 64 (bytes into file)
Start of section headers: 33208 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 28
Section header string table index: 27
В Windows в формате PE и ядро, и драйверы, и прикладные .EXE и .DLL.

В EFI тоже используется этот формат, правда обычно без внешних ссылок.
Поэтому ядро linux x86_64 - тоже снаружи в виде PE
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ubuntu@ubuntu:~$ objdump -x vmlinuz 
objdump: vmlinuz: Warning: Ignoring section flag IMAGE_SCN_MEM_NOT_PAGED in section .bss
 
vmlinuz:     file format pei-x86-64
vmlinuz
architecture: i386:x86-64, flags 0x00000103:
HAS_RELOC, EXEC_P, D_PAGED
start address 0x0000000000004680
 
Characteristics 0x20e
    executable
    line numbers stripped
    symbols stripped
    debugging information removed
 
Time/Date       Thu Jan  1 00:00:00 1970
Magic           020b    (PE32+)
MajorLinkerVersion  2
MinorLinkerVersion  20
SizeOfCode      007dd570
SizeOfInitializedData   00000000
SizeOfUninitializedData 0166f890
AddressOfEntryPoint 0000000000004680
BaseOfCode      0000000000000200
ImageBase       0000000000000000
SectionAlignment    0000000000000020
FileAlignment       0000000000000020
MajorOSystemVersion 0
MinorOSystemVersion 0
MajorImageVersion   0
MinorImageVersion   0
MajorSubsystemVersion   0
MinorSubsystemVersion   0
Win32Version        00000000
SizeOfImage     01e4d000
SizeOfHeaders       00000200
CheckSum        007ebf25
Subsystem       0000000a    (EFI application)
DllCharacteristics  00000000
SizeOfStackReserve  0000000000000000
SizeOfStackCommit   0000000000000000
SizeOfHeapReserve   0000000000000000
SizeOfHeapCommit    0000000000000000
LoaderFlags     00000000
NumberOfRvaAndSizes 00000006
 
The Data Directory
Entry 0 0000000000000000 00000000 Export Directory [.edata (or where ever we found it)]
Entry 1 0000000000000000 00000000 Import Directory [parts of .idata]
Entry 2 0000000000000000 00000000 Resource Directory [.rsrc]
Entry 3 0000000000000000 00000000 Exception Directory [.pdata]
...
...
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
11.10.2018, 02:59
Цитата Сообщение от FrideakisAB Посмотреть сообщение
почему? jmp адресс:смещение
Во-первых адрес и смещение это практически одно и тоже. Я не понимаю почему ты их разделяешь. Можно к адресу прибавить смещение и получить сразу нужный указатель (одно число вместо 2). Я понимаю, что ты можешь записать все указатели на функции, но проблема в другом. Ну нельзя размещать просто так код по произвольному адресу. Да, ты можешь загрузить код (тело библиотеки) куда угодно, да можешь вычислить указатели а свои функции, но при попытке из вызвать все упадет. Почему? Потому что компилятор привязывает код к конкретным адресам. "Отвязать" можно только через релокейшены.

Добавлено через 2 минуты
Цитата Сообщение от FrideakisAB Посмотреть сообщение
я так понял что это форматы при которых библиотеки линкуются не динамически?
Это форматы исполняемых файлов в т. ч. динамических библиотек. У статических библиотек другие форматы. Как можно пытаться делать ОС не зная самых основ?

Добавлено через 6 минут
В реальных форматах обычно адреса уже настроены на какой-то виртуальный адрес (и он указан в заголовке). Загрузчик, если ему требуется разместить либу по другому адресу, считывает это смещение и вычитает из него адрес на который его настроил компиялтор (т.е. получает смещение от 0), а потом прибавляет адрес по которому реально разместил.

Добавлено через 5 минут
Цитата Сообщение от ОС Посмотреть сообщение
Поэтому ядро linux x86_64 - тоже снаружи в виде PE
Прямо ядро целиком? Я думал, что там только загрузчик ядра.
2
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
11.10.2018, 06:28
Само сжатое ядро внутри секции .text EFI
Больше негде.
Можно посмотреть как собирается linux, чтоб уж точно
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
11.10.2018, 10:08
Цитата Сообщение от shmkv Посмотреть сообщение
Ну нельзя размещать просто так код по произвольному адресу. Да, ты можешь загрузить код (тело библиотеки) куда угодно, да можешь вычислить указатели а свои функции, но при попытке из вызвать все упадет. Почему? Потому что компилятор привязывает код к конкретным адресам. "Отвязать" можно только через релокейшены.
Здесь же не произвольный код, а код программы и библиотек, которые написал FrideakisAB.
Он мог попросить компилятор генерировать позиционнонезависимый код. Или сознательно соблюдать при программировании определённые ограничения, чтобы объектный код получился позиционнонезависимым и не нуждался в настройке на адреса.
Наконец, можно разделить адресное пространство на разделы, и заранее настраивать каждый модуль на адреса в своём разделе.

Это всё интересно, но ограничения в будущем могут затормозить дальнейшее развитие проекта.
Цитата Сообщение от FrideakisAB Посмотреть сообщение
я так понял что это форматы при которых библиотеки линкуются не динамически?
COFF, на основе которого позже был разработан PE, изобрели однажды в 1980-х где-то в DEC для своих 32-разрядных VAX со страничной виртуальной памятью.
https://rsdn.org/article/baseserv/pe_coff.xml
Sun чуть позже перешла на ELF во многом ради динамически загружаемых и связываемых shared objects

Глава из учебника про DLL
https://www.iecc.com/linker/linker10.html

Для единственной программы, выполняющейся без операционной системы, или для модулей "ядра" ОС
DLL необязательны. Смысл DLL в том, чтобы физические страницы с кодом какой-нибудь стандартной функции отображать в адресное пространстов разных процессов.
Когда у нас единственное адресное пространство, можно в стиле 1960-1970-х загружать и выгружать "обычные" объектные модули, сразу из-под компилятора. Как загружаемые объектные модули ядра freebsd и linux.
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
11.10.2018, 13:36
Цитата Сообщение от politoto Посмотреть сообщение
Он мог попросить компилятор генерировать позиционнонезависимый код.
Что-то я с трудом представляю как он это сделает для глобальных объектов.
Цитата Сообщение от politoto Посмотреть сообщение
Или сознательно соблюдать при программировании определённые ограничения, чтобы объектный код получился позиционнонезависимым и не нуждался в настройке на адреса.
Цитата Сообщение от politoto Посмотреть сообщение
Наконец, можно разделить адресное пространство на разделы, и заранее настраивать каждый модуль на адреса в своём разделе.
Неудобно.
0
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
11.10.2018, 20:28
Даже DLL Microsoft старалась настраивать, чтобы адреса не пересекались.
Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/Windows/System32$ objdump -h kernel32.dll user32.dll advapi32.dll gdi32.dll version.dll ole32.dll comctl32.dll comdlg32.dll 
 
kernel32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000cc8c1  77df1000  77df1000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00002a00  77ebe000  77ebe000  000cce00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         00000520  77ec1000  77ec1000  000cf800  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        00009aac  77ec2000  77ec2000  000cfe00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
user32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0006727f  77d51000  77d51000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00001400  77db9000  77db9000  00067800  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         0002d518  77dbb000  77dbb000  00068c00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        0000312c  77de9000  77de9000  00096200  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
advapi32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00098b9d  77c81000  77c81000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         0000e400  77d1a000  77d1a000  00099000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         00016ce0  77d29000  77d29000  000a7400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        0000553c  77d40000  77d40000  000be200  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
gdi32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00044f2a  77b61000  77b61000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00001800  77ba6000  77ba6000  00045400  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         000003d0  77ba8000  77ba8000  00046c00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        00001918  77ba9000  77ba9000  00047000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
version.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00003f4c  4ace1000  4ace1000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000200  4ace5000  4ace5000  00004400  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         00000428  4ace6000  4ace6000  00004600  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        000002f8  4ace7000  4ace7000  00004c00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
ole32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0012600a  72c11000  72c11000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .orpc         00006d41  72d38000  72d38000  00126600  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .data         00005e00  72d3f000  72d3f000  0012d400  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  3 .rsrc         000014b8  72d46000  72d46000  00133200  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .reloc        0000cff0  72d48000  72d48000  00134800  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
comctl32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000745d9  6ff71000  6ff71000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00002c00  6ffe6000  6ffe6000  00074a00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         00006538  6ffe9000  6ffe9000  00077600  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        00004090  6fff0000  6fff0000  0007dc00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 
comdlg32.dll:     file format pei-i386
 
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0004e411  6fc21000  6fc21000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00001000  6fc70000  6fc70000  0004ea00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rsrc         0001a458  6fc74000  6fc74000  0004fa00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .reloc        00003ea4  6fc8f000  6fc8f000  0006a000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA

Вручную конечно неудобно!
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
11.10.2018, 20:38
Цитата Сообщение от ОС Посмотреть сообщение
Даже DLL Microsoft старалась настраивать, чтобы адреса не пересекались.
Побочным эффектом таких "стараний" стало то, что в 32 битных конфигурациях большой блок памяти выделить бывает невозможно.
1
26 / 4 / 0
Регистрация: 17.04.2018
Сообщений: 53
12.10.2018, 13:57  [ТС]
Я решил использовать elf
2
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
12.10.2018, 14:02
Цитата Сообщение от FrideakisAB Посмотреть сообщение
Я решил использовать elf
Правильно. Во время реализации загрузчика разберешься с форматом, осознаешь, что уже люди уже придумали... При желании потом можно и свой велосипед сделать, если придумаешь что-то лучше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2018, 14:02

Qt динамические библиотеки
Здравствуйте, в Шлее почитал, что можно подключить динамическую библиотеку. Создаю я ее образом: новый проект -> Библиотеки ->...

Динамические библиотеки
Всем здравствуйте, в общем пытаюсь повторить пример Шлее : Динамическая загрузка и выгрузка библиотеки скидываю ниже код проекта где...

Динамические библиотеки
Доброго времени суток, программисты! Я создал эту тему, потому что проблема с запуском своих программ на другом компьютере стоит очень...

Динамические и статические библиотеки
Доброго времени суток. Подскажите кто-чем может: Дали задание разработать приложение, которое будет использовать динамические и...

Статические и динамические библиотеки
Здравствуйте! Возник вопрос в понимании задания, подскажите пожалуйста То есть в библиотеке должна динамически выделяться память под...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru