LINUX.ORG.RU

попридержать gcc


0

0

Есть gcc 4.3.2 (Debian 4.3.2-1.1). Есть .c файл размером в 30 Mb, который хранит бинарные данные, конвертированные в Си массив, типа

static const char BLB[] = {
0x7f, 0x45, ...
};

gcc при его компиляции у меня съедает 800Mb памяти, а на хостинге всю оперативу и своп (суммарно 1.3 Gb). Как его попридержать в использовании памяти? Строка компиляции такая

gcc -c -Wall -W -Werror -O0 -o main.o main.c

Ответ на: комментарий от Sylvia

-param ggc-min-expand=0 --param ggc-min-heapsize=8192

еще вот такие флажки можно попробовать для ограничения heap используемного gcc

Sylvia ★★★★★
()

> Есть .c файл размером в 30 Mb, который хранит бинарные данные, конвертированные в Си массив

не уверен что сие есть гут. может быть вынести данные в отдельный файл и оттуда читать ?

isden ★★★★★
()
Ответ на: комментарий от isden

это пока невозможно по техническим причинам

alex_custov ★★★★★
() автор топика
Ответ на: комментарий от Sylvia

ничего из этого не помогает. Флаги gcc не помогают вообще, с установленным ulimit gcc просто вылетает c «virtual memory exhausted: Невозможно выделить память».

alex_custov ★★★★★
() автор топика

Есть .c файл размером в 30 Mb, который хранит бинарные данные, конвертированные в Си массив, типа

static const char BLB[] = { 0x7f, 0x45, ... };

Зачем было конвертировать их в код на C?

ld -r -b binary -o data.o data.bin
В полученном объектнике будут переменные _binary_data_bin_start, _binary_data_bin_end и _binary_data_bin_size.

Deleted
()
Ответ на: комментарий от Deleted

интересная мысль, попробую переделать

alex_custov ★★★★★
() автор топика
Ответ на: комментарий от alex_custov

можно разнести препроцессинг и компиляцию
gcc -E -o main.i main.c
gcc main.i -o main.o

компилировать можно и на другой машине где много памяти,
если файлик не конфиденциальный, может выложите main.i после препроцессора ?

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

препроцессинг тут ничтожно мал, это же не С++.

если файлик не конфиденциальный, может выложите main.i после препроцессора ?


там смотреть не на что - несколько системных include-ов и 30Mb hex-ов.

alex_custov ★★★★★
() автор топика

Никогда не делать так с бинарными данными, а использовать objcopy (man objcopy).

linuxfan
()

а на хостинге всю оперативу и своп

добавить своп файл не?

anonymous2 ★★★★★
()
Ответ на: комментарий от alex_custov

>несколько системных include-ов и 30Mb hex-ов.
может лучше отделить «30Mb hex-ов.» в отдельный файл без «системных include-ов»?

xydo ★★
()

А насколько вообще разумно хранить такой блоб в коде? Скорости работы это не прибавит нифига.

ixrws ★★★
()

AFAIK, это проблема парсера gcc. Рекурсивного. На каждую запятую - по уровню вложенности. Не лечится.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Можно посмотреть, сколько памяти при компиляции этого файла будет жрать gcc 4.0 . Нынешний парсер они вроде бы вкутили в gcc 4.1

Manhunt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.