Hallo,
evtl. bin ich ja nicht der Einzige, der versucht, mit dem
GNU-kompatiblen ARM-Assembler von Keil zu arbeiten - also der
clang-basierte Assembler, der beim Compiler V6 dabei ist.
Kurze Problembeschreibung:
Wenn ich im "alten" V5 ARM-Assembler eine Funktion wie folgt definiere:
1 | AREA |text|, CODE, READONLY
|
2 | EXPORT _foo
|
3 |
|
4 | foo PROC
|
5 | b foo
|
6 | ENDP
|
7 | END
|
dann kann ich im Keil-Debugger durch die Instruktionen in foo steppen
und bekomme den entsprechenden Quellcode angezeigt, also enthält die
Objektdatei entsprechende Informationen zu Codeoffset und
Sourcefile/Sourcezeile.
Wenn ich das PROC/ENDP weglasse, funktioniert das nicht mehr und ich
bekomme nur noch disassemblierte Instruktionen angezeigt, was das
Debuggen doch etwas nerviger macht (und das möchte ich meinen Studis
nicht antun...). Die Objectfiles unterscheiden sich auch in Größe (und
Inhalt, versteht sich), mit PROC/ENDP kommen zwei ELF-Sektionen dazu
(.debug_frame und .rel.debug_frame) und der Inhalt einiger anderer
wächst (.debug_info, .rel.debug_info, .symtab und .shstrtab).
Soweit, so gut - mit PROC in "altem" ARM-Assembler erhalte ich also die
gewünschten Informationen. Wenn ich nun den clang-basierten Assembler
verwende, gibt es kein Äquivalent zu PROC/ENDP (siehe auch [1]). Und
ohne die Verwendung von PROC/ENDP fehlen dem Keil-Debugger scheinbar die
Filename/Zeilennummer-Informationen.
Das Komische dabei ist aber, dass die ELF-Objektdateien irgendwelche
(vermutlich DWARF-)Informationen zu Offset-Filename-Zeilennummer
enthalten, sowohl mit wie auch ohne PROC/ENDP mit dem alten Assembler
und auch mit armclang:
1 | $ arm-none-eabi-objdump -dlr foo.o
|
2 |
|
3 | foo.o: file format elf32-littlearm
|
4 |
|
5 | Disassembly of section text:
|
6 |
|
7 | 00000000 <__foo>:
|
8 | __foo():
|
9 | C:\Users\mic8823m\Desktop\Keil\Keil/foo.s:6
|
10 | 0: f04f 0001 mov.w r0, #1
|
11 | C:\Users\mic8823m\Desktop\Keil\Keil/foo.s:7
|
12 | 4: f04f 0102 mov.w r1, #2
|
13 | C:\Users\mic8823m\Desktop\Keil\Keil/foo.s:8
|
14 | 8: e7fe b.n 0 <__foo>
|
15 | 8: R_ARM_THM_JUMP11 __foo
|
Die Info scheint der Keil-Debugger aber zu ignorieren und liest
"irgendwas" anderes...
Hat jemand von euch eine Idee, wie man entweder den clang-Assembler dazu
bekommt, die richtigen Debuginfos zu generieren oder den Keil-Debugger
dazu, die existierenden Debuginfos zu verwenden?
-- Michael
[1]
http://www.keil.com/support/man/docs/armclang_mig/armclang_mig_chr1398343610532.htm
PS: Keil uVision-Version ist 5.24.2.0 mit ARMClang 6.7