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 ****
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.
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.
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 ****
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.
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
voidstack_overflow_test(void){
2
int_daten[2000];// hier erzeuge ich die Stack Overflow Warnung
3
xil_printf("TEST: Stack Overflow!!!");
4
}
5
6
intmain(){
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 */
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).
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.