LINUX.ORG.RU

Минимизация размера программы.


0

0

Приветствую.
Вообщем столкнуляся с такой проблемой :
сами исходники программы весят около 6 метров. Есть файл SIZES, в котором находятся параметры, используемые в компилляции. Если я изменяю primary параметры, от которых все остальные зависят, то программа растет неимоверно, точнее один файл из исходников. При увелечении параметров в 50 раз этот файл вырастает до 500 Mb , хотя при дефолтных значениях его размер 604 Kb !!!
Я понимаю, что
1) Есть ключт в gcc заставляющие минимзировать размер объектного файла / если не секрет, помимо -Os еще какие ?/
2) Необходимо исправить сам этот файл на предмет, почему так происходит.
Best respect,$echo.

anonymous

Запусти readelf -S на итоговый бинарник и смотри что получилось. Можешь на него натравить strip, но символы - это явно не 500 Мб. Может ты пытаешься статически компоновать со всем подряд?

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

Была идея - попробовать динамически его собрать ... только мне казалось так оно и происходит..или это только библиотек glibc ?/
ключи следующие
-O -w
линковка с -O.
Best respect,$echo.
P.s."Можешь на него натравить strip" - поподробнее можно ?

anonymous
()

сделал
readelf -S programm
There are 27 section headers, starting at offset 0x6e04460:

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 080480f4 0000f4 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048108 000108 000020 00 A 0 0 4
[ 3] .hash HASH 08048128 000128 000430 04 A 4 0 4
[ 4] .dynsym DYNSYM 08048558 000558 000870 10 A 5 1 4
[ 5] .dynstr STRTAB 08048dc8 000dc8 000467 00 A 0 0 1
[ 6] .gnu.version VERSYM 08049230 001230 00010e 02 A 4 0 2
[ 7] .gnu.version_r VERNEED 08049340 001340 000060 00 A 5 2 4
[ 8] .rel.dyn REL 080493a0 0013a0 000260 08 A 4 0 4
[ 9] .rel.plt REL 08049600 001600 0001d0 08 A 4 b 4
[10] .init PROGBITS 080497d0 0017d0 000025 00 AX 0 0 4
[11] .plt PROGBITS 080497f8 0017f8 0003b0 04 AX 0 0 4
[12] .text PROGBITS 08049bb0 001bb0 0b7c60 00 AX 0 0 16
[13] .fini PROGBITS 08101810 0b9810 00001c 00 AX 0 0 4
[14] .rodata PROGBITS 08101840 0b9840 010bb0 00 A 0 0 32
[15] .data PROGBITS 08113400 0ca400 6d36420 00 WA 0 0 32
[16] .eh_frame PROGBITS 0ee49820 6e00820 000004 00 WA 0 0 4
[17] .dynamic DYNAMIC 0ee49824 6e00824 0000d0 08 WA 5 0 4
[18] .ctors PROGBITS 0ee498f4 6e008f4 000008 00 WA 0 0 4
[19] .dtors PROGBITS 0ee498fc 6e008fc 000008 00 WA 0 0 4
[20] .got PROGBITS 0ee49904 6e00904 000228 04 WA 0 0 4
[21] .bss NOBITS 0ee49b40 6e00b40 bc4e3318 00 WA 0 0 32
[22] .comment PROGBITS 00000000 6e00b40 0027c0 00 0 0 1
[23] .note NOTE 00000000 6e03300 001090 00 0 0 1
[24] .shstrtab STRTAB 00000000 6e04390 0000cf 00 0 0 1
[25] .symtab SYMTAB 00000000 6e04898 022df0 10 26 2026 4
[26] .strtab STRTAB 00000000 6e27688 010675 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)

а дальше что ?

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

По поводу readelf - все вроде нормально. Единственное, что непонятно - откуда ты взял 100 Мб .data. И почему у тебя такой здоровый .bss - 300 Мб (который все равно не должен ничего занимать, т.к. NOBITS).

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

Ок . Просто здесь есть несколько путей
1) Изначально автор писал так, чтобы пользователь не смог изменить параметры ... в сотни раз / это более правдоподобно, ибо есть эта программа под такие задачи ... о платная ))))/
2) Надо выспаться мне наконец-то -) /тоже актуально/
P.s. а можно вопрос по ifc ?
$echo.

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

Возможно в коде объявляются многомегабайтные массивы (отсюда .bss в 300 Мб). Откуда берется .data в 100 Мб и почему для .bss выделяется место на диске все равно непонятно (по прикидкам файл с такой картой разделов должен занимать порядка 150 Мб).

Что такое ifc не знаю.

А спать полезно ... сам сегодня 4 часа спал.

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

Вообще, всё зависит от прикладухи. Но такой файл ты точно не порежешь.

С точки зрения эстетики нужно убить глобальные массивы/структуры и инициализировать соответствующие ссылки в init функциях (например, в main), хотя это на размер файла не повлияет. А получить такую .data, IMHO, возможно только на стадии компоновки с чем-нибудь ужасным (хотя можно и игрой с препроцессором такого достичь, но это клиника).

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

В голову приходит вот такое:

#define S1 1
#define S2 S1,S1,S1
#define S3 S2,S2,S2
#define S4 S3,S3,S3
#define S5 S4,S4,S4
#define S6 S5,S5,S5
#define S7 S6,S6,S6

int a[729] = {S7};

int main() {
}

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

Более детально. Выставил максимальные параметры, когда еще программак компиллируется
в итоге
%ls -s PROGRAMM
380188 PROGRAMM
%readelf -T PROGRAMMThere are 27 section headers, starting at offset 0x172b4be0:

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 080480f4 0000f4 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048108 000108 000020 00 A 0 0 4
[ 3] .hash HASH 08048128 000128 000430 04 A 4 0 4
[ 4] .dynsym DYNSYM 08048558 000558 000870 10 A 5 1 4
[ 5] .dynstr STRTAB 08048dc8 000dc8 000467 00 A 0 0 1
[ 6] .gnu.version VERSYM 08049230 001230 00010e 02 A 4 0 2
[ 7] .gnu.version_r VERNEED 08049340 001340 000060 00 A 5 2 4
[ 8] .rel.dyn REL 080493a0 0013a0 000260 08 A 4 0 4
[ 9] .rel.plt REL 08049600 001600 0001d0 08 A 4 b 4
[10] .init PROGBITS 080497d0 0017d0 000025 00 AX 0 0 4
[11] .plt PROGBITS 080497f8 0017f8 0003b0 04 AX 0 0 4
[12] .text PROGBITS 08049bb0 001bb0 0b7d60 00 AX 0 0 16
[13] .fini PROGBITS 08101910 0b9910 00001c 00 AX 0 0 4
[14] .rodata PROGBITS 08101940 0b9940 010bb0 00 A 0 0 32
[15] .data PROGBITS 08113500 0ca500 171e6aa0 00 WA 0 0 32
[16] .eh_frame PROGBITS 1f2f9fa0 172b0fa0 000004 00 WA 0 0 4
[17] .dynamic DYNAMIC 1f2f9fa4 172b0fa4 0000d0 08 WA 5 0 4
[18] .ctors PROGBITS 1f2fa074 172b1074 000008 00 WA 0 0 4
[19] .dtors PROGBITS 1f2fa07c 172b107c 000008 00 WA 0 0 4
[20] .got PROGBITS 1f2fa084 172b1084 000228 04 WA 0 0 4
[21] .bss NOBITS 1f2fa2c0 172b12c0 6e1d2c98 00 WA 0 0 32
[22] .comment PROGBITS 00000000 172b12c0 0027c0 00 0 0 1
[23] .note NOTE 00000000 172b3a80 001090 00 0 0 1
[24] .shstrtab STRTAB 00000000 172b4b10 0000cf 00 0 0 1
[25] .symtab SYMTAB 00000000 172b5018 022e00 10 26 2027 4
[26] .strtab STRTAB 00000000 172d7e18 01067d 00 0 0 1

% ls -s *.o
...
но самое любопытное вот:
% ls -s esp.o
378876 esp.o
!!!
вот он где ...
остальные файлы практически не меняются в размерах в зависимости от параметров.
Дальше в этом файле много массивов ... и коммон блоков.
но программа линукется .
на запуске выдает сегфоулт.
$echo




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

У тебя больше 2 Гб address space получился. bss - 1.8 Гб, .data - 400 Мб, плюс отступ в размере 128 Мб по умолчанию в ld. Т.е. порядка 2.5 Гб.

IMHO.

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

У тебя swap то есть для таких целей?

Btw, если у тебя куча библиотек еще в хвосте со своими данными отображена и есть глубокая рекурсия, то ты переполняешь всё, что только можно.

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

Это относится к оперативной памяти ... Я правильно понял ?
Тогда идет она лесом ... у меня всего 1 Гб DDR ))) и еще 1 Гб не скоро появиться )
Большое спасибо, за помощь.
Best respect,$echo.
P.s. ifc - Intel fortran compiller . Но меня интересовал и icc / c,c++ / .. Просто бяка какая-то в вызовом ф-ии FLASH -(

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

Про SWAP - у меня 979924K total -) мне хватает )
а задача это была из Польши ... Один расчетчик замахнулся на биомолекулы .. считать semi-empirical ... Хыть ... Вот они досчитался .
В приницпе у меня есть доступ к машине с 2 Гб рамы и свупом в 1 Гб - просто уже пора .. сейчас сторожа придут )) выгонять будут 0)
Творческих успехов, Вик.

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