2009-04-13 13 views
1

Ich habe den folgenden C-Code:Wie gcc Assembler Warnung "loswerden falsche Abschnitt Attribute für .init" in C-Code loswerden?

struct myStruct_t 
{ 
    const char  m_name[60]; 
    const uint32_t m_data; 
}; 

const struct myStruct_t myStruct 
    __attribute__((__aligned__(64), section(".init"))) = 
    { 
     "myName", 
     (uint32_t)&someOtherStruct 
    }; 

Als ich in gcc 4.1.1 (für PS3) kompilieren, erhalte ich die Warnung:

1>c:/t/ccy6.s: Assembler messages: 
1>c:/t/ccy6.s(106): Warning: setting incorrect section attributes for .init 

die Code-Anordnung an die Warnpunkte ist die „.section“ Klausel unter:

  .section    .init,"aw",@progbits 
      .align 6 
      .type     myStruct , @object 
      .size     myStruct , 64 
myStruct : 
      .ascii    "myName" 
      .long     someOtherStruct 

Es mag nicht das ‚w‘ (beschreibbar) Teil der Flags seit Sachen in .init schreibgeschützt ist, und ‚const‘ in allen möglichen Orten doesn nicht zwingen der Compiler das "w" nicht auszuspucken. Wie kann ich dem Compiler sagen "nein, wirklich, es ist const, ich mache keine Witze"?

+0

Welche Version von GCC verwenden Sie? Dies gibt mir keine Warnungen mit gcc-3.4.5 –

+0

4.1.1 (für PS3) .. aktualisierten OP, um das zu reflektieren. Guter Anruf, danke. –

Antwort

0

Wilde Vermutung, aber vielleicht ist das Attribut, das es falsch setzt, das "aw", das mir "schreibbar" vorschlägt. Tut es das noch, wenn alles in Ihrer Struktur const ist?

Edit: Zufälliges Googeln scheint darauf hinzudeuten, dass "w" auch für "schwach" stehen könnte?

+0

Ich änderte OP, um const überall zu setzen, und ich bekomme das gleiche Ergebnis. Ja, es mag die "w" ritable Flag nicht, da .init schreibgeschützt ist. Warum spuckt gcc überhaupt "w" aus und wie kann ich es verhindern? ("a" bedeutet zuweisbar, was hier in Ordnung ist) –

+0

Hmm, ich hatte "schwach" nicht gesehen, aber hier ist "schreibbar" (unter dem ELF-Abschnitt): http://sourceware.org/binutils/docs/as /Section.html –

0

Auf einem GNU/Linux-PC mit GCC 4.3.3 ist .init nicht beschreibbar. Ich habe in der Dokumentation nicht gefunden, wie die Abschnittsattribute manuell festgelegt werden.

Vielleicht wird es nicht viel helfen, aber hier sind ein paar Vorschläge:

  • Wenn das, was Sie wollen, ist einige Code vor main() auszuführen, können Sie ein C++ Objekt verwenden. Sein Konstruktor wird vor main() aufgerufen, und sein Destruktor danach.
  • Sie könnten ein kleines Werkzeug schreiben, das die Objektdatei manuell patcht. Ich bin mir ziemlich sicher, dass das bereits existiert. Vielleicht hier: http://www.eresi-project.org/.
  • Sie könnten die GCC-Entwickler kontaktieren. Vielleicht ist es ein Fehler.
+0

Danke für die Antwort. C++ ist leider keine Option, und ich möchte eigentlich nicht .init beschreibbar sein. Ich versuche nur alle Warnungen aus dem Code zu entfernen. Diese Struktur ist in Ordnung, wenn sie schreibgeschützt ist, aber ja, es sieht wie ein gcc-Fehler aus, der ein "w" für Daten mit const überall ausspuckt. –

0

Um Gottes willen, Mann, versuchen Sie nicht, gcc als Assembler zu verwenden! Ich sehe keinen Grund, warum dieses Ding im .init Abschnitt sein sollte (es ist kein Code), aber wenn Sie es dort haben müssen, schreiben Sie den Assembly-Code, den Sie wollen (Sie haben dort einen guten Anfang; einfach bearbeiten), Stellen Sie es an geeigneter Stelle für jede Plattform unter Quellcodeverwaltung ein und machen Sie damit fertig!

3

ist ein Problem, mit GCC Auto-Festlegung der Parameter für die .section Richtlinie. Glücklicherweise wird der Parameter für den Abschnittsnamen direkt in die Assembly-Ausgabe kopiert, sodass Sie dieses Problem umgehen können.

Diese Richtlinie:

__attribute__ ((section(".init"))) 

Erzeugt diese Versammlung:

.section .init,"aw",@progbits 

die Warnung zu entfernen, können Sie das Attribut wie folgt angeben:

__attribute__ ((section(".init,\"ar\",@progbits ;"))) 

Welche generieren:

.section .init,"ar",@progbits ;"aw",@progbits 

Das Semikolon markiert den Rest der Zeile als Kommentar, so dass der Assembler es ignoriert.

Verwandte Themen