Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вс авг 20, 2017 2:27 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 62 сообщения ]  На страницу Пред. 1 2 3 4 5 След.
Автор Сообщение
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Сб ноя 23, 2013 5:30 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
SoUrcerer писал(а):
Ну, тогда напиши мне скрипт для ld, который позволит использовать сторонние динамические библиотеки без написания километровых обёрток. :) FreeType экспортирует несколько сотен функций.
Так уже есть. секция .idata ALIGN(16) решает проблему.
А вот инклюд для fasm Генерируется автоматически из .def файла после чего требует мелкого редактирования. У меня мало опыта работы с sed и регулярными выражениями, наверное можно и без редактирования обойтись.


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Сб ноя 23, 2013 7:46 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Краткий итог обсуждения

Сначала вопросы 2008 года.
1. Где хранить многотонные DLL ? Усилиями Марата вопрос решился - /kolibrios/lib
2. Порядок поиска DLL. Сейчас поиск ведётся только в /kolibrios/lib
Можно искать сначала в каталоге исполняемого файла, потом /rd/1/lib, потом /kolibrios/lib, но это замедлит загрузку приложения. Ещё можно прописать пути в заголовке приложения (всё эльфистие и эльфистие) или сделать там набор флагов для стандартных путей. Или ввести переменные окружения (ещё одна большая тема) где будут прописаны пути поиска.

Варианты загрузки.
В то время я активно продвигал PE в качестве формата исполняемых файлов. Тогда это представлялось мне самым простым способом упростить и автоматизировать загрузку DLL. На эту тему было много споров с diamond-ом, которому не нравились лишние байты в заголовке PE. В результате этих споров договорились до создания своего упрощённого варианта PE, на чём дело и было успешно похоронено. Внезапно выяснилось, что скрипты LD мощное средство, если уметь ими пользоваться, а макросы fasm могут вообще всё, что угодно. Для автоматической линковки PE DLL достаточно таблицы импорта в исполняемом файле. И ld и fasm это условие выполняют. Примеры на fasm, использующие PE DLL: раз, два
В текущем варианте динамический компоновщик является частью libc. Для программ на Си это очевидное решение, для остальных нет. Если внедрять новый формат заголовка, я уберу компоновщик из libc и перепишу его на ассемблер с неизбежными ошибками :( :( :( . Ядро создаст образ приложения и скопирует компоновщик в вершину юзерспейса по фиксированному адресу, остальную работу он выполнит сам. Если делать поддержку PE EXE схема загрузки будет примерно такой же, но в этом случае я не вижу смысла делать новый заголовок. Зачем лишние сущности ?

Вот и оставшиеся вопросы:
1. Порядок поиска DLL.
2. Формат исполняемых фалов - новый заголовок или pe exe.

И дополнение по новому заголовку. Лучше не использовать 0 в качестве базового адреса. 4 Мб будет неплохим вариантом - ядро пропустит создание нулевой таблицы страниц.


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Сб ноя 23, 2013 1:58 pm 
Не в сети
Just Flooding

Зарегистрирован: Пт ноя 08, 2013 2:49 pm
Сообщения: 19
-- Порядок поиска DLL --

DLL - общеизвестное название, не вижу смысла переименовывать их в lib. Я также за то, чтобы дать исполняемым файлам какое-нибудь расширение, напр. "exe".

Системные папки могут определяться:
- через переменную окружения (%sys%, %dll%, ..), тогда обращение к файлу будет вида "%sys%\license.txt".
- функция ПолучитьПуть(Тип), где Тип (dd) = "sys ", "dll ", ..; возвращается путь. Для обращения потребуется: ПолучитьПуть("sys")+"license.txt"
- фиксовые пути - нежелательно

Поиск DLL только в текущей папке программы и %dll%.

Если DLL написаны правильно, то можно не загружать их дважды, т.е. запуске приложения DLL загружается и количество использований устнавливается в 1, при запуске других приложений количество использований инкрементируется (+1), при закрытии - декрементируется (-1). Когда количество использований станет равным 0, DLL выгружается. В таком случае поиск будет:
1. загруженные DLL из папок программ
2. папка программы
3. загруженные DLL из %dll%
4. %dll%


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 3:23 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Формат должен быть обычным PE exe, чтобы цепочка действий для получения работоспособной программы с любым компилятором была как можно проще. Поддержка урезанного заголовка для маленьких программ и автосборки готовых на дополнительных действия - приятный бонус, но а) необязательный, б) основной формат - PE, заголовок должен получаться из уже готового PE без всяких махинаций со скриптами ld, в) вообще можно добавить потом, потому что код загрузки будет отличаться только тем, по каким смещениям он читает поля заголовка.

Порядок поиска: заглянуть в /rd дёшево, так что первым делом стоит просмотреть /rd/1/lib. Дальше можно ограничиться /kolibri/lib - по крайней мере, для начала, с путём к exe'шнику придётся возиться.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 3:51 pm 
Не в сети
Just Flooding

Зарегистрирован: Пт ноя 08, 2013 2:49 pm
Сообщения: 19
Почему считаешь нужным ускорять процесс компиляции программы, а не её запуска? Почему предпочтение отдано формату PE, а не COFF, ELF или каким-либо другим?


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 3:57 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
По количеству компиляторов. Откуда взялось противопоставление времени компиляции и времени запуска? Какое отношение формат имеет ко времени компиляции?

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 4:40 pm 
Не в сети
Just Flooding

Зарегистрирован: Пт ноя 08, 2013 2:49 pm
Сообщения: 19
> По количеству компиляторов.

Можно увидеть исходные данных статистического исследования на основании которого было сделано это заключение? Я напр. не знаю ни одного компилятора, который бы умел создавать PE, но не умел COFF.

> Откуда взялось противопоставление времени компиляции и времени запуска? Какое отношение формат имеет ко времени компиляции?

Формат влияет на время запуска, так файл существующего формата (первые N байт в начале плоского файла) можно запустить быстрее, чем PE/ELF. И вопрос как раз был почему ты отдаёшь приоритет времени компиляции в ущерб времени запуска?

CleverMouse: читайте теорию до просветления, пока не поймёте, в чём отличие PE от COFF и какой из них приспособлен для компиляции нетривиальных проектов в один исполняемый файл. До тех пор вы забанены.


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 5:26 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
CleverMouse
Если основным форматом сделать PE, ассемблерщики будут поминать нас тихими, незлобивыми словами. Как им путь к экзешнику и командную строку получать ?


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 5:30 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Пусть загрузчик запихнёт два указателя в стек перед вызовом entry point, если так уж не хочется писать API загрузчика.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 5:33 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Есть решение проще. Записать в регистры. Странно, что Вилле не додумался и мы до сих пор не использовали.


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 6:32 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
Serge писал(а):
Есть решение проще. Записать в регистры. Странно, что Вилле не додумался и мы до сих пор не использовали.

О! Вот это идея! Тогда получится, что точка входа -- это как бы процедура с параметрами? Элегантно.

Раз уж PE, как понимаю, избежать не удастся, есть два предложения:
  • Наряду с обычными PE позволять начинать файл сразу c PE-секции -- 'PE', 0, 0, чтобы можно без DOS-заглушки. Сэкономит минимум 64 байта, а со стандартыми заглушками -- 128 байт и больше.
  • Придумать константу IMAGE_SUBSYSTEM_KOLIBRI, либо в поля MajorVersion.MinorVersion писать что-то свое (0.7 или 0.8), чтобы Windows выдавала, что эти файлы не являются приложениями Win32.

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 7:18 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Кстати да, будут загружать PE экзешники под windows со всеми вытекающими. И получать отсутствующие длл. И наоборот само собой.


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пн ноя 25, 2013 7:48 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Fanatic писал(а):
Наряду с обычными PE позволять начинать файл сразу c PE-секции -- 'PE', 0, 0, чтобы можно без DOS-заглушки. Сэкономит минимум 64 байта, а со стандартыми заглушками -- 128 байт и больше.
Это рюшечки. PE-заголовок можно сокращать, но сначала нужно сделать наконец поддержку PE - потом уже будет видно, какие поля загрузчик действительно использует, а какие просто занимают место.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пт апр 25, 2014 7:31 pm 
Не в сети
KSoC/GSoC Student

Зарегистрирован: Пн май 20, 2013 6:34 pm
Сообщения: 25
Serge писал(а):
1. PE упрощает разработку драйверов на HLL. Создать обычным путём COFF драйвер из многофайлового проекта на Си очень проблематично.
2. Сгенерированный HLL компилятором COFF раздут из-за отладочной информации.
3. Ассемблерные PE и COFF драйвера примерно одинакового размера но COFF сложнее в загрузке.
4. PE загружается явно, с передачей командной строки.
4. Есть намерение в перспективе полностью перейти от COFF к PE.

Резюмируя всё, у COFF нет преимуществ перед PE нет, зато есть серьёзные недостатки. COFF - формат объектного файла, для исполняемого он плох.


Вернуться к началу
 Заголовок сообщения: Re: Загрузка библиотек
СообщениеДобавлено: Пт апр 25, 2014 9:24 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 934
Цитата:
Ассемблерные PE и COFF драйвера примерно одинакового размера но COFF сложнее в загрузке.
Ну PE, конечно, легче грузить http://websvn.kolibrios.org/blame.php?r ... 21#line-51 :lol:
Только забыли положить рядом Си-шный исходник. А то не каждый сразу поймёт, что там за L20, L30, ... и что там за "магические" смещения такие.
Ладно бы там ещё http://websvn.kolibrios.org/filedetails ... c&peg=4421 такое с полпинка не напишешь.

И я не хочу сказать, что си — это плохо, но не нужно извращаться, а надо нормально прилинковывать.
Если уж что-то на asm сделать трудно, то почему бы и на си тогда не сделать.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 62 сообщения ]  На страницу Пред. 1 2 3 4 5 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB