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$
|
Автор: | Димыч [ Понедельник, 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, мало ли.
|
Автор: | Роман М. [ Четверг, 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 |
Так, коллеги Не всё сразу. План такой:
Любые замечания и помощь приветствуются. Еще не могу найти, какой сейчас используется формат файлов по умолчанию во 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 |
Делюсь некоторыми наблюдениями.
|
Автор: | Иван Денисов [ Воскресенье, 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/ |