OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 21 Январь, 2018 09:43

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




Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: ElfLinker
СообщениеДобавлено: Воскресенье, 09 Август, 2015 21:57 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Доброй ночи, коллеги!

Я немного подправил модуль DevElfLinker, он теперь правильно собирает исполнимые файлы. Правильно в том смысле, что readelf не ругается и остальные утилиты тоже.

Засада в том, что у меня под руками только 64-битные инсталляции Linux.
Если у кого есть 32-битные, попробуйте собрать пустой модуль.
Будет при вызове скомпонованного файла выдавать permission denied?
Код:
MODULE SoloTtt;

VAR
   x, y: INTEGER;

PROCEDURE Adder*(VAR a, b: INTEGER): INTEGER;
BEGIN
   RETURN a + b;
END Adder;

BEGIN
   x := 1;
   y := 2;
   x := Adder(x, y);
END SoloTtt.

DevElfLinker.LinkExe ttt.run := SoloTtt$


Вложения:
Комментарий к файлу: Доработанный компоновщик, умеет собирать исполняемые файлы elf32.
ElfLinker.odc [139.33 КБ]
Скачиваний: 70
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Понедельник, 10 Август, 2015 06:15 
Аватара пользователя

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

На полученный результат надо поставить право запуска

Код:
chmod +x ttt.run

Правда при запуске пока падает по segfault.


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Сама идея отличная! Ждем новостей.
Попробовал безрезультатно собрать в сборке Freenix:
Kernel$+ Files HostGnome HostFiles StdLoader


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Так, разобрался с seg.fault.
Завершение запущенного процесса вызывается в Linux по хитрому:
Код:
mov     ebx,0
mov     eax,1
int     0x80

Этот кусок не генерировался, вместо этого делался ret в ядро, за что приложение ожидаемо получало по рукам.

https://github.com/dmitrys99/BBElfLinker, мало ли.


Вложения:
ElfLinker.odc [144.67 КБ]
Скачиваний: 63
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ElfLinker
СообщениеДобавлено: Четверг, 13 Август, 2015 11:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1158
Откуда: Tel-Aviv
Димыч писал(а):
Так, разобрался с seg.fault.
Завершение запущенного процесса вызывается в Linux по хитрому:
Код:
mov     ebx,0
mov     eax,1
int     0x80

Этот кусок не генерировался, вместо этого делался ret в ядро, за что приложение ожидаемо получало по рукам.

https://github.com/dmitrys99/BBElfLinker, мало ли.

Долгожданно! Спасибо. Запускается на 32-битке!


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 171
Откуда: Украина, Днепропетровская обл.
Димыч, ElfLinker.odc не компилируется в сборке CPC Edition (Гельмута Цинна) — вываливается с ошибкой в строке:
Код:
S.SetPos [ this variable (field) is read only ] (S.rider.Pos())
Это связано с тем, что параметр S процедуры ParseExt помечен модификатором IN. Лечение простое: меняем его на VAR.

Напомню суть проблемы. Она заключается в том, что параметр IN S может быть скрыто изменён внутри S.SetPos, где он помечен как VAR. ББ нестрого разрешает такой трюк, за что нужно бить по рукам.

Так что я бы всем авторам сборок посоветовал воспользоваться фиксом, который ловит данную проблему (которая обсуждалась ещё в рассылке OMinc, и было решено всем миром: фиксу — быть!), и если у кого линкер собрался, значит в вашей сборке фикс не установлен.

В CPC Edition эта ошибка обозначена так:

14. Report passing receiver parameters IN to VAR (Center #38)

P.S. Димыч, благодарю за модификацию линкера. Это давно пора было сделать. В собираемом бинарнике для Linux как-то скрыто решается проблема установки сигналов? Или это нужно делать явно? В исходнике Ofront'а для Linux для этого, например, есть специальный код:
Код:
   IMPORT
      SYSTEM, Unix, ... ;

   PROCEDURE -signal(sig: LONGINT; func: Unix.SignalHandler)
      "signal(sig, func)";

   PROCEDURE Trap(sig, code: LONGINT; scp: Unix.SigCtxPtr);
   BEGIN fin();
      IF sig = 3 THEN Unix.Exit(0)
      ELSE
         IF (sig = 4) & (halt() = -15) THEN OPM.LogWStr(" --- ofront: internal error");  OPM.LogWLn END ;
         Unix.Exit(2)
      END
   END Trap;

BEGIN
   signal(2, Trap);   (* interrupt *)
   signal(3, Trap);   (* quit *)
   signal(4, Trap);   (* illegal instruction, HALT *)
   ...


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
В сборке центра этот фикс с параметром IN применен уже.

Также рекомендую Димычу поглядеть LinLinker от Oberon microsystems.
http://redmine.molpit.com/projects/blac ... Linker.odc


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Так, коллеги :)
Не всё сразу.

План такой:

  1. Получить бинарный файл для одного модуля (без Kernel) (выполнено)
  2. Убедиться, что argc/argv передаются ядром правильно (выполнено)
  3. Собрать систему с Kernel
  4. Получить argc/argv для дальнейшего использования
  5. Сделать постановку сигналов

Любые замечания и помощь приветствуются.
Еще не могу найти, какой сейчас используется формат файлов по умолчанию во FreeBSD, ELF или a.out.
Если кто знает, подскажите пожалуйста.


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
После некоторых манипуляций с добавлением флагов, собранный ELF успешно заработал на FreeBSD без необходимости инсталлировать Linux ABI.


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Иван Денисов писал(а):
Также рекомендую Димычу поглядеть LinLinker от Oberon microsystems.
http://redmine.molpit.com/projects/blac ... Linker.odc

Посмотрел. Дешево и сердито. В принципе, имеющийся DevElfLinker делает почти то же самое, только делает это в рамках одного ELF файла и без необходимости привлечения C-загрузчика.


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Делюсь некоторыми наблюдениями.

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


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Чтобы избавиться от символьных ссылок там есть инструмент export. Но может быть дело не в этом, просто HostGnome мог быть не скомпилирован. В целом это не самый необходимый модуль. Он нужен только, чтобы ошибки из ядра при запуске показывать.

Попробовал вот сейчас собрать ядро твоим линковщиком и тоже увидел такую проблему.
Код:
CodeSize=73% Filename: Kernel
% Filename: Files
% Filename: HostGnome
% Filename: HostFiles
% Filename: StdLoader
next module
next module
next module
next module
next module
next module
next module
next module
next module
next module
Kernel.NewRec imported from HostGnome has wrong fprint


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Если эту ошибку игнорировать (закоментировать error := TRUE), то собирается файл 91кб, но потом не запускается:
Код:
ivan@hp:~/BBElfLinker/Linux_GUI$ ./blackbox2.run
Недопустимая инструкция (сделан дамп памяти)


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
А её не надо игнорировать :)
Ошибка выдается потому, что в линкованый файл процедура NewRec не попадает.


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Закоммитил код, исключающий проверку процедур NewRec и NewArr


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Димыч писал(а):
Закоммитил код, исключающий проверку процедур NewRec и NewArr

Такая же ошибка пока
Код:
ivan@hp:~/BBElfLinker/Linux_GUI$ ./blackbox2.run
Недопустимая инструкция (сделан дамп памяти)


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Дай полный код вызова линковщика


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Димыч писал(а):
Дай полный код вызова линковщика

Код:
DevElfLinker.LinkExe blackbox2 := Kernel$+ Files HostGnome HostFiles  StdLoader


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

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1158
Откуда: Tel-Aviv
Димыч писал(а):
Ошибка выдается потому, что в линкованый файл процедура NewRec не попадает.
Можно об этом подробнее?

Как вообще сборщик мусора будет работать без NewRec и NewArr?

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


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 490
Роман М. писал(а):
Можно об этом подробнее?

Как вообще сборщик мусора будет работать без NewRec и NewArr?

Это был ответ Ивану.
Конечно же, эти процедуры должны попасть в файл, без них никак.
Просто там стоит какая-то странная проверка, использующая конкретные адреса, не совпадающие с фактическими. Поэтому выдается ошибка и сборка останавливается.
Я сделал на это фикс, но надо проверять, похоже где-то еще ошибки.


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

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


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

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


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

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