OberonCore
https://forum.oberoncore.ru/

Перевод BlackBox под Linux
https://forum.oberoncore.ru/viewtopic.php?f=34&t=1280
Страница 10 из 15

Автор:  Alexey Veselovsky [ Суббота, 04 Апрель, 2009 13:05 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

В линуксах программа поставляется либо в исходниках (с ридмишкой что нужно чтобы собрать, и как собственно собрать), либо в виде пакета, где прописаны зависимости.

Как оно например запустистя, если в моем линухе просто напросто иксов нет и графика идет через фреймбуфер (а программулина собрана под иксы)?

Больше свободы, меньше бинарной совместимости.

Автор:  Ali [ Суббота, 04 Апрель, 2009 14:02 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

GUEST писал(а):
Борис Рюмшин писал(а):
Подозреваю, что в этом самом 64 и есть проблема...
А 32-разрядную версию библиотеки если поставить что будет?


Код:
...
open("/usr/lib/libgtk-x11-2.0.so", O_RDONLY) = -1 ENOENT (No such file or directory)
.....
$ ls -la /usr/lib/libgtk-x11-2.0.so*
lrwxrwxrwx 1 root root      26 Мар 25 12:52 /usr/lib/libgtk-x11-2.0.so.0 -> libgtk-x11-2.0.so.0.1400.7
-rwxr-xr-x 1 root root 4087324 Фев 14 01:38 /usr/lib/libgtk-x11-2.0.so.0.1400.7

Если сделать симлинки, то
Код:
....
read(4, "\nMSK-3MSD,M3.5.0,M10.5.0/3\n"..., 4096) = 27
close(4)                                = 0
munmap(0xf7f70000, 4096)                = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xfffffffff7f70000
write(1, " \n"..., 2
)                   = 2
write(1, "****\n"..., 5****
)                = 5
write(1, "* BlackBox\n"..., 11* BlackBox
)         = 11
write(1, "* illegal memory read [ad = 00A28"..., 620* illegal memory read [ad = 00A2865A]
- GnomeGObjectStuff.$$  (pc=00000000, fp=FFF6DD60)
- Kernel.RegisterMod  (pc=000016A6, fp=FFF6DE8C)
- StdLoader.LoadMod  (pc=00001276, fp=FFF6DFA4)
- StdLoader.LoadMod  (pc=000011E0, fp=FFF6E0BC)
- StdLoader.Hook.ThisMod  (pc=00001355, fp=FFF6E0D0)
- Kernel.ThisMod  (pc=0000108C, fp=FFF6E1EC)
- Meta.Lookup  (pc=00000930, fp=FFF6E210)
- StdInterpreter.CallProc  (pc=000003E1, fp=FFF6E26C)
- StdInterpreter.Command  (pc=00000A61, fp=FFF6E304)
- StdInterpreter.CallHook.Call  (pc=00000B0F, fp=FFF6E4F4)
- Dialog.Call  (pc=00003644, fp=FFF6E51C)
- Init.$$  (pc=0000001D, fp=FFF6E540)
) = 620
write(1, "****\n"..., 5****
)                = 5
rt_sigprocmask(SIG_BLOCK, NULL, ~[KILL STOP RTMIN RT_1], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, ~[KILL STOP RTMIN RT_1], 8) = 0
close(3)                                = 0
munmap(0xf7f71000, 4096)                = 0
exit_group(1)

Автор:  Сергей Оборотов [ Суббота, 04 Апрель, 2009 15:19 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Ali писал(а):
Если сделать симлинки, то
... найдет. Спасибо, так и сделаем.

Автор:  Ali [ Суббота, 04 Апрель, 2009 15:41 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

GUEST писал(а):
... найдет. Спасибо, так и сделаем.

Там ещё libglib-2.0.so.
Вы писали: "Дело как раз в упомянутом флаге PROT_EXEC"
Можно подробней.

Автор:  Сергей Оборотов [ Суббота, 04 Апрель, 2009 15:59 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Ali писал(а):
GUEST писал(а):
... найдет. Спасибо, так и сделаем.

Там ещё libglib-2.0.so.
Вы писали: "Дело как раз в упомянутом флаге PROT_EXEC"
Можно подробней.
Еще раз спасибо. PROT_EXEC - это для возможности запускать загружаемый код флаг . Указывать при выделении памяти при загрузке в модуле KERNEL. AllocModMem процедура называется. Трассировку SoloHello ранее давал уже.

Автор:  Борис Рюмшин [ Суббота, 04 Апрель, 2009 17:37 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Спасибо за наводки. Я просто тыкнул - не работает, дальше не разбирался, времени не было. Чуть позже вернусь к вопросу.

Автор:  Димыч [ Понедельник, 06 Апрель, 2009 13:16 ]
Заголовок сообщения:  Re: Программа Hello world на GTK и ББ

GUEST писал(а):
BX (EBX точнее) это регистр в который линкер записывает адрес списка собранных модулей. Небольшая стартовая процедура это делает. Командная строка в Linux обрабатывается при обработке запуска на исполнение. Параметры argc и argv передаются по Си-соглашению через стек, обратиться к которому можно через baseStack в модуле KERNEL.

Ткните носом в man, пожалуйста.
Есть немаленькое подозрение, что данные в стеке идут не в том порядке, в каком они ожидаются в ББ.

Автор:  Димыч [ Понедельник, 06 Апрель, 2009 13:17 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

GUEST писал(а):
Ali писал(а):
GUEST писал(а):
... найдет. Спасибо, так и сделаем.

Там ещё libglib-2.0.so.
Вы писали: "Дело как раз в упомянутом флаге PROT_EXEC"
Можно подробней.
Еще раз спасибо. PROT_EXEC - это для возможности запускать загружаемый код флаг . Указывать при выделении памяти при загрузке в модуле KERNEL. AllocModMem процедура называется. Трассировку SoloHello ранее давал уже.

В следующей сборке включу этот флаг.
На моей системе это не проявляется.

Автор:  Димыч [ Понедельник, 06 Апрель, 2009 13:18 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Скажите, а на 64-битной версии запускается?
У меня нет ни железа на 64 бита, ни виртуалок.

Автор:  Сергей Оборотов [ Понедельник, 06 Апрель, 2009 13:27 ]
Заголовок сообщения:  Re: Программа Hello world на GTK и ББ

Димыч писал(а):
Ткните носом в man, пожалуйста.
Есть немаленькое подозрение, что данные в стеке идут не в том порядке, в каком они ожидаются в ББ.
Собственно, это стандартное поведение. Эти данные ББ вообще не обрабатывает, насколько мне известно - поэтому что Вы имели в виду говоря, что их ждут непонятно.
Димыч писал(а):
В следующей сборке включу этот флаг.
Насколько я понимаю, он необходим, если не включать все модули в одну библиотеку и притом не на всех системах. Поэтому можете просто включать все модули одним файлом libBB.so
Димыч писал(а):
Скажите, а на 64-битной версии запускается?
Да, после установки требуемых 32-битных библиотек.

Автор:  Димыч [ Понедельник, 06 Апрель, 2009 13:47 ]
Заголовок сообщения:  Re: Программа Hello world на GTK и ББ

GUEST писал(а):
Димыч писал(а):
Ткните носом в man, пожалуйста.
Есть немаленькое подозрение, что данные в стеке идут не в том порядке, в каком они ожидаются в ББ.
Собственно, это стандартное поведение. Эти данные ББ вообще не обрабатывает, насколько мне известно - поэтому что Вы имели в виду говоря, что их ждут непонятно.

Под словом "ожидается" я имел ввиду то, что "данные в стеке размещены в известном порядке и в этом же порядке переводятся в переменные модуля Kernel". Мне этот порядок пока неизвестен.
GUEST писал(а):
Димыч писал(а):
В следующей сборке включу этот флаг.
Насколько я понимаю, он необходим, если не включать все модули в одну библиотеку и притом не на всех системах. Поэтому можете просто включать все модули одним файлом libBB.so

Тогда теряется всякий смысл в модульности :)
Я уж лучше включу просто этот флаг в код.

Автор:  Ali [ Понедельник, 06 Апрель, 2009 15:09 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Димыч писал(а):
Я уж лучше включу просто этот флаг в код.

если
Код:
$ uname -r
2.6.29.1-37.rc1.fc11.i686.PAE

И
Код:
$ dmesg | grep NX
NX (Execute Disable) protection: active

то
Код:
write(1, "* illegal memory read [ad = 00000"..., 620* illegal memory read [ad = 00000000]

иначе
Код:
****
* Hello World
* HELLO WORLD
****

Работает.
Переключать дефолтную настройку BIOS не очень удобно.

Автор:  Сергей Оборотов [ Понедельник, 06 Апрель, 2009 15:18 ]
Заголовок сообщения:  Re: Программа Hello world на GTK и ББ

Димыч писал(а):
Под словом "ожидается" я имел ввиду то, что "данные в стеке размещены в известном порядке и в этом же порядке переводятся в переменные модуля Kernel". Мне этот порядок пока неизвестен.
Если хотите чтобы автоматом переводилось надо линкер дописывать. В том месте где стартовая процедура прописывается добавить пересылку в заранее известные переменные. Проще по baseStack обратиться, наверное.

Автор:  Сергей Оборотов [ Понедельник, 06 Апрель, 2009 15:32 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Ali писал(а):
Переключать дефолтную настройку BIOS не очень удобно.
Не надо переключать, просто соберите всю библиотеку и заработает.

Автор:  XomA [ Понедельник, 06 Апрель, 2009 16:06 ]
Заголовок сообщения:  Re: Программа Hello world на GTK и ББ

Димыч писал(а):

1) Не производится инициализация структуры Kernel.bootInfo или я неправильно понимаю, откуда брать argc и argv. Обращение к Kernel.bootInfo.arg(c|v) гарантированно ведет к трапу.

Поэтому вызов gtk_init производится в виде gtk_init(0, 0);

Что не есть правильно.

Поделитесь, кто может, информацией о старте приложения в Linux, откуда берется командная строка? Что-то про регистр BX в исходниках ББ сказано, но, это все вилами по воде писано.


А может в модкле Kernel создать экспортируемую процедуру SetArgs и вызывать её из функции main в BlackBox.c? при этом собирать его с ключём -lBB? то есть использовать динамическое связывание, вместо динамической загрузки :?:

Автор:  Сергей Оборотов [ Понедельник, 06 Апрель, 2009 17:57 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Тогда уж main экспортировать.

Автор:  XomA [ Понедельник, 06 Апрель, 2009 23:53 ]
Заголовок сообщения:  Re: Программа Hello world на GTK и ББ

XomA писал(а):
...

я тут понаписал... :roll:
А всё проще нужно прочитать /proc/self/cmdline и сэмулировать argc и argv, так как я сделал в приложенном файле...
у меня работает... 8)

Вложения:
Kernel.odc [82.84 КБ]
Скачиваний: 813

Автор:  Сергей Оборотов [ Вторник, 07 Апрель, 2009 06:19 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

XomA, а чем Вас не устраивает прямое обращение к параметрам, передаваемым через стек? Если они передаются - значит это кому-нибудь нужно.

Автор:  Димыч [ Вторник, 07 Апрель, 2009 16:09 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

GUEST писал(а):
XomA, а чем Вас не устраивает прямое обращение к параметрам, передаваемым через стек? Если они передаются - значит это кому-нибудь нужно.

Провел я маленькое исследование.

При загрузке исполнимого модуля в Linux первые ТРИ параметра в стеке - окружение программы.
Первый - argc,
Второй - argv[]
Третий - env[]

После старта ebp содержит указатель на дно стека. Начиная от него олавливаем argc, argv, env.
Все ничего, но это верно для стека приложения, а не для стека библиотеки.
Сейчас загрузка ББ реализована через библиотеку, поэтому ebp явно изменяется.
Во всяком случае, без опыта работы на ассемблере в Linux мне не удалось до него дотянуться.

Еще одно важное замечание.

Командная строка в Windows получается с помощью функции API GetCommandLine и затем используется в HostFiles.
Здесь, скорее всего, надо поступить также.
Вот только я не знаю, будет ли корректным использовать /proc/self/cmdline, или же есть какой-то другой способ получить командную строку вызвавшего приложения. (будет ли это работать во FreeBSD?)

Автор:  Alexey Veselovsky [ Вторник, 07 Апрель, 2009 16:43 ]
Заголовок сообщения:  Re: Перевод BlackBox под Linux

Цитата:
There is not any general way to do this unix. Each OS has different ways to handle it and some are very hard. You mention Linux though. With Linux, the info is in the /proc filesystem. To get the command line for process id 9999, read the file "/proc/9999/cmdline".


http://www.unix.com/high-level-programm ... dline.html

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