mikrocontroller.net

Forum: Compiler & IDEs gcc für cortex-m0 schreibt daten vor die Vektortabelle


Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir einen gcc mit crosstools-ng gebaut der prinzipiell auch 
läuft. Allerdings schreibt er, wenn man sich das Ergebnis als Binärdaten 
ansieht, immer 35 Bytes mit denen ich nichts anfangen kann, an den 
Anfang. Was danach kommt sieht wie die normale Vektortabelle aus, mit 
der eigentlich alles starten sollte. Mit dem "offiziellen" gcc von arm 
selber funktioniert alles. Ich wüsste jetzt trotzdem gerne was da hakt. 
Das Linkercommandfile habe ich von Atmel genommen.
Im ungewünschten Vorspann taucht im Kauderwelsch auch die ASCII 
Zeichenkette "GNU" auf, falls das jemandem was sagt.

Hat jemand eine Idee wie man diesen Vorspann wegbekommt?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häng mal den Assembler Zwischenschritt (GCC mit -s aufrufen) und das 
Linker Skript an.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
natürlich -S
nicht -s

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan A. schrieb:
> das Ergebnis

Welches? In welchem Format? Genau wie erzeugt? Wie sieht dieser Header 
aus?

Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Ganze disassembliert:

arm compiler:
Disassembly of section .text:

00000000 <exception_table>:
   0:  00 04 00 20 e1 00 00 00 a9 01 00 00 a9 01 00 00     ... ............
  ...

eigener compiler:
Disassembly of section .text:

00000024 <exception_table>:
  24:  00 04 00 20 01 01 00 00 c9 01 00 00 c9 01 00 00     ... ............
  ...

Die Option -S zeigt folgenden Anfang:
  .cpu cortex-m0plus
  .eabi_attribute 20, 1
  .eabi_attribute 21, 1
  .eabi_attribute 23, 3
  .eabi_attribute 24, 1
  .eabi_attribute 25, 1
  .eabi_attribute 26, 1
  .eabi_attribute 30, 6
  .eabi_attribute 34, 0
  .eabi_attribute 18, 4
  .file  "main.c"
  .text
.Ltext0:
  .cfi_sections  .debug_frame
  .global  exception_table
  .section  .vectors,"a",%progbits
  .align  2
  .type  exception_table, %object
  .size  exception_table, 140
exception_table:
  .word  _estack
  .word  Reset_Handler
  .word  NMI_Handler
  .word  HardFault_Handler
  .word  0
  .word  0
Mit dem eigenen Compiler kommt hier der gleiche Anfang mit Ausnahme der 
ersten Zeile ".cpu arm7tdmi".

: Bearbeitet durch User
Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Vollständigkeit halber mein gcc Aufruf:
arm-cortex_m0plus-eabi-gcc -S -nostdlib -mno-pic-data-is-text-relative -marm -mfpu=vfp -mlittle-endian -mthumb -D__SAMD10D13AS__ -ffunction-sections -fdata-sections -Iinclude -D__SAMD10D13AS__ -Wl,"-Tsamd10d13as_flash.ld" -Wall -O0 main.c -Wl,--gc-sections

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan A. schrieb:

> eigener compiler:
>
Disassembly of section .text:
> 
> 00000024 <exception_table>:
>   24:  00 04 00 20 01 01 00 00 c9 01 00 00 c9 01 00 00     ... 
> ............
>   ...
> 

Und wo ist hier dein „Kauderwelsch“ oder gar das „GNU“ (47 4E 55)?

Kannst du mal ein komplettes Minimalprojekt („Hello world“) zimmern
und sowohl Sourcecode als auch erzeugtes ELF-File hier hinlegen?

ps: Natürlich bitte mit dem benutzten Makefile.

: Bearbeitet durch Moderator
Autor: Stefan Arnold (king-crash)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Projektordner. Header und alles sind drin.
man beachte die "tastatur.bin" und "tastatur-kaputt.bin" Dateien. Welche 
aus den elfs der zwei Compiler mittels objcopy generiert wurden.

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan A. schrieb:
> 00000000 <exception_table>:
> 00000024 <exception_table>:

Offensichtlich sind da noch andere Daten in ".vectors". Was sagt die 
Map-Datei dazu? (-Wl,-Map=output.map)

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan A. schrieb:
> Hier der Projektordner.

Das ist aber dein Compiler nicht drin.  ;-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das neu gebaute ELF-File sieht aber völlig OK aus.  Hier das
Disassembly:

tastatur.elf:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_sfixed>:
   0:   20000400        .word   0x20000400
   4:   0000008d        .word   0x0000008d
   8:   00000155        .word   0x00000155
   c:   00000155        .word   0x00000155
        ...
  2c:   00000155        .word   0x00000155
        ...
  38:   00000155        .word   0x00000155
  3c:   00000155        .word   0x00000155
  40:   00000155        .word   0x00000155
  44:   00000155        .word   0x00000155
  48:   00000155        .word   0x00000155
  4c:   00000155        .word   0x00000155
  50:   00000155        .word   0x00000155
  54:   00000155        .word   0x00000155
  58:   00000155        .word   0x00000155
  5c:   00000000        .word   0x00000000
  60:   00000155        .word   0x00000155
  64:   00000155        .word   0x00000155
  68:   00000155        .word   0x00000155
  6c:   00000155        .word   0x00000155
  70:   00000155        .word   0x00000155
  74:   00000155        .word   0x00000155
  78:   00000155        .word   0x00000155
  7c:   00000155        .word   0x00000155
  80:   00000155        .word   0x00000155
  84:   00000155        .word   0x00000155
  88:   00000155        .word   0x00000155

0000008c <Reset_Handler>:
  8c:   b580            push    {r7, lr}
  8e:   b082            sub     sp, #8
  90:   af00            add     r7, sp, #0
  92:   4b26            ldr     r3, [pc, #152]  ; (12c <Reset_Handler+0xa0>)
  94:   607b            str     r3, [r7, #4]
  96:   4b26            ldr     r3, [pc, #152]  ; (130 <Reset_Handler+0xa4>)
...

Der ausgenullte Vektor ist die 7 für den USB-Handler, den dein Device
nicht hat.  Die anderen Vektoren zeigen ordnungsgemäß auf den
DummyHandler.

Der Fehler muss also irgendwo beim Erzeugen deines Binfiles liegen.
Wofür brauchst du das eigentlich überhaupt?  Die meisten Tools
nehmen doch heutzutage lieber das ELF-File direkt.

Autor: Stefan Arnold (king-crash)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich flashe das elf file mit openocd.
Hier die beiden elf Dateien.

@Jörg Wie hast du das Listing bekommen?

: Bearbeitet durch User
Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich komme der sache näher.
Mit dem objdump (habs selber rausgefunden, danke Jörg) kommt:
Disassembly of section .note.gnu.build-id:

00000000 <.note.gnu.build-id>:
   0:  00000004   andeq  r0, r0, r4
   4:  00000014   andeq  r0, r0, r4, lsl r0
   8:  00000003   andeq  r0, r0, r3
   c:  00554e47   subseq  r4, r5, r7, asr #28
  10:  4b6f45a1   blmi  1bd169c <STACK_SIZE+0x1bd129c>
  14:  5a7c6303   bpl  1f18c28 <STACK_SIZE+0x1f18828>
  18:  e4ab12ae   strt  r1, [fp], #686  ; 0x2ae
  1c:  f8672db8       ; <UNDEFINED> instruction: 0xf8672db8
  20:  1ba58415   blne  fe96107c <_end+0xde960c7c>

Es scheint also noch eine Linkersection ".note.gnu.build-id" zu geben.

Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK das Problem scheint eine Build ID zu sein und die Option 
"-Wl,--build-id=none" löst es.

Besten Dank an alle Beteiligten.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem verwunderlich, dass er das an den Anfang des ELF-Files
setzt.

Mein Linker macht sowas allerdings nicht, vermutlich älter als deiner.
Daher kann ich es hier nicht nachvollziehen.

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan A. schrieb:
> Es scheint also noch eine Linkersection ".note.gnu.build-id" zu geben.

Da fehlt die Zeile "/DISCARD/ : { *(.note.gnu.build-id) }" in der 
.ld-Datei.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht sollte man ja note.* gleich wegwerfen?

Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Discard Section in der Linkerdatei gibt es allerdings ein 
warning.
warning: .note.gnu.build-id section discarded, --build-id ignored.
Ich werde mal in der Toolchain schauen ob es da eine Option gibt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.