Board.KolibriOS.org

Official KolibriOS board
It is currently Thu Nov 21, 2019 10:54 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 30 posts ]  Go to page 1 2 Next
Author Message
 Post subject: LibC(MenuetLibC) + GCC
PostPosted: Fri Sep 10, 2010 9:00 pm 
Offline

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


Top
   
PostPosted: Sun Sep 12, 2010 7:17 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Наверное, все дело в том, что Menuet и Kolibri уже несколько лет как не совместимы...
Можно бороться, думаю, пересобрав эти самые библиотеки, используя версию libc для kolibri, которую можно найти на сайте diamond'а


Top
   
PostPosted: Sun Feb 20, 2011 11:28 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Очень-очень плохая новость для всех, кто пользуется 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]);}


Top
   
PostPosted: Sun Feb 20, 2011 3:18 pm 
Offline
Kernel Developer

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

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


Top
   
PostPosted: Sun Feb 20, 2011 5:31 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
я компилирую mgcc. вечером проверю,спасибо... не думал,что стек не выделяется динамически... как примерно рассчитать достаточный его объем?


Top
   
PostPosted: Sun Feb 20, 2011 8:19 pm 
Offline

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


Top
   
PostPosted: Sun Feb 20, 2011 8:30 pm 
Offline

Joined: Thu Nov 25, 2010 8:26 pm
Posts: 41
Если не ошибаюсь, эта опция для mingw32-ld. Или для бинарников в формате PE.
Как-то так.


Top
   
PostPosted: Sun Feb 20, 2011 8:39 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Беда :( у меня нет mingw


Top
   
PostPosted: Sun Feb 20, 2011 8:50 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 752
Sorcerer
можешь пока mingw не искать. добавление опции --stack 0x100000 в исходник mld и его перекомпилирование не помогло.


Top
   
PostPosted: Sun Feb 20, 2011 10:33 pm 
Offline
Kernel Developer

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

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


Top
   
PostPosted: Mon Feb 21, 2011 12:00 pm 
Offline
Kernel Developer
User avatar

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

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


Top
   
PostPosted: Mon Feb 21, 2011 1:54 pm 
Offline

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


Top
   
PostPosted: Mon Feb 21, 2011 1:57 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
CleverMouse wrote:
а что, глюки здесь умел исправлять только diamond

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


Top
   
PostPosted: Mon Feb 21, 2011 2:00 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 752
Serge wrote:
Надо залить. Иначе начнётся путаница с версиями.

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


Top
   
PostPosted: Mon Feb 21, 2011 2:16 pm 
Вообще-то diamond это человек, как и все остальные человеки. Может хватит его пытаться канонизировать? Он еще жив и здоров. Баги исправлял не только он, но поскольку его соображалка работает лучше и быстрее, чем у многих из нас - то так получалось, что он быстрее правил и тащил на себе все. Что собственно и привело к тому что "сгорел" на работе.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 30 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: MSN [Bot] 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:  
cron
Powered by phpBB® Forum Software © phpBB Limited