На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Подскажите как и чем скомпилировать?
    Есть некий проект, не мой понятно. В строке:
    ExpandedWrap disabled
              if(!(fs = (filesystem*)calloc(nbblocks, BLOCKSIZE)))
                      error_msg_and_die("not enough memory for filesystem");

    содержится ошибка, приводящая к краху программы при попытке выделить около гигабайта памяти. Вроде и исправить легко, но никак не пойму чем и как компилировать это чудо. Пробовал ставить minGW, но не получается, установщик постоянно выдает ошибки, как я понял из-за медленного интернета (какой редиска вообще придумал инсталлировать онлайн, да еще так криво?). Да и не представляю как им пользоваться.
    В общем хэлп.
    Или подскажите, как портировать под любой нормальный компилятор, к примеру ватком? А то для меня конструкции типа:
    ExpandedWrap disabled
      typedef struct
      {
              directory_decl
              char d_name[0];
      } directory;

    выглядят дико, никак не пойму как это объявляется массив нулевой длины и какой размер вернет sizeof(directory)? Плюс непонятные функции, типа readlink.
    Прикреплённый файлПрикреплённый файлgenext2fs_1.4.1.rar (87,03 Кбайт, скачиваний: 74)
      Компилировать – любым POSIX совместимым компилятором. minGW может не подойти, лучше cygwin попробовать... впрочем, его тем более хрен поставишь, если minGW не онлайнится... ну, тогда любая raw POSIX ОС. Убунта, Дебиан... Честно говоря, не совсем понятно, как ты это под виндой собрался использовать. Портировать под нормальный – это какой? Я бы не назвал watcom нормальным нынче. И портировать тут в общем-то нечего: текст заточен конкретно под POSIX и файловую систему *nux-ов.
      С распределением гигабайта динамической памяти проблем быть не должно. Что за крах-то хоть?
      Ну, дико/не дико, а раньше нередко использовалось для массивов переменного размера. Просто присобачиваешь к sizeof(структуры) нужный тебе размер массива d_name, делаешь malloc() этой цифре и спокойно себе индексируешь directory.d_name[какие угодно смещения, лишь бы не больше присобаченного].
        Я то думал cygwin - это эмулятор для запуска линуксных программ. Тогда все сходится, екзешник как раз в папке cygwin, с какими-то cyg*.dll.
        Правда установить cygwin не получается, типа версия винды не подходит. Ссылок на предыдущие версии чего-то не нашел, точнее что-то написано про версию под XP, но ссылки не рабочие. Начинаю понимать, почему линуксы/юниксы так не популярны :D
        Я учил немецкий, возможно просто не врубился и на сайте есть ссылки на старые версии cygwin. Если не трудно, ткните плиз носом.

        [offtop]
        Цитата Qraizer @
        Портировать под нормальный – это какой? Я бы не назвал watcom нормальным нынче. И портировать тут в общем-то нечего: текст заточен конкретно под POSIX и файловую систему *nux-ов.
        Не буду спорить, на вскус и цвет...
        Цитата Qraizer @
        С распределением гигабайта динамической памяти проблем быть не должно. Что за крах-то хоть?

        ExpandedWrap disabled
          D:\_Phone\MTWT>genext2fs -a -d Unpack/system -b 237033 -m 0 Pack/Firmware/Image/system.img
          ***************************
          *           OK!           *
          ***************************
        С малым размером все ок.
        ExpandedWrap disabled
          D:\_Phone\MTWT>genext2fs -a -d Unpack/system -b 676422 -m 0 Pack/Firmware/Image/system.img
          genext2fs: not enough memory for filesystem
        Тут ошибка выделения памяти, всего то около 700 мегабайт под образ фс. Вот ее и нужно подправить. Других аналогичных утилит под винду не нашел, а андроид очень хочется урезать, чтобы перераспределить память в смарте.

        Цитата Qraizer @
        Ну, дико/не дико, а раньше нередко использовалось для массивов переменного размера. Просто присобачиваешь к sizeof(структуры) нужный тебе размер массива d_name, делаешь malloc() этой цифре и спокойно себе индексируешь directory.d_name[какие угодно смещения, лишь бы не больше присобаченного].
        Так что вернет sizeof на data[0]? Ведь налицо противоречия синтаксиса. Не знаю как сейчас, а раньше объявляли массив в один байт, который считали первым байтом динамического массива и всем все понятно было и знали как это воспримет компилятор. А тут я в растерянности.
        [/offtop]

        Кстати, а может дело в либах cygwin? По идее программа с виндой взаимодействует через них, может в новых версиях исправили этот косяк с выделением?
          Цитата Eretic @
          Тут ошибка выделения памяти, всего то около 700 мегабайт под образ фс. Вот ее и нужно подправить. Других аналогичных утилит под винду не нашел, а андроид очень хочется урезать, чтобы перераспределить память в смарте.


          А что именно нужно подправить - чтоб память нормально выделялась или чтоб программа не падала при ошибке выделения памяти?
            Конечно чтобы память выделялась. Есть возможность Перекомпилировать?
              Думаю, здесь лучше не выделять память одним массивом, а сделать список или массив указателей
                Это потребует серьёзных изменений в программе. Я хотел через winapi, там размеры не ограничены.
                Вообще думаю вечерком глянуть в отладчике, может прямо в программе можно изменения произвести. Завтра отпишусь, что получилось.
                  Цитата Eretic @
                  Я то думал cygwin - это эмулятор для запуска линуксных программ.
                  Отчасти. Cygwin – это Cygnus for Windows, а Cygnus – это название компании, её разработчика, Cygnus Support, где Cygnus (как и GNU – "GNU's Not UNIX"): "Cygnus is Your GNU Support". Формально Cygwin является комплексом средств для поддержки исполнительной POSIX-среды и средств разработки под неё в операционном окружении Windows. Примерно как Wine, только наоборот. minGW – это minimal GNU for Windows, тот же Cygwin, только минимально возможный и потому в ряде аспектов довольно ограниченный.
                  Цитата Eretic @
                  Не буду спорить, на вскус и цвет...
                  Просто тут следует уточнить смысл прилагательного "нормальный". С точки зрения поддержки последних Стандартов C/C++ ваткомовские компиляторы сильно отстают. Особенно C++, лет эдак на 15.
                  Цитата Eretic @
                  Тут ошибка выделения памяти, всего то около 700 мегабайт под образ фс. Вот ее и нужно подправить.
                  Выделить гигабайт не должно быть проблемой даже в 32-битной среде. Но как выше уже было говорено, для этого требуется этому гигабайту быть непрерывным. Не исключено, что твоя тулза уже успела нафигачить malloc()/free(), чем фрагментировала хип. Как исправить... та фиг его знает. Надо скрупулёзно изучать, что она там делает и минимизировать фрагментацию. Как вариант – портануть под 64 бита, но тут неизвестно ещё, что проще.
                  Цитата Eretic @
                  Так что вернет sizeof на data[0]?
                  Размер структуры. Конечно, массив из нуля элементов ничего не добавит к размеру. В твоём случае это будет sizeof(directory_decl) плюс ещё может быть pad в 1-3 байта.

                  Добавлено
                  Цитата Eretic @
                  Ведь налицо противоречия синтаксиса.
                  Вообще, как бы да, массивы нулевого размера – это нонсенс. Однако конкретно в виде последнего элемента структуры эта конструкция специально оговаривается в Стандарте.

                  Добавлено
                  Вот это (C programming language standard ISO/IEC 9899):
                  Цитата 6.7.2.1 Structure and union specifiers
                  16) As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. With two exceptions, the flexible array member is ignored. First, the size of the structure shall be equal to the offset of the last element of an otherwise identical structure that replaces the flexible array member with an array of unspecified length.106) Second, when a . (or ->) operator has a left operand that is (a pointer to) a structure with a flexible array member and the right operand names that member, it behaves as if that member were replaced with the longest array (with the same element type) that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array. If this array would have no elements, it behaves as if it had one element but the behavior is undefined if any attempt is made to access that element or to generate a pointer one past it.

                  106) The length is unspecified to allow for the fact that implementations may give array members different alignments according to their lengths.
                    Цитата Qraizer @
                    Просто тут следует уточнить смысл прилагательного "нормальный".
                    Для всех он будет разный, все дело в привычках. Зря я употребил этот термин, беру слова назад, пока не разгорелся очередной бессмысленный холивар :)
                    За остальное спасибо, познавательно!

                    В общем предположения оказались верными. Заменил cygwin1.dll на аналогичный, но версии 2.5.2 и утилита заработала, собрал таки андроид без лишнего шлака :dance: Видимо была ошибка в rtl.

                    Тем не менее, уже ради интереса. Нашел старый установщик и небитую ссылку на setup.ini, после чего таки установил CYGWIN. Но вот беда, make ругается на параметр Target. Он для чего вообще нужен?
                      Закрою тему. Установщик версии 2.774 криво утановил cygwin под XP. Нашел версии 2.510.2.2, который сделал все быстро и правильно. Программа скомпилировалась с полпинка. К тому же, этот установщик скачал весь пакет за 40 минут (600+ Мб), а который версии 2.744 за час скачал только 70 Мб! Что-то создатели перемудрили в старших версиях.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0389 ]   [ 18 queries used ]   [ Generated: 19.03.24, 04:45 GMT ]