Page 4 of 9

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 4:04 pm
by Serge
Может дело в этом ?

Code: Select all

void __crt1_startup(void)
{
 init_brk();
 if(__menuet__app_param_area[0]!='\0')
 __crt0_setup_arguments();
 dosemu_inithandles();
 init_dir_stack();
// atexit(dosemu_atexit);
 __main();  <<<<<<
 {
  int stat=main(__crt0_argc,__crt0_argv);
  exit(stat);
 }
}
Не знаю как в никсах, в Mingw32 __main() вызывается автоматически в прологе main()

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 4:07 pm
by Jaeger
Возможно, я тогда не пересобрал menuetlibc.
В приведённом фрагменте ещё баг: если программа вызывается без параметров, то argc=0, а если с 1 параметром, то сразу argc=2.
Почему-то мне кажется, что это всё уже обсуждалось на форуме, но не могу найти где именно...

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 4:34 pm
by SoUrcerer
Вдруг кто-то посчитал, что argc=0 без параметров потому, что в Колибри программа не может узнать имя файла, из которого была запущена? (Или может?)

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 5:03 pm
by Serge
Jaeger
Протрассировал в mtdbg твой вчерашний файл до вызова tp_args(). Ошибок нет. Командная строка разбирается на параметры и значение argс устанавливается правильно. адрес argv в памяти 03b008.

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 8:15 pm
by CleverMouse
Это не баг gcc, что 64-битная версия при компиляции 32-битного кода ругается на совершенно нормальные в 32-битном мире опции? Это не проблема gcc, что он генерирует ужасный код? newlibc вроде не передаёт argc/argv, поэтому там проблема не проявляется, но это не значит, что её нет. Если в функции main компилятор вставляет такой пролог, что ему только и остаётся, что пихать argc/argv в регистры а невезучий программист не вовремя инициализирует консоль, то соответствующий аргумент обязательно испортится.

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 8:32 pm
by SoUrcerer
Раньше сентября не смогу проверить, действительно ли виноват в таком безобразии gcc. Исходный код и все прочее лежит на ноуте, который сейчас очень далеко от меня. Впрочем, исходники вот: download/file.php?id=2311
Можно скомпилить их на сервере и посмотреть, все ли будет ОК.

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 9:20 pm
by CleverMouse
Умолчальный win32-gcc на сервере имеет версию 3.4.5. На исходник в том виде, который есть, ругается:

Code: Select all

main.c:9:20: console.c: No such file or directory
После замены <console.c> на "console.c":

Code: Select all

In file included from main.c:9:
console.c:26: error: 'printf' redeclared as different kind of symbol
/home/autobuild/localcopy/programs/develop/libraries/menuetlibc_/include/stdio.h:95: error: previous declaration of 'printf' was here
console.c:26: error: 'printf' redeclared as different kind of symbol
/home/autobuild/localcopy/programs/develop/libraries/menuetlibc_/include/stdio.h:95: error: previous declaration of 'printf' was here
console.c:28: error: 'gets' redeclared as different kind of symbol
/home/autobuild/localcopy/programs/develop/libraries/menuetlibc_/include/stdio.h:93: error: previous declaration of 'gets' was here
console.c:28: error: 'gets' redeclared as different kind of symbol
/home/autobuild/localcopy/programs/develop/libraries/menuetlibc_/include/stdio.h:93: error: previous declaration of 'gets' was here
После изменения имён собирает, несжатый бинарник http://builds.kolibrios.org/.test/bfk .

Re: Python для KolibriOS

Posted: Fri Aug 19, 2011 10:31 pm
by Serge
CleverMouse wrote:newlibc вроде не передаёт argc/argv
В смысле не передаёт ?
Традиционную разбивку командной строки не делает.

gcc не виноват что void __stdcall con_init() затирает ebx и esi нарушая соглашение о передаче параметров.

Gcc поддерживает примерно 40 архитектур. Очень может быть, что icc сгенерирует код получше. И опять, есть соглашения о передаче параметров. Компилятор не может свободно жонглировать регистрами, как это делает программист. Хотя некоторое движение в этом направлении есть.

Re: Python для KolibriOS

Posted: Mon Aug 22, 2011 3:13 pm
by CleverMouse
Если действительно передаёт, значит, я ошиблась. В любом случае, argc/argv портятся кодом в main и вызываемых функциях независимо от того, насколько корректными они изначально были.
gcc виноват в том, что он генерирует код, для которого это существенно - остальные, включая gcc3 и msvc, как-то до сих пор писали и не натыкались. icc в этом плане - "а вдруг какая-нибудь далёкая функция в каком-нибудь неизвестном файле использует локальную SSE-переменную, требующую выравнивания? давайте выровняем стек прямо в main и дальше будем следить, что он остаётся выровненным, и плевать на размер бинарника и используемую память" - ещё хуже, если уж сравнивать, то с msvc, он хотя бы следит за приличиями.

Re: Python для KolibriOS

Posted: Mon Aug 22, 2011 3:44 pm
by Serge
CleverMouse

Это же не FASM с его сборкой из исходников. А если я подключаю libavcodec.a с её LOCAL_ALIGNED_16? Потом жаловаться на то, что тупой gcc не выровнял стек ? Ну от ffmpeg ещё можно ожидать разного SSE-свинства, но команды могут встретится там, где и не подозреваешь.
CleverMouse wrote:gcc виноват в том, что он генерирует код, для которого это существенно
То есть gcc виноват в том что пытается оптимизировать код и не обрамляет каждый вызов pushad popad ?
Компилятор генерирует код следуя ABI и не отвечает за функции нарушающие правила. MSVC использует такой же ABI, за исключением FPU/SSE. То что ошибка не проявляется ещё не значит что она не появится при небольшой модификации кода.

Re: Python для KolibriOS

Posted: Mon Aug 22, 2011 4:11 pm
by CleverMouse
То есть gcc виноват в том, что вместо банальных [ebp+8],[ebp+12] из-за кривого пролога вынужден использовать регистры.
Для libavcodec.a с LOCAL_ALIGNED_16 можно и явно включить опцию -mpreferred-stack-boundary=4. Но gcc мало того, что делает это по умолчанию, так ещё и не позволяет явно уменьшить - и последнее есть совершенно конкретный баг gcc4.

Re: Python для KolibriOS

Posted: Mon Aug 22, 2011 4:42 pm
by Serge
Может баг, а может фича. Сейчас любая большая программа тянет за собой с десяток библиотек. Особенно в Никсах с их сложными зависимостями. По этой причине gcc может принудительно выравнивать стек на ia32.
Spoiler:Fplay main()

Code: Select all

00000274                 lea     ecx, [esp+arg_0]
00000278                 and     esp, 0FFFFFFF0h
0000027B                 push    dword ptr [ecx-4]
0000027E                 push    ebp
0000027F                 mov     ebp, esp
00000281                 push    edi
00000282                 push    esi
00000283                 push    ebx             ; char *
00000284                 push    ecx
00000285                 sub     esp, 58h
00000288                 mov     ebx, [ecx]
0000028A                 mov     esi, [ecx+4]
0000028D                 call    ___main
00000292                 cmp     ebx, 1
00000295                 jle     loc_5D5
0000029B                 mov     eax, [esi+4]
0000029E                 mov     dword ptr ds:_movie_file, eax
000002A3                 call    _avcodec_register_all
000002A8                 call    _avdevice_register_all
000002AD                 call    _av_register_all
Забыл -fomit-frame-pointer
Вот каким образом здесь будет работать [ebp+8],[ebp+12] если перед
mov ebp, esp
идёт
and esp, 0FFFFFFF0h

Re: Python для KolibriOS

Posted: Mon Aug 22, 2011 4:47 pm
by CleverMouse
Разумеется, баг. Потому что 32-битная версия успешно следует этой опции, если, конечно, её явно указать.

Здесь не будет. В простых программах должен.

Re: Python для KolibriOS

Posted: Mon Aug 22, 2011 4:54 pm
by Serge
Там тоже код не шибко сложный. Всё по учебнику
Update. Уже нет учебника.

Re: Python для KolibriOS

Posted: Wed Aug 24, 2011 11:00 pm
by Jaeger
Albom wrote:Запускаю в VMWare Player. Получаю "Ошибка: Неподдерживаемая инструкция процессора"
Баг подтвердился, на EBox то же самое. Пересобрал и menuetlibc и tinypy с -mtune=i486 -march=i486, на EBox теперь работает.