2014-02-23 13 views
8

Kompilieren einer einfachen HelloWorld.c mit Clang/LLVM (Arm-None-Eabi-Ziel) erzeugt einen Umzug Abschnitt '. rel.ARM.exxidx aber nicht mit arm-gcc. Diese LLVM-erzeugten Abwickeltischeinträge werden korrekt als Canunwind markiert. Aber warum werden sie überhaupt produziert, weil sie nicht benötigt werden, und verursachen einfach Blähungen, wenn Sie für jede C-Funktion in Ihrem AXF einen Eintrag erhalten?LLVM (arm-none-eabi target) erstellt einen ARM.exidx-Abschnitt für C-basierten Code (?)

readelf edxidx from HelloWorld.o 
Relocation section '.rel.ARM.exidx' at offset 0x580 contains 2 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000000 00000b2a R_ARM_PREL31  00000000 .text 
00000008 00000b2a R_ARM_PREL31  00000000 .text 
Unwind table index '.ARM.exidx' at offset 0xcc contains 2 entries: 
0x0 <print_uart0>: 0x1 [cantunwind] 
0x54 <c_entry>: 0x1 [cantunwind] 

Im Test Clang Standardwerte: Wenn ich „-funwind-Tabellen“ auf Clang passieren Abwickeln zu zwingen, selbst für C-Funktionen, bekomme ich, was ich ich CPP-Funktionen geschrieben und „-fno-Abroller erwarten war -Tabellen "ergibt dasselbe wie oben.

Relocation section '.rel.ARM.exidx' at offset 0x5a4 contains 4 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000000 00000b2a R_ARM_PREL31  00000000 .text 
00000000 00001600 R_ARM_NONE  00000000 __aeabi_unwind_cpp_pr0 
00000008 00000b2a R_ARM_PREL31  00000000 .text 
00000008 00001600 R_ARM_NONE  00000000 __aeabi_unwind_cpp_pr0 
Unwind table index '.ARM.exidx' at offset 0xcc contains 2 entries: 
0x0 <print_uart0>: 0x8001b0b0 
    Compact model index: 0 
    0x01  vsp = vsp + 8 
    0xb0  finish 
    0xb0  finish 
0x54 <c_entry>: 0x809b8480 
    Compact model index: 0 
    0x9b  vsp = r11 
    0x84 0x80 pop {r11, r14} 

1) Gibt es trotzdem den .ARM.exidx Abschnitt auszuschalten, wenn nur C-Funktionen verwenden, wie sie immer als „cantunwind“ gekennzeichnet werden.

2) Wie auch immer, um diesen Abschnitt während der Verknüpfung zu entfernen? (gc-Abschnitt wird natürlich nicht funktionieren, da diese Tabelleneinträge auf Funktionen verweisen)

3) Warum erstellt arm-gcc diesen Abschnitt nicht (gut, wenn Sie neue lib, nano usw. verwenden). . aber ich benutze und verbinde keine std libs)

+0

Ich würde lieben, diesen auch zu quetschen - gepriesen! –

+0

Es ist wie Grillen hier ... –

Antwort

4

Ich antworte (2), da das ist, was ich getan habe. Fügen Sie Ihrem Linkerskript hinzu:

/DISCARD/ : 
{ 
    *(.ARM.exidx) 
} 
+0

Es wäre großartig, dies mit einer -nicht-Ausnahmen zu unterdrücken –