[llvm-dev] workaround to force LLD to make dwarf info sections mappable/loadable?
Andrew Kelley via llvm-dev
llvm-dev at lists.llvm.org
Tue Dec 4 09:00:01 PST 2018
On 12/3/18 5:30 PM, Andrew Kelley via llvm-dev wrote:
> One more thing - this project as it currently exists is a proof of
> concept of how a bare bones embedded system executable running on bare
> metal can still have the same advanced debugging capabilities as when
> using, e.g. Linux. If the debug info can be directly mapped, and thus
> eliminate a dependency on a file system or on a special bootloader, it's
> a great demo.
Here's a working proof of concept.
Source:
https://github.com/andrewrk/clashos/tree/bf8e57ac220715d0698ab910d337ea590c4b4e33
Screenshot: https://i.imgur.com/8C1tYys.png
Copy pasted text output:
[nix-shell:~/dev/clashos]$ zig build qemu
ClashOS 0.0
!KERNEL PANIC!
integer overflow
/home/andy/dev/clashos/src/serial.zig:99:7: 0x1b10 in ??? (clashos)
x += 1;
^
/home/andy/dev/clashos/src/main.zig:58:16: 0x1110 in ??? (clashos)
serial.boom();
^
/home/andy/dev/clashos/src/main.zig:67:18: 0xecc in ??? (clashos)
some_function();
^
???:?:?: 0x1c in ??? (???)
linker script snippet:
.rodata : ALIGN(4K) {
*(.rodata)
__debug_info_start = .;
KEEP(*(.debug_info))
__debug_info_end = .;
__debug_abbrev_start = .;
KEEP(*(.debug_abbrev))
__debug_abbrev_end = .;
__debug_str_start = .;
KEEP(*(.debug_str))
__debug_str_end = .;
__debug_line_start = .;
KEEP(*(.debug_line))
__debug_line_end = .;
__debug_ranges_start = .;
KEEP(*(.debug_ranges))
__debug_ranges_end = .;
}
LLD patch (submitted upstream at https://reviews.llvm.org/D55276):
--- a/deps/lld/ELF/OutputSections.cpp
+++ b/deps/lld/ELF/OutputSections.cpp
@@ -95,7 +95,7 @@ void OutputSection::addSection(InputSection *IS) {
Flags = IS->Flags;
} else {
// Otherwise, check if new type or flags are compatible with
existing ones.
- unsigned Mask = SHF_ALLOC | SHF_TLS | SHF_LINK_ORDER;
+ unsigned Mask = SHF_TLS | SHF_LINK_ORDER;
if ((Flags & Mask) != (IS->Flags & Mask))
error("incompatible section flags for " + Name + "\n>>> " +
toString(IS) +
": 0x" + utohexstr(IS->Flags) + "\n>>> output section " +
Name +
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181204/e0b28b48/attachment.sig>
More information about the llvm-dev
mailing list