3

Я пытаюсь скомпилировать мой C-проект в Ubuntu (32bit), работающий в VirtualBox. Компиляция рассматриваемого кода требует довольно много памяти, по крайней мере, 3 гигабайта. Поэтому я дал ВМ 2 гига. Вместе с 2 гигабайтами пространства подкачки, этого должно быть достаточно. По какой-то причине gcc не работает с ошибкой нехватки памяти после того, как он выделил 900 мег или около того. Увеличение объема памяти до 2,7 гигабайт (максимально допустимое для VirtualBox) не помогло. Кажется, существует ограничение на количество памяти, которое может использовать процесс. Но когда я запускаю ulimit , он показывает "безлимитный".

ОБНОВЛЕНИЕ - Вот журнал make:

libtool: compile: cc -msse2 -I. -I/home/cleong/qb -DPHP_ATOM_INC -I/home/cleong/qb/include -I/home/cleong/qb/main -I/home/cleong/qb -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -DHAVE_CONFIG_H -g -O2 -c /home/cleong/qb/qb_interpreter_gcc.c -fPIC -DPIC -o .libs /qb_interpreter_gcc.o

cc1: из памяти выделено 408 байт после 924852224 байт

make: *** [qb_interpreter_gcc.lo] Ошибка 1

Вывод из /bin /time -v:

Command exited with non-zero status 2
    Command being timed: "make"
    User time (seconds): 62.09
    System time (seconds): 11.28
    Percent of CPU this job got: 64%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 1:53.02
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1848592
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 9433
    Minor (reclaiming a frame) page faults: 1391779
    Voluntary context switches: 5642
    Involuntary context switches: 6069
    Swaps: 0
    File system inputs: 630360
    File system outputs: 1376
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 2

Версия gcc - 4.7.2.

Исходный код здесь:

https://github.com/chung-leong/qb

Это расширение PHP. Процесс сборки использует phpize.

ОБНОВЛЕНИЕ - Я сталкиваюсь с той же проблемой в 32-разрядной версии Mageia 3, которая также включает в себя gcc 4.7.2. Сбой происходит на уровне около 2,7 гига вместо. В 64-битной среде этого не происходит.

Если я установлю gcc 4.6.3 и соберусь с его помощью, это сработает.

2 ответа2

2

Тот факт, что с уровнем оптимизации -O1 или ниже 64-битной Ubuntu удается скомпилировать проект, означает, что проблема заключается в фазе оптимизации gcc.

Я предполагаю, что какой-то исходный файл в вашем проекте случается из-за ошибки или неэффективности в оптимизаторе gcc, представленном в версии 4.7.2. что вызывает использование неоправданного количества памяти.

Так что я бы предложил:

  1. 32-разрядная версия gcc может получить доступ только к 2-3 ГБ памяти (независимо от размера подкачки).
  2. Увеличьте пространство подкачки, но продолжайте читать, если это не поможет. В любом случае для 32-разрядного gcc будет ограничено количество памяти, которое он может использовать.
  3. Собирая исходные файлы один за другим, найдите тот, который отвечает за проблему. Если это все из них, то проблема с некоторыми включаемыми файлами.
  4. Если проблема не в подключаемом файле, разбейте проблемный исходный файл на несколько частей, пока вы не перестанете получать ошибку или не найдете саму функцию, которая ее вызывает.
  5. В качестве временного решения, измените файл make, чтобы скомпилировать эту функцию с -O1 . Проблема в этом случае в самом gcc, и вы можете отправить эту функцию в отчете об ошибке (вместе со всеми вашими включаемыми файлами).
  6. Конечно, вы также можете скомпилировать весь проект с -O1 которого должно быть достаточно для расширения PHP, или на данный момент остаться с gcc 4.6.3.
  7. Продолжайте пробовать новые обновления для gcc, так как ошибка может быть исправлена (или устранена неэффективность) независимо от вашего сообщения об ошибке.
0

Вау, это проект!

Похоже, вам придется использовать кросс-компилятор, работающий на 64-битной хост-системе, чтобы построить этот проект. Firefox построен таким образом IIRC.

GCC, вероятно, исчерпал все свое адресное пространство из-за фрагментации виртуальной памяти, и также 900 мегабайт, которые вы видите в статистике, - это, вероятно, выделенная физическая память, которая обычно ниже, чем зарезервированная виртуальная память.

Кроме того, каждый 32-разрядный процесс может получить доступ не более чем к 2 ГБ памяти независимо от того, какой у вас размер физической памяти и файла подкачки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .