erickt / rust-zmq

Rust zeromq bindings.
Apache License 2.0
886 stars 189 forks source link

Cross-compile and static link? #333

Closed ckoehler closed 6 months ago

ckoehler commented 3 years ago

Hi there!

I am trying to build my library with zmq statically compiled in. I am currently doing that for my host arch with a vendored build, which generates a portable single binary that doesn't depend on ZMQ being installed. I'd like to do the same for other architectures, but am not getting it to work and wondering if it's even supported.

I am building in the rust:slim-buster Docker image (on my M1 mac). I do rustup target add armv7-unknown-linux-gnueabihf and apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf. Then cargo build --target armv7-unknown-linux-gnueabihf. It seems to build okay, but won't link:

error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-Wl,--eh-frame-hdr" "-L" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib" "/mnt/target/a
rmv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.0.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.1.rcgu.o" "/mnt/target/a
rmv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.10.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.11.rcgu.o" "/mnt/target
/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.12.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.13.rcgu.o" "/mnt/targ
et/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.14.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.15.rcgu.o" "/mnt/ta
rget/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.2.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.3.rcgu.o" "/mnt/ta
rget/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.4.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.5.rcgu.o" "/mnt/ta
rget/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.6.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.7.rcgu.o" "/mnt/ta
rget/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.8.rcgu.o" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.9.rcgu.o" "-o" "/m
nt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.2mttte5a1imu6nm4.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl
,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps" "-L" "/mnt/target/debug/deps" "-L" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/build/zmq-sys-5d83e58
31d3e1047/out/lib" "-L" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib" "-Wl,-Bstatic" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/l
ibzmq-45a25eb73876a460.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/libzmq_sys-000a94a6ff0565cf.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/liblog-fb4b21b51796385d.rlib" "/m
nt/target/armv7-unknown-linux-gnueabihf/debug/deps/libbitflags-c89045f5c5d67eba.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/librand-f4f95412b670a2cc.rlib" "/mnt/target/armv7-unknown-linux-
gnueabihf/debug/deps/librand_chacha-126d6795acea4bb6.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/libppv_lite86-d79a3b1c8c118e99.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/
librand_core-b0e9ef79f36d1100.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/libgetrandom-133bcaf25cf2e5ee.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/liblibc-cfecd7488bc8c189
.rlib" "/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/libcfg_if-366a758b203e885c.rlib" "-Wl,--start-group" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-l
inux-gnueabihf/lib/libstd-85737748b88fdb0c.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libpanic_unwind-5f30322e02cdba81.rlib" "/usr/l
ocal/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libminiz_oxide-66e6453c2c9f3133.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/l
ib/rustlib/armv7-unknown-linux-gnueabihf/lib/libadler-89ef23770d36ddae.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libobject-f370ec13
ab09536f.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libaddr2line-6025682b9782653b.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64
-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libgimli-4c4d80e5d0e6d364.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/li
b/librustc_demangle-12d79adf0a84df87.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libhashbrown-2be7398cd27b971e.rlib" "/usr/local/rust
up/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/librustc_std_workspace_alloc-14eb01f327f4faf1.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-
gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libunwind-0ecf14c724bd27c7.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libcfg_if-85
d17447bbfdc6e3.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/liblibc-c098ab12ade5141a.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch6
4-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/liballoc-5e9abecb59bcebc8.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/l
ib/librustc_std_workspace_core-8a8905ab7c778227.rlib" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libcore-c6377c18ec6480a5.rlib" "-Wl,--end
-group" "/usr/local/rustup/toolchains/1.52.1-aarch64-unknown-linux-gnu/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libcompiler_builtins-253133ce567fc061.rlib" "-Wl,-Bdynamic" "-lstdc++" "-lgcc_s" "-luti
l" "-lrt" "-lpthread" "-lm" "-ldl" "-lc"
  = note: /usr/bin/ld: /mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.0.rcgu.o: error adding symbols: file in wrong format
          collect2: error: ld returned 1 exit status

The file does look right:

root@0f587c979016:/mnt# file /mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.0.rcgu.o
/mnt/target/armv7-unknown-linux-gnueabihf/debug/deps/pub-4598ace65ff13a7e.pub.1nt8h6pp-cgu.0.rcgu.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), with debug_info, not stripped

Any ideas?

Thanks!

jianshu93 commented 2 years ago

is this solved? I always have static link not found error

Thanks,

Jianshu

ckoehler commented 2 years ago

No, not solved. Haven’t further pursued it.

AsimmHirani commented 1 year ago

I actually have some experience with this: In your application directory, create a file at .cargo/config.toml and put the following lines into it:

[build]
target = "armv7-unknown-linux-gnueabihf"
rustflags = ["-C", "link-args=-L/lib/arm-linux-gnueabihf"]

[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-g++"

Try recompiling and let me know if that works.

PS: Make sure you add your cross-compiler binary dir to your environment path:

Dockerfile:

ENV PATH="${PATH}:${ARM_TC_PATH}/bin"
ckoehler commented 6 months ago

I've actually solved this with cargo zigbuild. It's magic!