gccrustembeddedcross-compilingmsp430

rust msp430 linker error - .text is not within region ROM


I am working on an embedded rust project using msp430 controllers (MSP430G2553 - LaunchPad).

I have boilerplate code up and running from the msp430 quickstart repo

However, for my project, I need to run hmac, so I found a no_std compatible crate. I have tried roughly 10 other crates as well without luck.

I believe I need to specify some flags for the linker, but I do not know which I am missing. I currently have rust the following rustflag set in .cargo/config:

[target.msp430-none-elf]
rustflags = [
    "-C", "link-arg=-nostartfiles",
    "-C", "link-arg=-Tlink.x",
    "-C", "link-arg=-mmcu=msp430g2553",
    "-C", "linker=msp430-elf-gcc",
]

[build]
target = "msp430-none-elf"

However, I am stuck on the following linker error:

/root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: address 0x10464 of /home/app/mnt/target/msp430-none-elf/release/examples/blinky-5f227a68e3ed6f4d section `.text' is not within region `ROM'
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: /home/app/mnt/target/msp430-none-elf/release/examples/blinky-5f227a68e3ed6f4d section `.rodata' will not fit in region `ROM'
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: address 0x10464 of /home/app/mnt/target/msp430-none-elf/release/examples/blinky-5f227a68e3ed6f4d section `.text' is not within region `ROM'
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: section .text VMA wraps around address space
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: section .vector_table LMA [000000000000ffe0,000000000000ffff] overlaps section .text LMA [000000000000c000,0000000000010463]
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: region `ROM' overflowed by 1554 bytes
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: /home/app/mnt/target/msp430-none-elf/release/deps/libcompiler_builtins-8f16ca92d80a8df0.rlib(compiler_builtins-8f16ca92d80a8df0.compiler_builtins.crr047px-cgu.0.rcgu.o): in function `compiler_builtins::int::shift::Lshr::lshr':
          compiler_builtins.crr047px-cgu.0:(.text._ZN17compiler_builtins3int5shift4Lshr4lshr17hcb2b97289fd9786aE+0x3c): undefined reference to `__mspabi_srll'
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: compiler_builtins.crr047px-cgu.0:(.text._ZN17compiler_builtins3int5shift4Lshr4lshr17hcb2b97289fd9786aE+0x52): undefined reference to `__mspabi_slll'
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: compiler_builtins.crr047px-cgu.0:(.text._ZN17compiler_builtins3int5shift4Lshr4lshr17hcb2b97289fd9786aE+0x68): undefined reference to `__mspabi_srll'
          /root/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.2.0/../../../../msp430-elf/bin/ld: compiler_builtins.crr047px-cgu.0:(.text._ZN17compiler_builtins3int5shift4Lshr4lshr17hcb2b97289fd9786aE+0x7c): undefined reference to `__mspabi_srll'

My Cargo.toml file looks like this:

[dependencies]
msp430 = "0.2.2"
msp430-rt = "0.2.4"
panic-msp430 = "0.2.0"
hmac-sha256 = "0.1.6"

[dependencies.msp430g2553]
version = "0.2.0"
features = ["rt"]

[[bin]]
name = "prover"
test = false
bench = false

[profile.release]
opt-level = "s" # Size is more important than performance on MSP430.
codegen-units = 1 # Better size optimization.
lto = "fat" # _Much_ better size optimization.

HOW TO REPRODUCE

I have created a Dockerfile to easily reproduce the environment.

FROM ubuntu 

# Install dependencies
RUN apt update
RUN apt install wget curl git build-essential clang  -y 

# Install Rust
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"

# Install MSP430 GCC
RUN mkdir tools
RUN wget -O tools/msp430installer.run https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-full-linux-x64-installer-9.2.0.0.run
RUN chmod +x tools/msp430installer.run
RUN "" | ./tools/msp430installer.run
ENV PATH="/root/ti/msp430-gcc/bin:${PATH}"

# Install Nightly and Xargo
RUN rustup default nightly
RUN rustup component add rust-src --toolchain nightly
RUN cargo install xargo

# Clone repo and build
WORKDIR /home/app
RUN git clone https://github.com/banksdev/rawr.git
WORKDIR /home/app/rawr/msp430_prover
RUN git checkout feature/hacl-bindings
RUN cargo build -Zbuild-std=core --examples --release

The code I am trying to compile can be found here.


Solution

  • Actual Solution:

    Turns out the 512 bytes of RAM was too little to run an hmac... The hmac code ended up using up too much RAM for its computation, which resulted in an overflow making the CPU go into the weeds... We ended up buying a board with 4KB of RAM instead, which practically solved all of our issues - we upgraded to an msp430fr2355