OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 05:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 163 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 9  След.
Автор Сообщение
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Среда, 19 Август, 2015 07:11 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Идея с добавлением кода для выхода, похоже, была не очень правильной, вернулся на шаг назад, оставив оригинальный код выхода. В Kernel буду делать процедуру выхода, по крайней мере сейчас думаю именно так.

Кроме того, надо как-то по-другому организовать вызов стартового кода: почему-то при вызове того же самого кода из исполнимого файла (по сравнению с so), все смещения перемещаемых (relocate) элементов оказываются меньше на 4 байта, что естественно ломает вызовы на втором же call (первый идет со смещением 0).

Короче надо думать еще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Среда, 19 Август, 2015 09:18 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
В общем, судя по http://www.iecc.com/linker/linker08.html, придется переделывать схему сборки для исполнимых файлов и менять relational-схему на got-схему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Понедельник, 24 Август, 2015 09:24 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
После всех изысканий думаю переписать линкер с нуля.

Нужна большая модульность (в свете потенциального развития ARM и 64-битность) и большая независимость частей для других форматов (Mac OS X x86).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Понедельник, 24 Август, 2015 14:40 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Димыч писал(а):
После всех изысканий думаю переписать линкер с нуля.

Нужна большая модульность (в свете потенциального развития ARM и 64-битность) и большая независимость частей для других форматов (Mac OS X x86).

Поэтапно, на базе имеющегося кода, сделать это невозможно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Понедельник, 24 Август, 2015 16:16 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Оно конечно будет делаться на основе существующего кода.
Просто модульность там прямо просится, исходя из структуры ELF, а существующий код очень трудно модифицировать.
Там надо изменить PIC (position independend code) на абсолютный код, что в текущей реализации нетривиально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 04 Сентябрь, 2015 08:05 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
В общем, потихонечку пилю модульный линковщик.

Самая большая неприятность в имеющейся реализации - бесконечные magic numbers, цифры, взятые совершенно без пояснений.
Поэтому я по максимуму стараюсь избегать hardcoded значений.

https://github.com/dmitrys99/BBElfLinker

Файл ElfLinker2.odc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 04 Сентябрь, 2015 09:19 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Может быть стоит для начала написать техническую спецификацию, а затем по спецификации уже разрабатывать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 04 Сентябрь, 2015 11:59 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Спецификацию чего?
Спецификация ELF есть в открытом виде.
По ней, собственно, и делаю.

Или спецификацию модуля?
Там тоже все просто - повторяю то, что есть в DevElfLinker - LinkExe, LinkDll, LinkDynExe, LinkDynDll.

Все :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 04 Сентябрь, 2015 13:43 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
То что спецификация формата ELF есть - это понятно.
Но этот формат можно по-разному реализовать. Линкер должен хранить в себе разлинчые списки функций, смещений и так далее. Я немного смотрел формат ELF, насколько я себе представляю, там есть определенные сложности с загрузкой функций из внешних *.so файлов.
У вас линкер будет поддерживать возможность использования функций из внешних *.so файлов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 04 Сентябрь, 2015 16:10 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Попробую дать развернутый ответ.

Как работает ElfLinker сейчас?
Компилятор готовит перемещаемый код с базовым адресом 0, кроме того, для всего кода строится таблица перемещений (на полный BB что-то около 900 записей). Это таблица вызовов процедур и обращения к глобальным переменным, если я правильно понял. Перемещаемый код обертывается в ELF, заголовок строится таким образом, чтобы его можно было загрузить в виде SO.

Для того, чтобы из SO сделать полноценный исполнимый файл, помимо относительно несложных манипуляций с флагами в заголовке необходимо изменить базовый адрес файла. По умолчанию в Линукс этот адрес равен 08048000H. Это - точка входа в приложение. Соответственно, надо чтобы перемещаемые адреса были перемещены при загрузке, простите за тавтологию.

Для этого можно сделать две вещи:
1) Внести в файл (и в заголовок, естественно) секцию .interp, наличие которой, грубо говоря, позволит системе загрузить exe как so, проведя перемещения.
2) Используя абсолютную адресацию изменить адреса процедур, фактически это то, что делает загрузчик.

И то, и другое требует модификации линковщика (ElfLinker).

К сожалению код линковщика, на мой взгляд, безобразный. Магические числа, "зашитые" смещения и пр. Код поплыл при первых же попытках модификации.

Поэтому я начал переписывать.

Теперь о реализации.

Я думаю сделать так:
Код модулей собрать в порядке импорта (как это делает сейчас ElfLinker), это будет одна программная секция. В секции .ini сделать обработку командной строки для последующей передачи в kernel, в секции .fini сделать завершение через int 80h.

Ну а остальное как будет получаться.
Нужны таблицы строк (для описания секций, как минимум), скорее всего понадобится таблица символов, возможно понадобится таблица перемещений и т.д. Буду экспериментировать. Можно, теоретически, добавить символьную информацию для GDB, но это потом, может быть, если понадобится.

Дополнение:
Текущий линковщик умеет подключать *.so файлы. Делается это путем включения соответствующей секции в elf. Туда включаются пути к библиотекам, используемым интерфейсными модулями. Я тоже планирую это сделать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Вторник, 05 Апрель, 2016 23:24 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Димыч писал(а):
Делюсь некоторыми наблюдениями.

  • В сети есть два разных модуля DevElfLinker. Различаются тем, что в них немного по-разному работают процедуры SearchObj. Причина различий пока непонятна.
  • Выбор процедур NewRec и NewArr почему-то жестко вшит в линковку ядра, проверяется fingerprint этих процедур. И эти самые fingerprint собственно разные.
  • Модуль Files (и HostFiles), видимо, совсем не понимает, что такое символические ссылки - при попытке собрать HostGnome, который находится по символической ссылке, ликновщик останавливается по ошибке "файл не найден".
Димыч, я тут подумал: а почему никто из разработчиков DevElfLinker не пробует использовать библиотеку libelf, включая тебя?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Суббота, 16 Апрель, 2016 17:04 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Роман М. писал(а):
Димыч, я тут подумал: а почему никто из разработчиков DevElfLinker не пробует использовать библиотеку libelf, включая тебя?

Хорошая идея, надо подумать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Вторник, 04 Октябрь, 2016 20:29 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Тут такая проблема: допустим, есть у нас компоновщик, делающий исполнямые файлы. Далее, мы собираем программу и нам потребуется вызвать процедуру из libc. Но для этого требуестя libc проинициализировать, а как?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 14 Октябрь, 2016 19:25 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Trurl писал(а):
Тут такая проблема: допустим, есть у нас компоновщик, делающий исполнямые файлы. Далее, мы собираем программу и нам потребуется вызвать процедуру из libc. Но для этого требуестя libc проинициализировать, а как?

libc подключается и запускается линковщиком.
Вы просто указываете при компоновке, что вам нужна libc (делаете соответствующую запись в ELF), а потом вызываете функцию из этой библиотеки по имени. Технически это будет делаться также, как при вызове функций из других линкованных библиотек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Пятница, 14 Октябрь, 2016 22:20 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Боюсь, Вы недооцениваете возникающие трудности.
В общем компоновщик-то у меня есть, надо только подкрасить немного.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Суббота, 15 Октябрь, 2016 11:20 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Trurl писал(а):
Боюсь, Вы недооцениваете возникающие трудности.
В общем компоновщик-то у меня есть, надо только подкрасить немного.

Я не очень понимаю, чего я не понимаю :)
Если в исполняемом файле есть упоминание libc, т.е. есть соответствующая секция, тогда загрузчик ее загрузит в процесс и отдаст адрес. В процессе загрузки библиотека инициализируется, т.е. запускается код _init(), если я правильно помню. В конце, если приложение не было срублено, а честно завершилось, вызовется _fini(). Некая аналогия с DLL в винде.

В коде есть упоминание функции из libc, которое суть есть REL или IREL секция, могу ошибиться с названием. Вот когда загрузчик пристыкует библиотеку к процессу, он эти секции и поменяет. Вызов функции, таким образом, это call в секцию, а там уже адрес с правильным смещением.

Существенный момент - различия между SO и EXECUTABLE, там да, есть различия в способах адресации и подмены адресов загруженных функций, это уже не очень помню. Но это целиком зависит от того, какой способ адресации и вид ELF-файла был выбран.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Суббота, 15 Октябрь, 2016 20:12 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Это в эльфийских ОС так. Во FreeBSB программа сама должна вызвать init, а в линуксе она вызывает init и передает ей main одним из аргументов, а уже эта init вызывает main. Весь этот находится в разных crtN.o, которые присоединяются при линковке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Воскресенье, 16 Октябрь, 2016 10:05 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Trurl писал(а):
Это в эльфийских ОС так. Во FreeBSB программа сама должна вызвать init, а в линуксе она вызывает init и передает ей main одним из аргументов, а уже эта init вызывает main. Весь этот находится в разных crtN.o, которые присоединяются при линковке.

Может опубликуете?
Различия в заглушках вполне реализуемы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Вторник, 18 Октябрь, 2016 21:37 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Я посмотрел, там нормального интерфейса не хватает.
Вот примерно так вызывается.
Код:
PROCEDURE BlackBoxElf*;
BEGIN
   LB.Init(tgtElfExe);
   LB.dynaInit := TRUE;
   LB.outputName := "BlackBox1";
   LB.mainName := "Kernel";
   Load.AddModule('StdLoader');
   Load.AddModule('HostFiles');
   Load.ExportAll;
   LinkIt
END BlackBoxElf;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Среда, 19 Октябрь, 2016 10:44 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Trurl писал(а):
В общем компоновщик-то у меня есть, надо только подкрасить немного.

Вот тут я засомневался. У вас свой, свеженький компоновщик, или тот, что Ominc выкладывали?
Если свой, то мы с вами немного по-разному восприняли слово "опубликовать" :)


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB