Skip to content

missing symbols for no_std target #119

Closed
@laanwj

Description

@laanwj

(looks like there's some overlap with #114)

I'm trying to build rust-secp256k1 for a bare-metal RISC-V platform, I've built and installed a compatible toolchain using crosstool-ng and do

CC="${HOME}/x-tools/riscv64-unknown-elf/bin/riscv64-unknown-elf-gcc" cargo build --release

However, I get the following missing symbol errors:

   Compiling secp256k1-test v0.1.0 (/home/user/maixgo/k210-sdk-stuff/rust/secp256k1-test)
error: linking with `rust-lld` failed: exit code: 1
  |
...
  = note: rust-lld: error: undefined symbol: _impure_ptr
          >>> referenced by reent.h:814 (/home/user/x-tools/riscv64-unknown-elf/riscv64-unknown-elf/sys-include/sys/reent.h:814)
          >>>               secp256k1.o:(default_error_callback_fn) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: fprintf
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(default_error_callback_fn) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: _impure_ptr
          >>> referenced by reent.h:814 (/home/user/x-tools/riscv64-unknown-elf/riscv64-unknown-elf/sys-include/sys/reent.h:814)
          >>>               secp256k1.o:(default_illegal_callback_fn) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: fprintf
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(default_illegal_callback_fn) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: free
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: free
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: free
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_odd_multiples_table_storage_var.constprop.31) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_gen_context_build) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_gen_context_build) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_gen_context_build) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: free
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_gen_context_build) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: free
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_ecmult_gen_context_build) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: malloc
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_context_create) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: _impure_ptr
          >>> referenced by reent.h:814 (/home/user/x-tools/riscv64-unknown-elf/riscv64-unknown-elf/sys-include/sys/reent.h:814)
          >>>               secp256k1.o:(secp256k1_context_create) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: undefined symbol: fprintf
          >>> referenced by secp256k1.c
          >>>               secp256k1.o:(secp256k1_context_create) in archive /home/user/maixgo/k210-sdk-stuff/rust/target/riscv64gc-unknown-none-elf/release/deps/libsecp256k1-ad9949776962da29.rlib
          
          rust-lld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors)
          

error: aborting due to previous error

error: Could not compile `secp256k1-test`.

To learn more, run the command again with --verbose.

So I guess the malloc/free is due to context allocation/deallocation and will be solved by updating the secp256k1 tree for bitcoin-core/secp256k1#566 bitcoin-core/secp256k1#614 etc.
THe _impure_ptr is more confusing to me.

Edit: Ok, looks like _impure_ptr is related, looking at the disassembly it's always used to get to stderr, the first parameter of fprintf, usually invoked through CHECK.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions