[gcc] Stack-Struktur bei Arrays
Verfasst: So Dez 18, 2011 1:55 am
Tag 
Nachdem ich diesen Thread gelesen habe, war mir klar was der Fehler ist, aber ich bin mit meinem falschen Ergebnis nicht ganz zufrieden ^^
Folgender Beispielcode:
Kompilieren:
Ausführen:
Die erste Zeile der Adressen steht natürlich für argv nd envp. 0x4005d5 ist anscheinend irgendeine Funktion in der libc. Der zweite Wert der zweiten Zeile ist wohl argc. Aber warum wird zuerst der Array angelegt und dann beide Integer-Variablen? Widerspricht das nicht dem üblichen Aufbau des Stacks?

Nachdem ich diesen Thread gelesen habe, war mir klar was der Fehler ist, aber ich bin mit meinem falschen Ergebnis nicht ganz zufrieden ^^
Folgender Beispielcode:
Code: Alles auswählen
#include <stdio.h>
int main( int argc, char *argv[] )
{
int x = 0x12345678;
int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
int z = 0x12345678;
printf( "%p - %p\n", &(array[0]), &(array[9]) );
return 0;
}
Code: Alles auswählen
$ gcc -o test main.c -g
Code: Alles auswählen
$ gdb -q ./test
Reading symbols from /home/daniel/proggen/test...done.
(gdb) break main
Breakpoint 1 at 0x400507: file main.c, line 5.
(gdb) run test-parameter
Starting program: /home/daniel/proggen/test test-parameter
Breakpoint 1, main (argc=2, argv=0x7fffffffe178, envp=0x7fffffffe190) at main.c:5
5 int x = 0x12345678;
(gdb) nexti
6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x0000000000400515 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x000000000040051c 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x0000000000400523 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x000000000040052a 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x0000000000400531 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x0000000000400538 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x000000000040053f 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x0000000000400546 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
0x000000000040054d 6 int array[] = { 9, 8, 5, 6, 7, 0, 1, 4, 3, 2 };
(gdb) nexti
7 int z = 0x12345678;
(gdb) nexti
8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x0000000000400560 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x0000000000400564 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x0000000000400568 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x000000000040056c 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x000000000040056f 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x0000000000400572 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x0000000000400577 8 printf( "%p - %p\n", &(array[0]), &(array[9]) );
(gdb) nexti
0x7fffffffe060 - 0x7fffffffe084
9 return 0;
(gdb) x/20x 0x7fffffffe060-24
0x7fffffffe048: 0xffffe190 0x00007fff 0xffffe178 0x00007fff
0x7fffffffe058: 0x004005d5 0x00000002 0x00000009 0x00000008
0x7fffffffe068: 0x00000005 0x00000006 0x00000007 0x00000000
0x7fffffffe078: 0x00000001 0x00000004 0x00000003 0x00000002
0x7fffffffe088: 0x12345678 0x12345678 0x00000000 0x00000000
(gdb) x/s 0x004005d5
0x4005d5 <__libc_csu_init+69>: "H\205\355t\034\061\333\017\037@"