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 1) Если путь библиотечный не ставить, пуск не происходит. rn=`readlink -f "${0}"` d=`dirname "${rn}"` env LD_LIBRARY_PATH=. CMDLINE="${d}/test `echo ${@}`" "${d}"/test Код: ./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 у Бориса (ubuntu 12), без вызова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 Код: 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/ |