gcc-Befehle



  • Hallo,

    was bedeutet der gcc-Parameter

    -mpreferred­-stack-boundary=2
    

    ?

    VG re342



  • Findest du die Dokumentation nicht, oder verstehst du sie nicht?



  • Gefunden habe ich sie schon.

    -mpreferred-stack-boundary=num
    Attempt to keep the stack boundary aligned to a 2 raised to num byte boundary. If -mpreferred-stack-boundary is not specified, the default is 4 (16 bytes or 128 bits).

    Warning: When generating code for the x86-64 architecture with SSE extensions disabled, -mpreferred-stack-boundary=3 can be used to keep the stack boundary aligned to 8 byte boundary. Since x86-64 ABI require 16 byte stack alignment, this is ABI incompatible and intended to be used in controlled environment where stack space is important limitation. This option leads to wrong code when functions compiled with 16 byte stack alignment (such as functions from a standard library) are called with misaligned stack. In this case, SSE instructions may lead to misaligned memory access traps. In addition, variable arguments are handled incorrectly for 16 byte aligned objects (including x87 long double and __int128), leading to wrong results. You must build all modules with -mpreferred-stack-boundary=3, including any libraries. This includes the system libraries and startup modules.

    Aber was ist der stack-boundary?



  • Die Adresse des (aktiven) Stackrahmens.



  • Also wird im Fall num=2 ein 2^2 = 4 Byte großer Puffer vor den Stack-Rahmen gesetzt?



  • Steht da etwas von Puffer?



  • Also wörtlich übersetzt steht da, dass bestrebt wird, den Stack-Rahmen an einen 2^num byte-Rahmen anzupassen. Ich hatte mir überlegt, dass dieses "anpassen" mit einem Puffer zu tun haben könnte.

    Kannst du mir erklären, was damit genau gemeint ist? Ich sollte den Befehl zum Kompilieren verwenden und würde gerne verstehen, was dahinter steckt.



  • Kann mir keiner weiterhelfen?


  • Mod

    re342 schrieb:

    Kann mir keiner weiterhelfen?

    Wir verstehen nicht, was du nicht verstehst. Hör einfach auf, dir irgendwelche Puffer auszudenken! Mit dem Schalter kann man die Ausrichtung des Stackrahmens beeinflussen, nicht mehr und nicht weniger.



  • Danke für die Antwort.

    Was meinst du denn genau mit der Ausrichtung? Ist damit die Größe der Abschnitte in Bytes gemeint?

    Sorry, wenn die Fragen für euch trivial sind und ihr deshalb nicht versteht, wo mein Verständnisproblem ist. Ich habe aber erst ganz selten mit dem Stack gearbeitet und kenne mich damit wenig aus. Und ich möchte einfach verstehen, was ich tue.

    Und der Stackrahmen? Ist das der für lokale Funktionen reservierte Bereich vom Stack?



  • Ich habe jetzt herausgefunden, dass es etwas mit "Stack Alignment" zu tun hat. Ist mit 4 Byte-Rahmen gemeint, dass dann der Stack-Rahmen aus 4 Byte-Blöcken besteht und die Daten dementsprechend ausgerichtet werden?



  • Die Start-Adresse (ST) des Stacks wird entsprechend so ausgerichtet, daß (ST mod (2^num)) == 0 ist (wobei ^ hier als Exponentialzeichen [nicht als XOR] gemeint ist). Ob davor noch evtl. (reservierter) Speicher ist, spielt keine Rolle.



  • Ok, vielen Dank!


Anmelden zum Antworten