This repository was archived by the owner on Jan 24, 2022. It is now read-only.
This repository was archived by the owner on Jan 24, 2022. It is now read-only.
LLD support (AKA LLD *almost* works out of the box) #53
Closed
Description
If you switch the linker from arm-none-eabi-ld to ld.lld you'll get the following error:
$ ld.lld --version
LLD 7.0.0 (https://github.com/llvm-mirror/lld 527f7fd20d23a54ae30ccdf5071312b24e28776b) (compatible with GNU linkers)
$ xargo build
error: linking with `ld.lld` failed: exit code: 1
|
= note: "ld.lld" (..)
= note: ld.lld: error: $PWD/target/thumbv7em-none-eabihf/debug/build/cortex-m-rt-f07298b7bbb47f59/out/link.x:92: NOLOAD expected, but got INFO
>>> .debug_gdb_scripts _stext (INFO) : {
>>> ^
But if you modify this crate link.x like this:
/* a rustc hack will force the program to read the first byte of this section,
so we'll set the (fake) start address of this section to something we're
sure can be read at runtime: the start of the .text section */
- .debug_gdb_scripts _stext (INFO) : {
+ .debug_gdb_scripts _stext (NOLOAD) : {
KEEP(*(.debug_gdb_scripts))
- }
+ } > FLASH
Programs link correctly. The resulting binaries are well formed and debug information works. 🎉
However, this results in an artifical increase of size of the text section as reported by arm-none-eabi-size
:
$ # before (linked with GNU ld)
$ arm-none-eabi-size (..)
text data bss dec hex filename
1300 0 0 1300 514 (..)
$ arm-none-eabi-size -Ax (..)
section size addr
.vector_table 0x188 0x8000000
.text 0x384 0x8000188
.rodata 0x8 0x800050c
.bss 0x0 0x20000000
.data 0x0 0x20000000
.debug_gdb_scripts 0x88 0x8000188
$ # after (linked with GNU ld)
$ arm-none-eabi-size (..)
text data bss dec hex filename
1436 0 0 1436 59c (..)
$ arm-none-eabi-size -Ax (..)
section size addr
.vector_table 0x188 0x8000000
.text 0x384 0x8000188
.rodata 0x8 0x800050c
.bss 0x0 0x20000000
.data 0x0 0x20000000
.debug_gdb_scripts 0x88 0x8000188 <- NOTE overlaps with .text
$ # after (linked with LLVM lld)
$ arm-none-eabi-size (..)
text data bss dec hex filename
1436 0 0 1436 59c (..)
$ arm-none-eabi-size -Ax (..)
section size addr
.vector_table 0x188 0x8000000
.text 0x384 0x8000188
.rodata 0x8 0x800050c
.bss 0x0 0x20000000
.data 0x0 0x20000000
.got 0x0 0x20000000
.debug_gdb_scripts 0x88 0x8000514 <- NOTE comes after .text
This is just an error in the report though. The .debug_gdb_scripts doesn't end up in FLASH even with the linker script changes.
> # GDB console after flashing the binary linked using LLD
> x/12x 0x8000514
0x8000514 <__rustc_debug_gdb_scripts_section__>: 0xffffffff 0xffffffff 0xffffffff 0xffffffff
0x8000524 <__rustc_debug_gdb_scripts_section__+16>: 0xffffffff 0xffffffff 0xffffffff 0xffffffff
0x8000534 <__rustc_debug_gdb_scripts_section__+32>: 0xffffffff 0xffffffff 0xffffffff 0xffffffff
This issue is to gauge interested in adding LLD support right now (by applying the above diff).
Alternatively we can hold off until LLD lands in rustc (hopefully sometime this year) since it's only then when we'll be able to drop the dependency on a external linker (arm-none-eabi-ld).
Metadata
Metadata
Assignees
Labels
No labels