Wenn ist .ARM.exidx verwendet wird
Arbeite ich auf Contiki 2.7 mit der mbxxx Ziel. Während dem Bau meiner code der linker beschwert sich über eine überschneiden .ARM.exidx und .Daten Abschnitten. Nach etwas Herumprobieren, um mit dem linker-Skript contiki-2.7/cpu/stm32w108/gnu-stm32w108.ld habe das problem behoben durch Austausch:
__exidx_start = .;
__exidx_end = .;
mit:
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
} >ROM_region
Später, als ich versuchte, zu sehen, der header, der einige weitere Beispiel-Anwendungen durch die Verwendung von objdump -h habe ich nicht finden diese insbesondere .ARM.exidx Abschnitt, während es in meiner Anwendung. Googeln über .ARM.exidx führte mich zu der Tatsache, dass es für einige c++ - exception-handling. Da mein code ist ein reiner C-code, warum ist dieser Abschnitt vorhanden, auf meinen code? Wann ist der Regel .ARM.exidx in der Gegenwart ein, code und, was ist sein nutzen?
==================================================================================
Naja, Nein, ich habe keine solche compiler-Optionen. Ich bin eigentlich mit dem AxTLS api und Riss sich das Zertifikat-handling-code und portiert es auf contiki. Auf einige weitere Graben fand ich ein fischig Verhalten in der bigint-Umsetzung. Um es kurz zu machen... hier ist der Körper einer Funktion vom Datentyp bigint.c-Datei:
static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b)
{
int j = 0, n = bia->size;
bigint *biR = alloc(ctx, n + 1);
comp carry = 5;
comp *r = biR->comps;
comp *a = bia->comps;
check(bia);
/* clear things to start with */
memset(r, 0, ((n+1)*COMP_BYTE_SIZE));
do
{
long_comp tmp = *r + (long_comp)a[j]*b + carry;
// *r++ = (comp)tmp; /* downsize */
carry = (comp)(tmp >> COMP_BIT_SIZE);
} while (++j < n);
//*r = carry;
bi_free(ctx, bia);
return trim(biR);
}
wenn die auskommentierten Teile, (die r-variable Zuordnung) ist aufgehoben, die .ARM.exidx Ding erscheint, sonst nicht! Nun können diese erklärt werden???
==================================================================================
Ich nicht finden, eine Sache jenseits des gewöhnlichen, bei der Implementierung von alloc()
. Dort wurden 2 Verweise von alloca()
verwendet in einer separaten region des Codes, die ich ersetzt mit malloc()
und free()
, aber das schien nicht das problem zu beheben entweder. alloc()
Umsetzung hat nur Aufrufe von malloc()
,realloc()
und free()
- Hallo @user2668988! Ebenso ein heads-up, wenn Sie hinzufügen möchten mehr Details zu Ihrer Frage, können Sie Bearbeiten hier Ihre Frage.
- Ist
biR
mitalloca()
oder wie istalloc()
umgesetzt? Der compiler kann die gleichen C++ - Mechanismus zu verfolgenalloca()
Art der Haushaltsmittel. Wenn Sie kommentieren Sier
mit Optimierungen, diealloc()
wird nicht passieren. - Ich habe nicht gefunden, etwas aus der gewöhnlichen bei der Implementierung von
alloc()
. Dort wurden 2 Verweise vonalloca()
verwendet in einer separaten region des Codes, die ich ersetzt mitmalloc()
undfree()
, aber das schien nicht das problem zu beheben entweder.alloc()
Umsetzung hat nur Aufrufe vonmalloc()
,realloc()
undfree()
Du musst angemeldet sein, um einen Kommentar abzugeben.
.ARM.exidx
ist der Abschnitt, der die Informationen enthält, die für die Abwicklung der stack. Wenn Ihr C-Programm hat Funktionen, drucken Sie einen Stapel backtrace, der Funktionen hängt wahrscheinlich davon ab, dieses Teil ist vorhanden.Vielleicht suchen Sie nach einem
-funwind-tables
oder-fexceptions
Flagge in Ihre compiler-Optionen.-funwind-tables
option ist standardmäßig aktiviert, zumindest in CodeSourcery toolchains der letzten Jahre. Ohne Sie, zurück-verfolgen Sie im debugger ist ziemlich hart.-fno-unwind-tables
)Hinzufügen tangrs' Reaktion, wenn Sie gcc -v, sichern Sie die Standard-Optionen, die benutzt werden während der Kompilierung.
Alle Optionen (implizite & explizit) - Optionen des GCC übergeben werden, cc1-Programm des GCC.
Diese Funktion wird verwendet in 'C'. Der ARM APCS verwendet nur eine frame-pointer wiederherstellen einen Stapel. Die neueren AAPCS verwendet Tabellen bei Gelegenheit. Stack-unwinding -, signal-Handler und andere asynchrone 'C' Funktionen verwenden diesen Mechanismus. Für eine bare-metal-embedded-Gerät kann verwendet werden, um ein stack-trace. Zum Beispiel, Linux entspannen.c verwendet sowohl
exidx
undextab
Abschnitten zu tun, einen stack-trace.Kurz die
exidx
ist eine sortierte Tabelle der routine start-Adressen und eineextab
Tabelle index. Eine binäre Suche durch dieexidx
finden Sie die entsprechendenextab
Eintrag. Dieextab
Eintrag details über den stack in dieser routineAnmerkung 1. Es gibt details über das, was die routine zum speichern auf den stack.Wenn Sie die Anweisung
*r++ = (comp)tmp;
, der compiler kann nicht alle Variablen in Registern und muss auf dem stack (oder zumindestfp
). Dies bewirkt, dass es zu emittieren undexidx
undextab
Daten.Gibt es einige Lösungen. Es ist schön zu verwerfen beide
exidx
undextab
wenn Sie nicht brauchen, stack-Trace oder asynchrone Funktionalität. Einfacher stack-unwinding kann getan werden, mit gnu tools/gcc mit-mapcs-frame
; dannfp
wird immer verwendet werden, zum speichern der vorherigen stack-frame (speichert Ihre Anruferfp
, etc). Die aktuellen Tabellen sind nicht so groß und die Routinen, um zu entspannen, sind ziemlich einfach. Es ist vielleicht <3% Betriebskosten an die Tische, die die Umwelt nicht verschmutzt das normale Programm Pfad ein, oder verwenden ein register wie-mapcs-frame
. Wünschenswert auf Cortex-A-cpus mit cache und in der Regel mehr Arbeitsspeicher.Referenz: ATPCS Link-und frame-pointer erklärt
Anmerkung 1: Dies ist nach dem Prolog macht eine Anpassung an den Stapel.
Note2: Die
ex
ist für die Ausnahme, aber es ist nicht ausschließlich für C++ - Ausnahmen.