Forum: Compiler & IDEs _STACK_SIZE für -fstack-check einstellen - aber wo?


von Andreas N. (poolspieler)


Lesenswert?

Hallo,
ich möchte die Stackgröße von dem gcc  mit -fstack-check überprüfen 
lassen.
Es handelt sich bei dem Prozessor um einen MicroBlaze (Xilinx).
Eigentlich hätte ich erwartet, dass "-fstack-check 
-fstack-limit-symbol=_STACK_SIZE -Wl,-defsym,_STACK_SIZE=0x900" 
funktionieren müsste.
Es kommt aber die Meldung "linker input file unused because linking not 
done".

fstack-check nimmt eine Größe von 0x100 an. Für diese Größe funktioniert 
auch die Überprüfung. Aber wo kann ich diese nun ändern???
1
**** Incremental build of configuration Debug for project Interrupttest_GPIO1 ****
2
3
make all 
4
mb-gcc -c -mxl-soft-mul -mxl-barrel-shift -mxl-pattern-compare -mno-xl-soft-div -mcpu=v7.10.d -I../../microblaze_0_sw_platform/microblaze_0/include -xl-mode-executable -g -O0 -fstack-check -fstack-limit-symbol=_STACK_SIZE -Wl,-defsym,_STACK_SIZE=0x900 -omain.o ../main.c
5
../main.c: In function 'stack_overflow_test':
6
../main.c:106: warning: frame size too large for reliable stack checking
7
../main.c:106: warning: try reducing the number of local variables
8
mb-gcc: -defsym: linker input file unused because linking not done
9
mb-gcc: _STACK_SIZE=0x900: linker input file unused because linking not done
10
mb-gcc: -defsym: linker input file unused because linking not done
11
mb-gcc: _STACK_SIZE=0x900: linker input file unused because linking not done
12
 
13
Building target: Interrupttest_GPIO1.elf
14
mb-gcc -o Interrupttest_GPIO1.elf main.o    -mxl-soft-mul -mxl-barrel-shift -mxl-pattern-compare -mno-xl-soft-div -mcpu=v7.10.d  -L../../microblaze_0_sw_platform/microblaze_0/lib -xl-mode-executable   -T../Interrupttest_GPIO1.ld
15
Finished building: Interrupttest_GPIO1.elf
16
17
************** Validating ELF File **************
18
19
Validating ELF Section Addresses with Hardware Address Map...
20
elfcheck -noheader -mhs C:/Workdir/Test1.mhs -p xc3s400tq144-5 -xmpdir C:/Workdir/Test1 -pe microblaze_0 Interrupttest_GPIO1.elf
21
elfcheck passed!
22
23
************** Determining Size of ELF File **************
24
25
mb-size Interrupttest_GPIO1.elf
26
   text     data      bss      dec      hex  filename
27
  16042      500     3664    20206     4eee  Interrupttest_GPIO1.elf
28
29
Build complete for project Interrupttest_GPIO1

Gruß,
Andreas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas N. wrote:

> Es kommt aber die Meldung "linker input file unused because linking not
> done".

Linkeroptionen musst du halt dort angeben, wo du auch linkst.

Eine Compiler-Kommandozeile, die ein -c enthält, compiliert eine
einzelne Quelldatei in einen Objektmodul.  Der Linker wird dabei
nicht aufgerufen.
1
mb-gcc -o Interrupttest_GPIO1.elf main.o    -mxl-soft-mul \
2
-mxl-barrel-shift -mxl-pattern-compare -mno-xl-soft-div -mcpu=v7.10.d \
3
-L../../microblaze_0_sw_platform/microblaze_0/lib -xl-mode-executable \
4
-T../Interrupttest_GPIO1.ld

Das ist der Linkeraufruf, und hier sind deine Stack-Anweisungen
nicht dabei.

Kann übrigens sein, dass die -f-Optionen bereits beim Compilieren
mit drin sein müssen (damit der entsprechende Code generiert wird),
aber die -Wl,-defsym-Option gehört erst in den Linkerlauf.

von Andreas N. (poolspieler)


Lesenswert?

Hallo Jörg,
danke für Deine Antwort.
Ich habe -fstack-check mal nur beim Linkerlauf eingefügt - dann kommen 
(auch bei zu großem Stack) KEINE Warnungen.
Wenn ich es beim compilieren und beim linken einfüge, dann kommt bereits 
nach dem compilieren die Warnung (auch wenn KEIN Stacküberlauf vorhanden 
ist)
Wo nimmt er dann beim compilieren diese Grenze her und wo/wie kann man 
sie anpassen? :-(
f
1
**** Incremental build of configuration Debug for project Interrupttest_GPIO1 ****
2
3
make all 
4
mb-gcc -c -mxl-soft-mul -mxl-barrel-shift -mxl-pattern-compare -mno-xl-soft-div -mcpu=v7.10.d -I../../microblaze_0_sw_platform/microblaze_0/include -xl-mode-executable -g -O0 -fstack-check -omain.o ../main.c
5
../main.c: In function 'stack_overflow_test':
6
../main.c:106: warning: frame size too large for reliable stack checking
7
../main.c:106: warning: try reducing the number of local variables
8
 
9
Building target: Interrupttest_GPIO1.elf
10
mb-gcc -o Interrupttest_GPIO1.elf main.o    -mxl-soft-mul -mxl-barrel-shift -mxl-pattern-compare -mno-xl-soft-div -mcpu=v7.10.d  -L../../microblaze_0_sw_platform/microblaze_0/lib -xl-mode-executable   -T../Interrupttest_GPIO1.ld -fstack-check -Wl,-defsym,_STACK_SIZE=0x900
11
Finished building: Interrupttest_GPIO1.elf
12
13
************** Validating ELF File **************
14
15
Validating ELF Section Addresses with Hardware Address Map...
16
elfcheck -noheader -mhs C:/Workdir/Test1.mhs -p xc3s400tq144-5 -xmpdir C:/Workdir -pe microblaze_0 Interrupttest_GPIO1.elf
17
elfcheck passed!
18
19
************** Determining Size of ELF File **************
20
21
mb-size Interrupttest_GPIO1.elf
22
   text     data      bss      dec      hex  filename
23
  16042      500     3664    20206     4eee  Interrupttest_GPIO1.elf
24
25
Build complete for project Interrupttest_GPIO1

Hast Du vielleicht noch eine Idee?

Danke,
Andreas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas N. wrote:

> Ich habe -fstack-check mal nur beim Linkerlauf eingefügt - dann kommen
> (auch bei zu großem Stack) KEINE Warnungen.

Ja, das hatte ich befürchtet.

> Wenn ich es beim compilieren und beim linken einfüge, dann kommt bereits
> nach dem compilieren die Warnung (auch wenn KEIN Stacküberlauf vorhanden
> ist)

Nun, die Warnung ist gut. :)  Es ist eine der beiden da oben:

> ../main.c:106: warning: frame size too large for reliable stack checking

Und die Erklärung, was du machen solltest, folgt auch gleich:

> ../main.c:106: warning: try reducing the number of local variables

Deine Stackframes sind einfach zu groß, und die Warnung sagt dir,
dass der Stacktest dann (u. U.) nicht funktionieren wird.  Die Warnung
besagt ja nicht, dass das Ergebnis nicht in den Stack passen würde.

von Andreas N. (poolspieler)


Lesenswert?

Jörg Wunsch wrote:
> Andreas N. wrote:
>
>> Ich habe -fstack-check mal nur beim Linkerlauf eingefügt - dann kommen
>> (auch bei zu großem Stack) KEINE Warnungen.
>
> Ja, das hatte ich befürchtet.
Ich auch... ;-)

>
>> Wenn ich es beim compilieren und beim linken einfüge, dann kommt bereits
>> nach dem compilieren die Warnung (auch wenn KEIN Stacküberlauf vorhanden
>> ist)
>
> Nun, die Warnung ist gut. :)  Es ist eine der beiden da oben:
Es ist die obere. Das habe ich durch verändern des belegten Stacks (in 
meiner Testfunktion) getestet.
1
void stack_overflow_test(void) {
2
  int _daten[2000]; // hier erzeuge ich die Stack Overflow Warnung
3
  xil_printf("TEST: Stack Overflow!!!");
4
}
5
6
int main() {
7
  
8
  /* Wait for interrupts to occur */
9
  while(1) { 
10
    if(one_second_flag){
11
      xil_printf("Interrupt bei %d Sekunden.\n\r",count);
12
      if(XGpio_DiscreteRead(&gpio_eingang2, 1) == 1) {
13
        xil_printf("Ich erzeuge jetzt einen Stack Overflow!!!\r\n");
14
        stack_overflow_test();
15
      }
16
    }
17
  }
18
}
>
>> ../main.c:106: warning: frame size too large for reliable stack checking
>
> Und die Erklärung, was du machen solltest, folgt auch gleich:
>
>> ../main.c:106: warning: try reducing the number of local variables
>
> Deine Stackframes sind einfach zu groß, und die Warnung sagt dir,
> dass der Stacktest dann (u. U.) nicht funktionieren wird.  Die Warnung
> besagt ja nicht, dass das Ergebnis nicht in den Stack passen würde.

Ich weiß aber, dass die Standardmäßige Stackgröße für -fstack-check bei 
0x100 steht. Im Linkerskript ist die Größe aber auf 0x900 eingestellt.
Linkerskript (Auszug davon)
1
/* Linker Script automatically rev'ed up using XPS 9.1 */
2
/*******************************************************************/
3
/*                                                                 */
4
/* This file is automatically generated by linker script generator.*/
5
/*                                                                 */
6
/* Version: Xilinx EDK 10.1.03 EDK_K_SP3.6                                */
7
/*                                                                 */
8
/* Copyright (c) 2004 Xilinx, Inc.  All rights reserved.           */
9
/*                                                                 */
10
/* Description : MicroBlaze Linker Script                          */
11
/*                                                                 */
12
/*******************************************************************/
13
14
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x900;
15
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x400;
16
17
/* Generate Stack and Heap definitions */
18
19
.heap : {
20
   . = ALIGN(8);
21
   _heap = .;
22
   _heap_start = .;
23
   . += _HEAP_SIZE;
24
   _heap_end = .;
25
} > ilmb_cntlr_dlmb_cntlr
26
27
.stack : {
28
   _stack_end = .;
29
   . += _STACK_SIZE;
30
   . = ALIGN(8);
31
   _stack = .;
32
   __stack = _stack;
33
} > ilmb_cntlr_dlmb_cntlr

Gruß,
Andreas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas N. wrote:

> Ich weiß aber, dass die Standardmäßige Stackgröße für -fstack-check bei
> 0x100 steht.

Das interessiert an dieser Stelle alles mal einfach gar nicht.  Der
Compiler ist nicht in der Lage, bei deinen riesengroßen Stackframes
noch einen verlässlichen Test auf die Stackgröße überhaupt zu
implementieren (zumindest meint er das so in der Warnung).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.