2012-01-20 4 views
0

Я работаю с унаследованным + академическим + числовым кодом fortran-77, для которого требуется g77 3.2.x для компиляции и запуска ... Я использую этот компилятор на Red Hat Linux 9 для i386g77 version 3.2 создает большой файл объекта с опцией -finit-local-zero

Один из этих файлов fortran-77 определяет подпрограмму с множеством массивов реального, целочисленного и двойного значений в виде локальных переменных ... если я скомпилирую ее, используя:

$ g77 -c thefile.F -o thefile.o 

производит объектный файл размером около 10kb ... но следующее:

$ g77 -finit-local-zero -c thefile.F -o thefile.o 

создает файл объект размера 14MB

Я попытался strip «ИНГ объектный файл, но размер не изменится

пара десятков таких файлов в коде и исполняемый двоичный файл заканчивается время 200 МБ в размере

Любое представление о том, что происходит? что еще важнее Что я могу сделать, чтобы вернуться к уменьшенному размеру объекта/двоичного размера?

PS: когда я сжал 200MB двоичный файл в tar.gz, tarball был меньше 1 МБ ... значит, возможно, 200 МБ заполнено 0 или что-то (я мог бы открыть его в шестнадцатеричном редакторе, но я ' м чувство поленитесь прямо сейчас)

PS: подробности компилятора приведены ниже (с использованием -v флаг g77)

$ g77 -v -finit-local-zero -c thefile.F -o thefile.o 
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux 
Thread model: posix 
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) 
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/tradcpp0 -lang-fortran -v -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i386__ thefile.F /tmp/ccXXvzMA.f 
GNU traditional CPP version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) 
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/f771 /tmp/ccXXvzMA.f -quiet -dumpbase thefile.F -version -finit-local-zero -o /tmp/cck0Blw1.s 
GNU F77 version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) (i386-redhat-linux) 
    compiled by GNU C version 3.2.2 20030222 (Red Hat Linux 3.2.2-5). 
as -V -Qy -o thefile.o /tmp/cck0Blw1.s 
GNU assembler version 2.13.90.0.18 (i386-redhat-linux) using BFD version 2.13.90.0.18 20030206 

EDIT: новые G77/gfortran версии не имеют этой проблемы (объект размер файла остается почти таким же, как -finit-local-zero), но я не могу их использовать (создание кода для получения правильных результатов с последними версиями компилятора будет проектом в нем self) ... и мне нужен флаг -finit-local-zero (код висит без него)

EDIT 2: Я взял шестнадцатеричный дамп и, конечно же, 99% файла состоит из нулей!

+1

Вы пробовали эти параметры с помощью gfortran, чтобы посмотреть, смогут ли они работать с вашим кодом ?: -фессия-форма -фикс-строка-длина-нет -fno-automatic -finit-local-zero –

+0

@MSB Я попробую это и дам вам знать ... однако я не слишком оптимистичен. Cz. Я знаю, что код плохо написан, по меньшей мере, с реальными и двойными, смешанными повсюду со случайным явным и неявным convertions ... :( –

+1

Я бы предложил попробовать последнюю версию GCC и исправить исходный код до тех пор, пока он не подходит. GCC 3.2 - очень старый материал. Текущая версия 4.6, с 4,7, появляющаяся через несколько месяцев. –

ответ

2

Из документации по линии:

http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html

-finit-local-zero 
-finit-integer=n 
-finit-real=<zero|inf|-inf|nan|snan> 
-finit-logical=<true|false> 
-finit-character=n 
    The -finit-local-zero option instructs the compiler to initialize local INTEGER, 
    REAL, and COMPLEX variables to zero, LOGICAL variables to false, and CHARACTER 
    variables to a string of null bytes. Finer-grained initialization options are 
    provided by the -finit-integer=n, -finit-real=<zero|inf|-inf|nan|snan> (which 
    also initializes the real and imaginary parts of local COMPLEX variables), 
    -finit-logical=<true|false>, and -finit-character=n (where n is an ASCII 
    character value) options. These options do not initialize 

    * allocatable arrays 
    * components of derived type variables 
    * variables that appear in an EQUIVALENCE statement. 

    (These limitations may be removed in future releases). 

Q: Любая идея о том, что происходит? и что я могу сделать, чтобы вернуться к saner object/binary size?

Возможно, 200MB полон 0 или что-то еще?

A: Yup. Похоже, вы ответили на свой вопрос :)

+0

Да, все переменные явно помещаются в сегмент данных, а их значение равно 0. И Fortran 77 использовал только статические данные. –