• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Riesiges Binary File

L

lsk

Guest
Themenstarter #1
Hallo zusammen.
Ich habe gerade ein kleines Prog von einem Arbeitskollegen übersetzt.
Als ich mir das fertige Exe-File angesehen hab, sind mir beinahe die Augen rausgefallen.
Das Prog hat ~1000 Zeilen Code, aber das Exe-File hat ~430 MB!!!!!
Als ich ein wenig mit den globalen Daten rumgespielt hab ist mir aufgefallen,
das der Compiler die Größe aller globalen Strukturvariablen in das Exe-File geschrieben hat.

Jetzt hab ich einen 10 Zeiler geschrieben, der nach der Übersetzung als Exe-File eine Größe von ~140 MB hat.

PHP:
struct Test
{
   float t1[100];
   float t2[200];
   float t3[300];
};

Test test[60000];

int main(void){}
Das gleiche Programm hab ich auch unter Window mit Borland Builder als Konsolenanwendung übersetzt.
Dateigröße: 7 KB

Weiß jemand einen Grund für das Vorgehen des Compilers?
Hier noch die Systemdaten:
FreeBSD 4.9-STABLE #9
gcc version 2.95.4

Falls jemand eine Antwort weiß und sie hier postet -> Vielen Dank
 
#2
Unter 5.1-CURRENT mit gcc 3.3.3 ist das erzeugte Executable nur 4425 bytes gross. Welche Compiler-Optionen benutzt Du denn?

Eine Erklärung für das Verhalten wäre, dass der Compiler das Array 'test' im .data-Segment statt im .bss-Segment anlegt, denn die Grösse passt ja: 4 Bytes (float) * 600 (in 'Test') * 60000 (in 'test') ist ungefähr 140 MB.

Der gcc 3.3.3 legt 'test' definitiv im .bss an:
Code:
$ objdump -t  a.out 
...
08049660 g     O .bss   08954400 test
Was gibt denn der 'objdump -t' unter 4.x aus?
 
L

lsk

Guest
Themenstarter #3
Vielen Dank für die schnelle Antwort.

Hier ist die Ausgabe von objdump:

mytest.o: file format elf32-i386

SYMBOL TABLE:
00000000 l df *ABS* 00000000 mytest.cpp
00000000 l d .text 00000000
00000000 l d .data 00000000
00000000 l d .bss 00000000
00000000 l .text 00000000 gcc2_compiled.
00000000 l d .note 00000000
00000000 l d .comment 00000000
00000000 g F .text 00000007 main
00000000 g O .data 08954400 test

Leider sagt mir das nicht viel.
Kannst du mir kurz erklären was du daraus erkennst?

Edit1:
Hier die Compiler Optionen: -O -DLINUX -Wall
 
Zuletzt bearbeitet von einem Moderator:
L

lsk

Guest
Themenstarter #5
Fazit:
Wechsel auf einen neueren Compiler?
Das ist ja kein Zustand.
Mal davon abgesehen das man eigentlich keine 400 MB globale Daten in seinem Prog hab sollte :-)
 
#6
1. Würde ich mal forschen, ob der gute alte 2.95 nicht irgendeine Option hat, um globale Daten ins .bss zu legen

2. Kannst Du einen neueren gcc aus den Ports benutzen

3. Kannst Du das Programm umschreiben, das es z.B. calloc benutzt:
Code:
struct Test *test;

int main(void) {
    test = (struct Test *) calloc(sizeof(struct Test), 60000);
    if(test == NULL) {
         bailout("Cannot allocate test");
    }
}
4. Kannst Du das Problem einfach ignorieren, wenn Du genug Plattenplatz hast.