OberonCore
https://forum.oberoncore.ru/

Linux Console: выбор реализации пускача и способ запуска
https://forum.oberoncore.ru/viewtopic.php?f=133&t=4089
Страница 2 из 3

Автор:  Евгений Темиргалеев [ Суббота, 29 Сентябрь, 2012 02:04 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Записал дельту KernelCmdline с тестом.
Код:
commit 541a3506e643a897a4761ee11c2eb05ce18f23e7
...Доб. дельта KernelCmdline: описание проблемы, описание решения 1 из ert-dev, решение 2 ШАВ --- применено к Kernel.
    В тексте дельты тест из ert-dev (поправлен под нов. схему запуска), спец. скрипт запуска от ШАВ --- записан для теста.
        new file:   d/Deltas/KernelCmdline.odc
        modified:   Lin/Mod/Libc.odc
        modified:   System/Mod/Kernel.odc

Код:
linconsole$ ls -l
...
-rw-r--r-- 1  42948 2012-09-29 02:21 libBB.so
-rwxr-xr-x 1 7141 2012-09-29 02:26 test
-rwxr-xr-x 1   103 2012-09-29 02:43 test.sh
Код:
#!/bin/sh
rn=`readlink -f "${0}"`
d=`dirname "${rn}"`
env LD_LIBRARY_PATH=. CMDLINE="${d}/test `echo ${@}`" "${d}"/test
1) Если путь библиотечный не ставить, пуск не происходит.
Код:
./test: error while loading shared libraries: libBB.so: cannot open shared object file: No such file or directory

2) Кавычки этот метод сжирает.
Код:
./test.sh 1 2 3 /USE "xxx/My work dir"
failed to install signal
32
failed to install signal
33
 
****
* Kernel.bootInfo
* NIL
****
 
****
* Kernel.cmdLine
* /home/XXX/linconsole/test 1 2 3 /USE xxx/My work dir
****
Т.е. имена папок с пробелами не прокатят. Сие есть косяк т.к. расходится с поведением виндовой версии (там пользователи любят пробелы в именах папок). Можно как-то исправить?
---
В этом самая трабла по передаче ком. строки напрямую и заключается: argc и argv --- разобранные из комстроки аргументы. Даже если как-то заставить интерпретатор её не трогать и один в один передать, разобрать её изнутри ББ корректно не возможно, т.к. внешние правила разбора не известны. Корректный метод на мой взгляд только один: использовать даденые argc и argv, а не передавать комстроку, чтобы её компоненты, каким нужны параметры, парсили. Вроде уже про это писал.

Автор:  Alexander Shiryaev [ Суббота, 29 Сентябрь, 2012 18:05 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Код:
#!/bin/sh

rn=`readlink -f "${0}"`
d=`dirname "${rn}"`

exe="BlackBox"
appName=${exe}

p=
for x in "${@}"; do
        if [ ! "${x}" = "`echo ${x} | sed s'/ //'`" ]; then
                p="${p} \"${x}\""
        else
                p="${p} ${x}"
        fi
done

env CMDLINE="${d}/${appName}${p}" "${d}"/${exe}

Автор:  Евгений Темиргалеев [ Суббота, 29 Сентябрь, 2012 20:12 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Александр, что скажете насчёт "libBB.so: cannot open shared object file: No such file or directory"?

Скрипт, exe и .so лежат в одном каталоге (и только в нём, никаких ссылок нет и не планируется). В упор не понимаю, как система может найти .so там, если каталог не прописать в путях поиска.

Автор:  Alexander Shiryaev [ Суббота, 29 Сентябрь, 2012 21:00 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Если хотите использовать libBB.so, находящуюся в том же каталоге, что и скрипт для запуска и исполняемый файл, а не в ${PREFIX}/lib, то надо запускать с установленной переменной окружения LD_LIBRARY_PATH. Тогда скрипт должен быть таким:
Код:
#!/bin/sh

rn=`readlink -f "${0}"`
d=`dirname "${rn}"`

exe="BlackBox"
appName=${exe}

p=
for x in "${@}"; do
        if [ ! "${x}" = "`echo ${x} | sed s'/ //'`" ]; then
                p="${p} \"${x}\""
        else
                p="${p} ${x}"
        fi
done

# export LD_DEBUG=all
env LD_LIBRARY_PATH="${d}" CMDLINE="${d}/${appName}${p}" "${d}"/${exe}

Автор:  Евгений Темиргалеев [ Суббота, 29 Сентябрь, 2012 22:03 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Alexander Shiryaev писал(а):
Если хотите использовать libBB.so, находящуюся в том же каталоге, что и скрипт для запуска и исполняемый файл,... то надо запускать с установленной переменной окружения LD_LIBRARY_PATH.
Спасибо, наконец-то всё стало по местам.

Автор:  Евгений Темиргалеев [ Воскресенье, 30 Сентябрь, 2012 00:34 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Зело надеялся, что главный изобретатель напишет инструкцию сам, но не дождался, теперь будет по моему разумению. Замечания приветствуются.

Положил в Dev/Docu/ElfLinker-Link как дополнительную документацию к DevElfLinker. Есть другие предложения?

Александр, если хотите, можете дополнить в конце насчет "Ваших" ОС-специфичных {$PREFIX}

Автор:  Alexander Shiryaev [ Понедельник, 01 Октябрь, 2012 22:12 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

${PREFIX} -- это аналог %PROGRAMFILES%, т. е. каталог, куда устанавливаются программы, которые могут быть доступны всем пользователям операционной системы.

Обычно это /usr, /opt или /usr/local в Linux и /usr/local в OpenBSD/FreeBSD. Исполняемые файлы обычно устанавливаются в ${PREFIX}/bin, библиотеки -- в ${PREFIX}/lib, документация -- в ${PREFIX}/share/doc, примеры -- в ${PREFIX}/share/examples, страницы man -- в ${PREFIX}/share/man.

Но могут быть исключения -- программы могут быть целиком установлены в ${PREFIX} (например, Java -- в ${PREFIX}/jdk-1.7.0, Adobe Acrobat -- в ${PREFIX}/Acrobat7) -- обычно это касается программ с собственной структурой каталогов. BlackBox как раз является одной из таких программ.

BlackBox должен быть установлен в ${PREFIX}/BlackBox, только libBB.so должна находиться в ${PREFIX}/lib (чтобы не занимать переменную LD_LIBRARY_PATH), а не в ${PREFIX}/BlackBox, и должна быть ссылка на запускающий скрипт в ${PREFIX}/bin (${PREFIX}/bin/blackbox -> ${PREFIX}/BlackBox/run-blackbox.sh).

У пользователей могут быть один или несколько рабочих каталогов BlackBox, которые могут задействоваться опцией /USE. Например:
Код:
$ blackbox /USE ~/work/BlackBox

или так:
Код:
$ cd ~/work/BlackBox; blackbox /USE .

Автор:  Евгений Темиргалеев [ Понедельник, 01 Октябрь, 2012 22:55 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Гкхм. Интересно, для кого Вы это написали тут? :)

Автор:  Alexander Shiryaev [ Понедельник, 01 Октябрь, 2012 23:05 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Для читающих эту тему.

Автор:  Info21 [ Понедельник, 01 Октябрь, 2012 23:21 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

А чё, мне нравитца, что и как написано :)

Автор:  Евгений Темиргалеев [ Понедельник, 01 Октябрь, 2012 23:24 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Ну и хорошо, значит не зря. :)

Автор:  Евгений Темиргалеев [ Вторник, 02 Октябрь, 2012 02:13 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Alexander Shiryaev писал(а):
Обычно это /usr, /opt или /usr/local в Linux и /usr/local в OpenBSD/FreeBSD...
Разрабатывать в ББ под линух можно спокойно без этого. Тем более, что хранение всего в одной замкнутой, контролируемой папке --- очень хорошая особенность ББ-приложений. Поэтому считаю, что пусковой скрипт по-умолчанию должен содержать LD_LIB..._PATH, а зацитированную информацию --- описанием необязательного способа ОС-специфичной оптимизации. По мне --- кто знает, тот и так догадается чего сделать, по общим словам; кто не знает --- нечего мозг насиловать, в конце концов, для садомазо есть мануалы на эту тему.

Однако, если Вы считаете необходимым дополнить материал этой информацией или примерами на тему, не буду иметь ничего против, если Вы это сами и сделаете. Или в том же документе, или отдельно, тогда поставим ссылку (подробнее см...)

Автор:  Alexander Shiryaev [ Вторник, 02 Октябрь, 2012 10:52 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Это всё к тому, что если делать .rpm и .deb пакеты, и устанавливать BlackBox в систему (как в C:\Program Files\ в Windows), а не в домашний каталог, то надо делать так, как я написал выше.

Автор:  Евгений Темиргалеев [ Среда, 03 Октябрь, 2012 18:13 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Alexander Shiryaev писал(а):
Это всё к тому, что если делать .rpm и .deb пакеты, и устанавливать BlackBox в систему (как в C:\Program Files\ в Windows), а не в домашний каталог, то надо делать так, как я написал выше.
Вопросов нет. Тоже об этом писал (viewtopic.php?p=75102#p75102) :)

Но наличие установщика --- излишнее усложнение, как в плане реализации и поддержки, так и в плане гибкости при использовании инструмента, и сей факт (распаковал в любую папку и готово) при использовании установщика ускользает из внимания пользователя на первом же шаге.

Поэтому и считаю задачу второстепенной и необходимой только ради распространения ББ (viewtopic.php?p=75112#p75112, Прочее, 3), учитывающий специфику народных масс. (Привычный, стандартный, как у всех способ установки и т.п.)

Автор:  Евгений Темиргалеев [ Суббота, 13 Октябрь, 2012 01:44 ]
Заголовок сообщения:  Re: Lin-Console — cборка консольных приложений ББ для Linux

viewtopic.php?p=75425#p75425
Борис пробовал вчера вечером на убунте 12. Выявилась следующая штука: статически связанная библиотека не грузится до тех пор, пока не задействуется. Т.е. если для "убунты 10" достаточно пустого main, то для 12 нужно делать в библиотеке пустую процедуру и вызывать её из main. Остальное вроде остаётся без изменений.

Сегодня попозже постараюсь внести поправку в документацию и примеры.

Автор:  Борис Рюмшин [ Понедельник, 15 Октябрь, 2012 14:43 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Собственно, я считаю, что вся эта эпопея с запуском из секции инициализации библиотеки является большим костылём. Нужна более естественная точка входа, то есть вызов конкретной процедуры из сишного main(). Как показало вскрытие, со стеком всё нормально в таком случае получается (при использовании той же статической линковки). Во всяком случае успешно прогнаны были все тесты сборщика мусора от Евгения.

Автор:  Евгений Темиргалеев [ Понедельник, 15 Октябрь, 2012 16:58 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Результат последних испытаний выявил суть проблемы лучше: компилятор стал слишком умный. Когда он не видит вызовов, требование статической линковки с библиотекой игнорируется.

Результаты сборки пускача example у меня (ubuntu 10), без вызова
Код:
gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

readelf -d example

Dynamic section at offset 0xf18 contains 22 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [example.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x80482a0
 0x0000000d (FINI)                       0x804845c
 0x00000004 (HASH)                       0x804818c
 0x6ffffef5 (GNU_HASH)                   0x80481b0
 0x00000005 (STRTAB)                     0x8048210
 0x00000006 (SYMTAB)                     0x80481d0
 0x0000000a (STRSZ)                      80 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x8049ff4
 0x00000002 (PLTRELSZ)                   16 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8048290
 0x00000011 (REL)                        0x8048288
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8048268
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8048260
 0x00000000 (NULL)                       0x0
у Бориса (ubuntu 12), без вызова
Код:
 gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

readelf -d example

Dynamic section at offset 0xf28 contains 20 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x8048294
 0x0000000d (FINI)                       0x804846c
 0x6ffffef5 (GNU_HASH)                   0x80481ac
 0x00000005 (STRTAB)                     0x804820c
 0x00000006 (SYMTAB)                     0x80481cc
 0x0000000a (STRSZ)                      69 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x8049ff4
 0x00000002 (PLTRELSZ)                   16 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8048284
 0x00000011 (REL)                        0x804827c
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x804825c
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8048252
 0x00000000 (NULL)                       0x0
у Бориса, с вызовом
Код:
readelf -d example

Dynamic section at offset 0xf20 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [example.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x80482bc
 0x0000000d (FINI)                       0x80484ac
 0x6ffffef5 (GNU_HASH)                   0x80481ac
 0x00000005 (STRTAB)                     0x804821c
 0x00000006 (SYMTAB)                     0x80481cc
 0x0000000a (STRSZ)                      83 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x8049ff4
 0x00000002 (PLTRELSZ)                   24 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x80482a4
 0x00000011 (REL)                        0x804829c
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x804827c
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8048270
 0x00000000 (NULL)                       0x0

Автор:  Info21 [ Понедельник, 15 Октябрь, 2012 20:53 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Евгений Темиргалеев писал(а):
Результат последних испытаний выявил суть проблемы лучше: компилятор стал слишком умный.
Ага! :)

Автор:  Евгений Темиргалеев [ Вторник, 16 Октябрь, 2012 23:08 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

(Освежите в памяти назначение четырёх команд сборки DevLinker) Вопрос по формированию пакета стал такой: или (А) довольно поддержать только один основной способ запуска --- мини-exe с рантаймом и дин. загрузкой остальных модуей (классчи. ББ приложение DevLinker.Link), или нужно (Б) поддержать все (доп: статич. экзе DevLinker.LinkExe, статич. библиотека для не-ББ приложения DevLinker.LinkDll, библ. с дин. загрукой для не ББ-приложения DevLinker.LinkDynDll).

Вопрос вроде как более политический нежели практический: либо пакет суть консольный для оригинального ББ, либо, т. сказать, для урезанного оригинального.

1) Отрабатываемая сейчас схема (с упрощающей поправкой) хорошо вписывается только для (А), сохраняет схему передачи параметров через командную строку, как в ББ для Windows; реализуема естественным для Linux способом.
2) Отказаться от передачи параметров через командную строку (как в ББ для Windows) в пользу их передачи через переменные окружения. Это второй легальный для Линух-программ способ передачи параметров. (Б) поддерживается без проблем.

Если этих общих соображений для выбора достаточно, прошу высказаться. Либо мне придётся более подробно расписывать обе схемы.

P.S. У меня уже были не один раз мысли --- выложить как есть, указав на проблемы, и думать дальше. Но если схема запуска поменяется, тем паче для (1) возможности сузятся, это будет не совсем красиво. Пока воздержался (думание продолжается закрыто, может затянуться и на неделю и на две). А вы, товарищи, как думаете --- пара недель погоды не делает или лучше скорее выложить?

Автор:  Иван Денисов [ Среда, 17 Октябрь, 2012 02:30 ]
Заголовок сообщения:  Re: Linux Console: выбор реализации пускача и способ запуска

Скорее выложить два варианта сборки с кратким описанием по компиляции тем и другим образом. Тянуть нельзя.

Для кроссразработки также предложить две схемы. Мою с временным перемещением файлов предлагаю тоже не убирать. Все-таки работает все и мне, например, так очень удобно работать.

На каком ядре остановились? В репозитории сейчас что-за ядро оказалось в итоге в папке System/Mod/ ? Ядро Александра все-таки пока недоделанное? Давайте версию для BSD выложим попозже, а вот для линукса ведь ядро есть от OpenBUGS 322. Считаю надо с ним пока выложить все вразумительные наработки по Linux версии.

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