OberonCore
https://forum.oberoncore.ru/

ElfLinker
https://forum.oberoncore.ru/viewtopic.php?f=34&t=5459
Страница 1 из 9

Автор:  Димыч [ Воскресенье, 09 Август, 2015 21:57 ]
Заголовок сообщения:  ElfLinker

Доброй ночи, коллеги!

Я немного подправил модуль 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 КБ]
Скачиваний: 1045

Автор:  Димыч [ Понедельник, 10 Август, 2015 06:15 ]
Заголовок сообщения:  Re: ElfLinker

Так, ночь была темной и глубокой.

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

Код:
chmod +x ttt.run

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

Автор:  Иван Денисов [ Понедельник, 10 Август, 2015 19:50 ]
Заголовок сообщения:  Re: ElfLinker

Сама идея отличная! Ждем новостей.
Попробовал безрезультатно собрать в сборке Freenix:
Kernel$+ Files HostGnome HostFiles StdLoader

Автор:  Димыч [ Среда, 12 Август, 2015 11:47 ]
Заголовок сообщения:  Re: ElfLinker

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

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

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

Вложения:
ElfLinker.odc [144.67 КБ]
Скачиваний: 1055

Автор:  Роман М. [ Четверг, 13 Август, 2015 11:22 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Так, разобрался с seg.fault.
Завершение запущенного процесса вызывается в Linux по хитрому:
Код:
mov     ebx,0
mov     eax,1
int     0x80

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

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

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

Автор:  Oleg N. Cher [ Пятница, 14 Август, 2015 02:50 ]
Заголовок сообщения:  Re: ElfLinker

Димыч, 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 *)
   ...

Автор:  Иван Денисов [ Пятница, 14 Август, 2015 06:10 ]
Заголовок сообщения:  Re: ElfLinker

В сборке центра этот фикс с параметром IN применен уже.

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

Автор:  Димыч [ Пятница, 14 Август, 2015 18:50 ]
Заголовок сообщения:  Re: ElfLinker

Так, коллеги :)
Не всё сразу.

План такой:

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

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

Автор:  Димыч [ Суббота, 15 Август, 2015 05:49 ]
Заголовок сообщения:  Re: ElfLinker

После некоторых манипуляций с добавлением флагов, собранный ELF успешно заработал на FreeBSD без необходимости инсталлировать Linux ABI.

Автор:  Димыч [ Суббота, 15 Август, 2015 16:16 ]
Заголовок сообщения:  Re: ElfLinker

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

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

Автор:  Димыч [ Воскресенье, 16 Август, 2015 08:36 ]
Заголовок сообщения:  Re: ElfLinker

Делюсь некоторыми наблюдениями.

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

Автор:  Иван Денисов [ Воскресенье, 16 Август, 2015 10:44 ]
Заголовок сообщения:  Re: ElfLinker

Чтобы избавиться от символьных ссылок там есть инструмент 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

Автор:  Иван Денисов [ Воскресенье, 16 Август, 2015 11:04 ]
Заголовок сообщения:  Re: ElfLinker

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

Автор:  Димыч [ Воскресенье, 16 Август, 2015 11:44 ]
Заголовок сообщения:  Re: ElfLinker

А её не надо игнорировать :)
Ошибка выдается потому, что в линкованый файл процедура NewRec не попадает.

Автор:  Димыч [ Воскресенье, 16 Август, 2015 13:19 ]
Заголовок сообщения:  Re: ElfLinker

Закоммитил код, исключающий проверку процедур NewRec и NewArr

Автор:  Иван Денисов [ Воскресенье, 16 Август, 2015 17:55 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Закоммитил код, исключающий проверку процедур NewRec и NewArr

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

Автор:  Димыч [ Воскресенье, 16 Август, 2015 18:44 ]
Заголовок сообщения:  Re: ElfLinker

Дай полный код вызова линковщика

Автор:  Иван Денисов [ Воскресенье, 16 Август, 2015 19:53 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Дай полный код вызова линковщика

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

Автор:  Роман М. [ Понедельник, 17 Август, 2015 11:39 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Ошибка выдается потому, что в линкованый файл процедура NewRec не попадает.
Можно об этом подробнее?

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

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

Автор:  Димыч [ Понедельник, 17 Август, 2015 11:51 ]
Заголовок сообщения:  Re: ElfLinker

Роман М. писал(а):
Можно об этом подробнее?

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

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

Страница 1 из 9 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/