Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Jul 05, 2020 9:09 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 124 posts ]  Go to page Previous 1 2 3 4 5 69 Next
Author Message
PostPosted: Fri Aug 19, 2011 4:04 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Может дело в этом ?
Code:
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()


Top
   
PostPosted: Fri Aug 19, 2011 4:07 pm 
Offline
User avatar

Joined: Wed Aug 18, 2010 5:38 pm
Posts: 102
Возможно, я тогда не пересобрал menuetlibc.
В приведённом фрагменте ещё баг: если программа вызывается без параметров, то argc=0, а если с 1 параметром, то сразу argc=2.
Почему-то мне кажется, что это всё уже обсуждалось на форуме, но не могу найти где именно...


Top
   
PostPosted: Fri Aug 19, 2011 4:34 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Вдруг кто-то посчитал, что argc=0 без параметров потому, что в Колибри программа не может узнать имя файла, из которого была запущена? (Или может?)


Top
   
PostPosted: Fri Aug 19, 2011 5:03 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Jaeger
Протрассировал в mtdbg твой вчерашний файл до вызова tp_args(). Ошибок нет. Командная строка разбирается на параметры и значение argс устанавливается правильно. адрес argv в памяти 03b008.


Top
   
PostPosted: Fri Aug 19, 2011 8:15 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1624
Это не баг gcc, что 64-битная версия при компиляции 32-битного кода ругается на совершенно нормальные в 32-битном мире опции? Это не проблема gcc, что он генерирует ужасный код? newlibc вроде не передаёт argc/argv, поэтому там проблема не проявляется, но это не значит, что её нет. Если в функции main компилятор вставляет такой пролог, что ему только и остаётся, что пихать argc/argv в регистры а невезучий программист не вовремя инициализирует консоль, то соответствующий аргумент обязательно испортится.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Aug 19, 2011 8:32 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Раньше сентября не смогу проверить, действительно ли виноват в таком безобразии gcc. Исходный код и все прочее лежит на ноуте, который сейчас очень далеко от меня. Впрочем, исходники вот: download/file.php?id=2311
Можно скомпилить их на сервере и посмотреть, все ли будет ОК.


Top
   
PostPosted: Fri Aug 19, 2011 9:20 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1624
Умолчальный win32-gcc на сервере имеет версию 3.4.5. На исходник в том виде, который есть, ругается:
Code:
main.c:9:20: console.c: No such file or directory

После замены <console.c> на "console.c":
Code:
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 .

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Aug 19, 2011 10:31 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
CleverMouse wrote:
newlibc вроде не передаёт argc/argv

В смысле не передаёт ?
Традиционную разбивку командной строки не делает.

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

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


Top
   
PostPosted: Mon Aug 22, 2011 3:13 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1624
Если действительно передаёт, значит, я ошиблась. В любом случае, argc/argv портятся кодом в main и вызываемых функциях независимо от того, насколько корректными они изначально были.
gcc виноват в том, что он генерирует код, для которого это существенно - остальные, включая gcc3 и msvc, как-то до сих пор писали и не натыкались. icc в этом плане - "а вдруг какая-нибудь далёкая функция в каком-нибудь неизвестном файле использует локальную SSE-переменную, требующую выравнивания? давайте выровняем стек прямо в main и дальше будем следить, что он остаётся выровненным, и плевать на размер бинарника и используемую память" - ещё хуже, если уж сравнивать, то с msvc, он хотя бы следит за приличиями.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Aug 22, 2011 3:44 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
CleverMouse

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


Top
   
PostPosted: Mon Aug 22, 2011 4:11 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1624
То есть gcc виноват в том, что вместо банальных [ebp+8],[ebp+12] из-за кривого пролога вынужден использовать регистры.
Для libavcodec.a с LOCAL_ALIGNED_16 можно и явно включить опцию -mpreferred-stack-boundary=4. Но gcc мало того, что делает это по умолчанию, так ещё и не позволяет явно уменьшить - и последнее есть совершенно конкретный баг gcc4.


Top
   
PostPosted: Mon Aug 22, 2011 4:42 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Может баг, а может фича. Сейчас любая большая программа тянет за собой с десяток библиотек. Особенно в Никсах с их сложными зависимостями. По этой причине gcc может принудительно выравнивать стек на ia32.
Spoiler: Show
Fplay main()
Code:
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


Top
   
PostPosted: Mon Aug 22, 2011 4:47 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1624
Разумеется, баг. Потому что 32-битная версия успешно следует этой опции, если, конечно, её явно указать.

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

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Aug 22, 2011 4:54 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Там тоже код не шибко сложный. Всё по учебнику
Update. Уже нет учебника.


Top
   
PostPosted: Wed Aug 24, 2011 11:00 pm 
Offline
User avatar

Joined: Wed Aug 18, 2010 5:38 pm
Posts: 102
Albom wrote:
Запускаю в VMWare Player. Получаю "Ошибка: Неподдерживаемая инструкция процессора"

Баг подтвердился, на EBox то же самое. Пересобрал и menuetlibc и tinypy с -mtune=i486 -march=i486, на EBox теперь работает.


Attachments:
tinypy.7z [85.98 KiB]
Downloaded 100 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 124 posts ]  Go to page Previous 1 2 3 4 5 69 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited