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/ |