OberonCore
https://forum.oberoncore.ru/

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

Автор:  Trurl [ Пятница, 11 Ноябрь, 2016 12:53 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Какие же все-таки разные подходы в ОС...

Может, завести библиотеку-переходник, в которую свалить все, что надо из сишных библиотек?

Автор:  Иван Денисов [ Пятница, 11 Ноябрь, 2016 13:01 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
h_errno deprecated в posix-2001 и совсем удалена в posix-2008, надо от неё избавляться.

А, теперь понятно, почему сетевые функции не давали приложению запускаться на 16.04.
viewtopic.php?f=34&t=5876&p=98000#p97996
Надо будет новый вариант теперь выложить.

Автор:  Alexander Shiryaev [ Пятница, 11 Ноябрь, 2016 19:46 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
h_errno deprecated в posix-2001 и совсем удалена в posix-2008, надо от неё избавляться.

Да, надо использовать getaddrinfo() вместо gethostbyname() в CommTCP...

Автор:  Alexander Shiryaev [ Суббота, 12 Ноябрь, 2016 01:57 ]
Заголовок сообщения:  Re: ElfLinker

Заменил gethostbyname() на getaddrinfo(), и h_errno больше не нужна.

Автор:  Alexander Shiryaev [ Суббота, 12 Ноябрь, 2016 02:05 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
Код:
PROCEDURE ExportVar*(mod: Module; IN name: STRING; addr: INTEGER);
   VAR sym: Symbol;
BEGIN
   NEW(sym);
   sym.name := name$;
   sym.sect := mod.vars;
   sym.addr := addr;
   sym.next := expList;
   expList := sym;
   INC(expCount);
END ExportVar;


А почему sym.sect := mod.vars, а у Дмитрия mod.data?

Автор:  Димыч [ Суббота, 12 Ноябрь, 2016 06:42 ]
Заголовок сообщения:  Re: ElfLinker

Разницы, видимо, нет. Главное, чтобы не code.

Автор:  Димыч [ Суббота, 12 Ноябрь, 2016 08:32 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
Димыч писал(а):
Какие же все-таки разные подходы в ОС...

Может, завести библиотеку-переходник, в которую свалить все, что надо из сишных библиотек?

Предлагаю создать модуль HostVars, который будет содержать эти самые переменные и при компоновке он будет обрабатываться через ExportModuleVars, но для разных систем будет разная инициализация.
Для того, чтобы инициализация вызывалась, этот модуль можно импортировать в HostFiles, который всегда участвует в компоновке.

Автор:  Trurl [ Суббота, 12 Ноябрь, 2016 10:18 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Разницы, видимо, нет. Главное, чтобы не code.

Как это нет? Если data, то переменная будет где-то в области дескрипторов.

Хотя, конечно, память экономится.

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

Trurl писал(а):
Димыч писал(а):
Разницы, видимо, нет. Главное, чтобы не code.

Как это нет? Если data, то переменная будет где-то в области дескрипторов.

Хотя, конечно, память экономится.

Главное слово было "видимо" :)
Я таки не знаю разницу между этими двумя областями, vars и data.

Автор:  Trurl [ Суббота, 12 Ноябрь, 2016 11:16 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Предлагаю создать модуль HostVars, который будет содержать эти самые переменные

У меня идея более радикальная - собрать все зависимости в один сишный модуль, пусть он выдает всё в нужном нам формате. Сейчас интерфейс приходится выковыривать из десятков заголовочных файлов, пусть бы этим компилятор си занимался.

Автор:  Trurl [ Суббота, 12 Ноябрь, 2016 11:48 ]
Заголовок сообщения:  Re: ElfLinker

Димыч писал(а):
Я таки не знаю разницу между этими двумя областями, vars и data.

vars - область переменных, в data находятся дескрипторы, константы и прочая информация, которую туда пихает компилятор.

Автор:  Иван Денисов [ Суббота, 12 Ноябрь, 2016 12:32 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
Димыч писал(а):
Предлагаю создать модуль HostVars, который будет содержать эти самые переменные

У меня идея более радикальная - собрать все зависимости в один сишный модуль, пусть он выдает всё в нужном нам формате. Сейчас интерфейс приходится выковыривать из десятков заголовочных файлов, пусть бы этим компилятор си занимался.

Фишка нового линкера как раз в том, чтобы избавиться от сишных привязок. Так что назад к сишным прибамбасам как-то не хочется возвращаться.

Автор:  Trurl [ Суббота, 12 Ноябрь, 2016 12:51 ]
Заголовок сообщения:  Re: ElfLinker

Кака можно избавиться от сишных привязок, если всё на сишных библиотеках построено.

Автор:  Иван Денисов [ Суббота, 12 Ноябрь, 2016 15:03 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
Кака можно избавиться от сишных привязок, если всё на сишных библиотеках построено.

Я имел в виду привязок к сишным компиляторам, как раньше до Вашего линкера приходилось делать компиляцию сишного загрузчика.

Автор:  Trurl [ Понедельник, 14 Ноябрь, 2016 14:53 ]
Заголовок сообщения:  Re: ElfLinker

Можно добавить в код инициализации "mov ebp, esp", чтобы проже было аргументы вытаскивать.
Хотя, и сейчас можно, но чуть больше магии:
Код:
SYSTEM.GETREG(SP, baseStack);
SYSTEM.GET(baseStack + 16, argc);
argv := SYSTEM.VAL(Libc.StrArray, baseStack + 20);

Автор:  Alexander Shiryaev [ Понедельник, 14 Ноябрь, 2016 15:45 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
Можно добавить в код инициализации "mov ebp, esp", чтобы проже было аргументы вытаскивать.
Хотя, и сейчас можно, но чуть больше магии:
Код:
SYSTEM.GETREG(SP, baseStack);
SYSTEM.GET(baseStack + 16, argc);
argv := SYSTEM.VAL(Libc.StrArray, baseStack + 20);

В OpenBSD так:
Код:
(* OpenBSD 5.5 @ i386 *)
   USRSTACK = 0CFBFE000H; (* /usr/include/i386/vmparam.h *)
   argcAdr = USRSTACK - 3 * 4;
   argvAdr = USRSTACK - 4 * 4;

/usr/include/i386/vmparam.h

Автор:  Trurl [ Понедельник, 14 Ноябрь, 2016 17:09 ]
Заголовок сообщения:  Re: ElfLinker

Во всех юниксах на x86 одинаково: при старте программы на вершине стека argc, за ним argv и env.
Но линкер вставляет call body, плюс компилятор сохраняет EBP, EDI, ESI. Вот и набегает 16 байт.

А что такое USRSTACK?

Автор:  Alexander Shiryaev [ Понедельник, 14 Ноябрь, 2016 18:12 ]
Заголовок сообщения:  Re: ElfLinker

Trurl писал(а):
А что такое USRSTACK?

Константа. Сейчас проверил -- в OpenBSD 6.0 уже так не работает.

Автор:  Alexander Shiryaev [ Понедельник, 14 Ноябрь, 2016 18:21 ]
Заголовок сообщения:  Re: ElfLinker

Код:
/* USRSTACK, OpenBSD */
#include <sys/param.h>
#include <uvm/uvm_extern.h>
#include <machine/vmparam.h>

#include <stdio.h>

int main (int argc, char *argv[])
{
    int x;

    printf("USRSTACK = %08x, &argc = 0x%08x (%d), &x = 0x%08x (%d)\n", USRSTACK, &argc, (int)&argc - USRSTACK, &x, (int)&x - USRSTACK);

    return 0;
}

Код:
$ ./test_args
USRSTACK = cf7fe000, &argc = 0xcf7c77f0 (-223248), &x = 0xcf7c77c8 (-223288)
$ ./test_args
USRSTACK = cf7fe000, &argc = 0xcf7eb0e0 (-77600), &x = 0xcf7eb0b8 (-77640)
$ ./test_args
USRSTACK = cf7fe000, &argc = 0xcf7cc450 (-203696), &x = 0xcf7cc428 (-203736)
$ ./test_args
USRSTACK = cf7fe000, &argc = 0xcf7f6130 (-32464), &x = 0xcf7f6108 (-32504)
$ ./test_args
USRSTACK = cf7fe000, &argc = 0xcf7ed440 (-68544), &x = 0xcf7ed418 (-68584)

Автор:  Trurl [ Среда, 23 Ноябрь, 2016 13:12 ]
Заголовок сообщения:  Re: ElfLinker

Про импорт переменных. Если нужно, можно ведь через dlopen, dlsym адрес получить.

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