www.mikrocontroller.net

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


Autor: Andreas N. (poolspieler)
Datum:

Bewertung
0 lesenswert
nicht 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???
**** Incremental build of configuration Debug for project Interrupttest_GPIO1 ****

make all 
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
../main.c: In function 'stack_overflow_test':
../main.c:106: warning: frame size too large for reliable stack checking
../main.c:106: warning: try reducing the number of local variables
mb-gcc: -defsym: linker input file unused because linking not done
mb-gcc: _STACK_SIZE=0x900: linker input file unused because linking not done
mb-gcc: -defsym: linker input file unused because linking not done
mb-gcc: _STACK_SIZE=0x900: linker input file unused because linking not done
 
Building target: Interrupttest_GPIO1.elf
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
Finished building: Interrupttest_GPIO1.elf

************** Validating ELF File **************

Validating ELF Section Addresses with Hardware Address Map...
elfcheck -noheader -mhs C:/Workdir/Test1.mhs -p xc3s400tq144-5 -xmpdir C:/Workdir/Test1 -pe microblaze_0 Interrupttest_GPIO1.elf
elfcheck passed!

************** Determining Size of ELF File **************

mb-size Interrupttest_GPIO1.elf
   text     data      bss      dec      hex  filename
  16042      500     3664    20206     4eee  Interrupttest_GPIO1.elf

Build complete for project Interrupttest_GPIO1

Gruß,
Andreas

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
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

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.

Autor: Andreas N. (poolspieler)
Datum:

Bewertung
0 lesenswert
nicht 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
**** Incremental build of configuration Debug for project Interrupttest_GPIO1 ****

make all 
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
../main.c: In function 'stack_overflow_test':
../main.c:106: warning: frame size too large for reliable stack checking
../main.c:106: warning: try reducing the number of local variables
 
Building target: Interrupttest_GPIO1.elf
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
Finished building: Interrupttest_GPIO1.elf

************** Validating ELF File **************

Validating ELF Section Addresses with Hardware Address Map...
elfcheck -noheader -mhs C:/Workdir/Test1.mhs -p xc3s400tq144-5 -xmpdir C:/Workdir -pe microblaze_0 Interrupttest_GPIO1.elf
elfcheck passed!

************** Determining Size of ELF File **************

mb-size Interrupttest_GPIO1.elf
   text     data      bss      dec      hex  filename
  16042      500     3664    20206     4eee  Interrupttest_GPIO1.elf

Build complete for project Interrupttest_GPIO1

Hast Du vielleicht noch eine Idee?

Danke,
Andreas

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas N. (poolspieler)
Datum:

Bewertung
0 lesenswert
nicht 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.
void stack_overflow_test(void) {
  int _daten[2000]; // hier erzeuge ich die Stack Overflow Warnung
  xil_printf("TEST: Stack Overflow!!!");
}

int main() {
  
  /* Wait for interrupts to occur */
  while(1) { 
    if(one_second_flag){
      xil_printf("Interrupt bei %d Sekunden.\n\r",count);
      if(XGpio_DiscreteRead(&gpio_eingang2, 1) == 1) {
        xil_printf("Ich erzeuge jetzt einen Stack Overflow!!!\r\n");
        stack_overflow_test();
      }
    }
  }
}
>
>> ../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)
/* Linker Script automatically rev'ed up using XPS 9.1 */
/*******************************************************************/
/*                                                                 */
/* This file is automatically generated by linker script generator.*/
/*                                                                 */
/* Version: Xilinx EDK 10.1.03 EDK_K_SP3.6                                */
/*                                                                 */
/* Copyright (c) 2004 Xilinx, Inc.  All rights reserved.           */
/*                                                                 */
/* Description : MicroBlaze Linker Script                          */
/*                                                                 */
/*******************************************************************/

_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x900;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x400;

/* Generate Stack and Heap definitions */

.heap : {
   . = ALIGN(8);
   _heap = .;
   _heap_start = .;
   . += _HEAP_SIZE;
   _heap_end = .;
} > ilmb_cntlr_dlmb_cntlr

.stack : {
   _stack_end = .;
   . += _STACK_SIZE;
   . = ALIGN(8);
   _stack = .;
   __stack = _stack;
} > ilmb_cntlr_dlmb_cntlr


Gruß,
Andreas

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.