Board.KolibriOS.org
http://board.kolibrios.org/

LibC(MenuetLibC) + GCC
http://board.kolibrios.org/viewtopic.php?f=24&t=1510
Page 1 of 2

Author:  Egor [ Fri Sep 10, 2010 9:00 pm ]
Post subject:  LibC(MenuetLibC) + GCC

Всем привет ... кто разбирается в Cи помогите плиз.
Програмируя под KOS на Си, наткнулся на следующую проблемму :
Мне нужно было отобразить какойнить рисунок, и вот - libJPEG и libPNG которые шли с MenuetLibC(bin pack) (*.lib) без проблем линковались . И всё бы ничего еслибы они не валились в рантайме .
Могу позже выложить лог крэша из борда ... но я думаю он не сильно поможет .
Если кто на это натыкался , то подскажите плиз ,как была решена проблемма. (компиля под винду "тот же код" всё работает и не крэшится!!);

Author:  SoUrcerer [ Sun Sep 12, 2010 7:17 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Наверное, все дело в том, что Menuet и Kolibri уже несколько лет как не совместимы...
Можно бороться, думаю, пересобрав эти самые библиотеки, используя версию libc для kolibri, которую можно найти на сайте diamond'а

Author:  SoUrcerer [ Sun Feb 20, 2011 11:28 am ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Очень-очень плохая новость для всех, кто пользуется LibC для GCC и MinGW.
Кроме костылявой реализации сигналов, в библиотеке большие проблемы с реализацией crt, а может быть, и чего-то еще.
А именно: некорректно работает передача аргументов программе (argc, argv). Данные функции используются, насколько я знаю, в fceu, shell и возможно других программах (cObj?), не говоря уже про те, которые я пытаюсь портировать.
Временами (по не очень ясным пока причинам) получается скомпилированная программа, в которой argc всегда равен очень большому числу, а обращение к argv[n] приводит к page fault. Подобную проблему можно увидеть, например, в реализации brainfuck для Колибри.
Spoiler: Show
В коде есть проверка на argc>=2, но даже если никаких параметров не передано, argc значительно больше 2, поэтому происходит обращение к argv[1]. И - page fault.

Код, ответственный за разбор параметров, подписан diamond'ом, что очень печально. Боюсь, в ближайшее время он не сможет помочь с исправлением этой ошибки в libc. Поэтому очень большая просьба для всех, кому не безразлична libc и кто использует ее для своих программ: если вы найдете (нашли) ошибку, пожалуйста, расскажите, в чем дело и как ее исправить.
Возможно, мне помог бы исходный код newlib.

Spoiler: Show
Не верится?
Этот код работает:
Code:
void main(int argc, char** argv){
int x=argc;
printf ("argc .. %d ..  \n", x);
char * fil;
fil=argv[1];
printf ("file .. %s ..  \n", fil);}

А этот код не работает:
Code:
void main(int argc, char** argv){
printf ("argc .. %d ..  \n", argc);
printf ("file .. %s ..  \n", argv[1]);}

Author:  Serge [ Sun Feb 20, 2011 3:18 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Sorcerer

У меня правильно работает. Ты наверное забыл указать размер стека. Для программ с newlib опции линковки: -nostdlib -static -T kos.ld --image-base 0 --stack 0x100000
Стек только резервируется, так что больше чем надо не выделится.

Author:  SoUrcerer [ Sun Feb 20, 2011 5:31 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

я компилирую mgcc. вечером проверю,спасибо... не думал,что стек не выделяется динамически... как примерно рассчитать достаточный его объем?

Author:  SoUrcerer [ Sun Feb 20, 2011 8:19 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Не понял :(
У моего ld нет опции stack. Это кому такой параметр нужно передавать? Или в menuetlibc это в crt0_coff.asm параметр app_stack (который идет после заголовка MENUET01)?

Author:  Foldl [ Sun Feb 20, 2011 8:30 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Если не ошибаюсь, эта опция для mingw32-ld. Или для бинарников в формате PE.
Как-то так.

Author:  SoUrcerer [ Sun Feb 20, 2011 8:39 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Беда :( у меня нет mingw

Author:  Albom [ Sun Feb 20, 2011 8:50 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Sorcerer
можешь пока mingw не искать. добавление опции --stack 0x100000 в исходник mld и его перекомпилирование не помогло.

Author:  Serge [ Sun Feb 20, 2011 10:33 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Sorcerer

Опция --stack толька для сборки с newlibc. Она в coff и рассчитана на mingw или кросскомпилятор если в Linux.

Author:  CleverMouse [ Mon Feb 21, 2011 12:00 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

"Код, ответственный за разбор параметров, подписан diamond'ом, что очень печально. Боюсь, в ближайшее время он не сможет помочь с исправлением этой ошибки в libc." - а что, глюки здесь умел исправлять только diamond? То-то в последнее время никто ничего не исправляет...
P.S. Размер стека в menuetlibc задаётся статически константой в crt0*.asm.

Author:  SoUrcerer [ Mon Feb 21, 2011 1:54 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Программист, написавший код, понимает его скорее всего лучше, чем кто-либо еще, мне кажется.
Размер стека - это app_stack в crt0.asm, и выглядит он как обычно в программах для Колибри на FASM - в конце файла "app_stack:". Действительно ли проблема в этом, или может быть, что нет?

Author:  Serge [ Mon Feb 21, 2011 1:57 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

CleverMouse wrote:
а что, глюки здесь умел исправлять только diamond

Так и было. Кстати, не нашёл исходников menuetlibc на svn. Надо залить. Иначе начнётся путаница с версиями.

Author:  Albom [ Mon Feb 21, 2011 2:00 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Serge wrote:
Надо залить. Иначе начнётся путаница с версиями.

Да, залить просто необходимо. Но нужно выбрать лучшую версию.
Если будет на svn, то и ошибки проще исправлять. Я уже несколько мелких нашёл.

Author:  Mario [ Mon Feb 21, 2011 2:16 pm ]
Post subject:  Re: LibC(MenuetLibC) + GCC

Вообще-то diamond это человек, как и все остальные человеки. Может хватит его пытаться канонизировать? Он еще жив и здоров. Баги исправлял не только он, но поскольку его соображалка работает лучше и быстрее, чем у многих из нас - то так получалось, что он быстрее правил и тащил на себе все. Что собственно и привело к тому что "сгорел" на работе.

Page 1 of 2 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/