g77 версии 3.2 создает большой объектный файл с опцией -finit-local-zero - PullRequest
0 голосов
/ 21 января 2012

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

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

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

, он создаст объектный файлразмером около 10 КБ ... но следующее:

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

создает объектный файл размером 14 МБ

Я пытался strip использовать объектный файл, но размер не изменяетсямного

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

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

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

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

РЕДАКТИРОВАТЬ: более новые версии g77 / gfortran не имеют этой проблемы (размер объектного файла остается почти неизменным с -finit-local-zero), но я не могу их использовать (делаякод дает правильные результаты с последними версиями компилятора, сам по себе является проектом) ... и мне нужен флаг -finit-local-zero (код зависает без него)

РЕДАКТИРОВАТЬ 2: Я сделал шестнадцатеричный дампи, конечно же, 99% файла состоит из нулей!

1 Ответ

2 голосов
/ 21 января 2012

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

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). 

В: Есть идеи о том, что происходит? и что я могу сделать, чтобы вернуться к Разумный объект / двоичные размеры?

Значит, вероятно, 200 МБ полон 0 или что-то еще?

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

...