Очень-очень плохая новость для всех, кто пользуется LibC для GCC и MinGW.
Кроме костылявой реализации сигналов, в библиотеке большие проблемы с реализацией crt, а может быть, и чего-то еще.
А именно: некорректно работает передача аргументов программе (argc, argv). Данные функции используются, насколько я знаю, в fceu, shell и возможно других программах (cObj?), не говоря уже про те, которые я пытаюсь портировать.
Временами (по не очень ясным пока причинам) получается скомпилированная программа, в которой argc всегда равен очень большому числу, а обращение к argv[n] приводит к page fault. Подобную проблему можно увидеть, например, в реализации brainfuck для Колибри.
В коде есть проверка на argc>=2, но даже если никаких параметров не передано, argc значительно больше 2, поэтому происходит обращение к argv[1]. И - page fault.
Код, ответственный за разбор параметров, подписан diamond'ом, что очень печально. Боюсь, в ближайшее время он не сможет помочь с исправлением этой ошибки в libc. Поэтому очень большая просьба для всех, кому не безразлична libc и кто использует ее для своих программ: если вы найдете (нашли) ошибку, пожалуйста, расскажите, в чем дело и как ее исправить.
Возможно, мне помог бы исходный код newlib.
Не верится?
Этот код работает:
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]);}