OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 10 Декабрь, 2024 01:41

Часовой пояс: UTC + 3 часа




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 29 Сентябрь, 2012 02:04 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Записал дельту 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, а не передавать комстроку, чтобы её компоненты, каким нужны параметры, парсили. Вроде уже про это писал.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Сентябрь, 2012 18:05 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
Код:
#!/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 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Александр, что скажете насчёт "libBB.so: cannot open shared object file: No such file or directory"?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Сентябрь, 2012 21:00 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
Если хотите использовать 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 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Сентябрь, 2012 00:34 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Зело надеялся, что главный изобретатель напишет инструкцию сам, но не дождался, теперь будет по моему разумению. Замечания приветствуются.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Октябрь, 2012 22:12 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
${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 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Гкхм. Интересно, для кого Вы это написали тут? :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Октябрь, 2012 23:05 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
Для читающих эту тему.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Октябрь, 2012 23:21 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
А чё, мне нравитца, что и как написано :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Октябрь, 2012 23:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Ну и хорошо, значит не зря. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Октябрь, 2012 02:13 
Модератор
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Октябрь, 2012 10:52 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
Это всё к тому, что если делать .rpm и .deb пакеты, и устанавливать BlackBox в систему (как в C:\Program Files\ в Windows), а не в домашний каталог, то надо делать так, как я написал выше.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 03 Октябрь, 2012 18:13 
Модератор
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Октябрь, 2012 01:44 
Модератор
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Октябрь, 2012 14:43 
Администратор

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Октябрь, 2012 16:58 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Результат последних испытаний выявил суть проблемы лучше: компилятор стал слишком умный. Когда он не видит вызовов, требование статической линковки с библиотекой игнорируется.

Результаты сборки пускача 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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Октябрь, 2012 20:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Результат последних испытаний выявил суть проблемы лучше: компилятор стал слишком умный.
Ага! :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 16 Октябрь, 2012 23:08 
Модератор
Аватара пользователя

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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 17 Октябрь, 2012 02:30 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3806
Скорее выложить два варианта сборки с кратким описанием по компиляции тем и другим образом. Тянуть нельзя.

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB