emk / rust-musl-builder

Docker images for compiling static Rust binaries using musl-libc and musl-gcc, with static versions of useful C libraries. Supports openssl and diesel crates.
Apache License 2.0
1.54k stars 193 forks source link

`diesel` link order issues sometimes break build #69

Open chrisabruce opened 5 years ago

chrisabruce commented 5 years ago

Trying to build with the using-diesel example fails. Here is snippet of error:

error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-Wl,--eh-frame-hdr" "-m64" "-nostdlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/crt1.o" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/crti.o" "-L" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.0.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.1.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.10.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.11.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.12.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.13.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.14.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.15.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.2.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.3.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.4.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.5.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.6.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.7.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.8.rcgu.o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.using_diesel.dqcexic7-cgu.9.rcgu.o" "-o" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/using_diesel-94aa5cadffcea30e.3n7t9phqceru8m8i.rcgu.o" "-Wl,--gc-sections" "-no-pie" "-Wl,-zrelro" "-Wl,-znow" "-Wl,-O1" "-nodefaultlibs" "-L" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps" "-L" "/home/rust/src/target/release/deps" "-L" "/home/rust/src/target/x86_64-unknown-linux-musl/release/build/libsqlite3-sys-ac3cf7454f406832/out" "-L" "/usr/local/musl/lib" "-L" "/usr/local/musl/lib/" "-L" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib" "-Wl,-Bstatic" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libopenssl-0de50740ee181784.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libopenssl_sys-89c6410693b927d6.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/liblibc-6265db6daf6f0d94.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/liblazy_static-5cac84b776fcd98b.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libforeign_types-23f459ebafab2c61.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libforeign_types_shared-1eba4aeaa81c6d19.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libdiesel-c89a5a6bebad19a9.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/liblibsqlite3_sys-818909750b3afa36.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libpq_sys-dc85b10baeb00fc3.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libbyteorder-9272cb6794a9382c.rlib" "/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libbitflags-b8224b03590c6c21.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/libstd-af9362ed5d81a840.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/libpanic_unwind-4d55a38564aae54a.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/libbacktrace_sys-f8521075e248b627.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/libunwind-7c91ffdc8da860d3.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/librustc_demangle-0ad27b9879d551d3.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/liblibc-588f18eae3ea58be.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/liballoc-4ebf5caee903d98f.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/librustc_std_workspace_core-8895b32baedb08c6.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/libcore-6a9d233d01acc350.rlib" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/libcompiler_builtins-851bb3b5f6c4db49.rlib" "-Wl,-Bdynamic" "-lpq" "-static" "/home/rust/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/lib/crtn.o"
  = note: /usr/local/musl/lib/libpq.a(fe-connect.o): In function `connectFailureMessage':
          fe-connect.c:(.text+0xa12): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `internal_cancel':
          fe-connect.c:(.text+0xca9): undefined reference to `htonl'
          fe-connect.c:(.text+0xcb7): undefined reference to `htonl'
          fe-connect.c:(.text+0xcc4): undefined reference to `htonl'
          fe-connect.c:(.text+0xcd1): undefined reference to `htonl'
          fe-connect.c:(.text+0xd6e): undefined reference to `strlcpy'
          fe-connect.c:(.text+0xd9e): undefined reference to `strncat'
          fe-connect.c:(.text+0xdde): undefined reference to `strlcpy'
          fe-connect.c:(.text+0xdfa): undefined reference to `strlcpy'
          fe-connect.c:(.text+0xe26): undefined reference to `strncat'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `PQcancel':
          fe-connect.c:(.text+0x1462): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `PQrequestCancel':
          fe-connect.c:(.text+0x14f0): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `PQsetClientEncoding':
          fe-connect.c:(.text+0x1a71): undefined reference to `sprintf'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `pqGetHomeDirectory':
          fe-connect.c:(.text+0x1c81): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `parseServiceInfo':
          fe-connect.c:(.text+0x1d1e): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `getPgPassFilename':
          fe-connect.c:(.text+0x2c11): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `PasswordFromFile':
          fe-connect.c:(.text+0x2d1c): undefined reference to `feof'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `PQconnectPoll':
          fe-connect.c:(.text+0x3969): undefined reference to `htonl'
          /usr/local/musl/lib/libpq.a(fe-connect.o): In function `defaultNoticeProcessor':
          fe-connect.c:(.text+0xee): undefined reference to `fputs'
          /usr/local/musl/lib/libpq.a(fe-exec.o): In function `pqInternalNotice':
          fe-exec.c:(.text+0x1256): undefined reference to `sprintf'
          /usr/local/musl/lib/libpq.a(fe-exec.o): In function `pqSaveParameterStatus':
          fe-exec.c:(.text+0x1964): undefined reference to `sscanf'
          /usr/local/musl/lib/libpq.a(fe-exec.o): In function `PQoidStatus':
          fe-exec.c:(.text+0x3a11): undefined reference to `strspn'
          /usr/local/musl/lib/libpq.a(fe-misc.o): In function `pqGetnchar':
          fe-misc.c:(.text+0x3ac): undefined reference to `fputc'
          fe-misc.c:(.text+0x3c6): undefined reference to `fputc'
          /usr/local/musl/lib/libpq.a(fe-misc.o): In function `pqSkipnchar':
          fe-misc.c:(.text+0x454): undefined reference to `fputc'
          fe-misc.c:(.text+0x46f): undefined reference to `fputc'
          /usr/local/musl/lib/libpq.a(fe-misc.o): In function `pqGetInt':
          fe-misc.c:(.text+0x4ec): undefined reference to `ntohl'
          fe-misc.c:(.text+0x58a): undefined reference to `ntohs'
          /usr/local/musl/lib/libpq.a(fe-misc.o): In function `pqPutnchar':
          fe-misc.c:(.text+0x7dc): undefined reference to `fputc'
          fe-misc.c:(.text+0x7f6): undefined reference to `fputc'
          /usr/local/musl/lib/libpq.a(fe-misc.o): In function `pqPutInt':
          fe-misc.c:(.text+0x881): undefined reference to `htonl'
          /usr/local/musl/lib/libpq.a(fe-misc.o): In function `pqPutMsgEnd':
          fe-misc.c:(.text+0xf9d): undefined reference to `htonl'
          /usr/local/musl/lib/libpq.a(fe-protocol2.o): In function `pqSetenvPoll':
          fe-protocol2.c:(.text+0xa59): undefined reference to `sprintf'
          fe-protocol2.c:(.text+0xb90): undefined reference to `sprintf'
          fe-protocol2.c:(.text+0xbb0): undefined reference to `sprintf'
          /usr/local/musl/lib/libpq.a(fe-protocol2.o): In function `pqParseInput2':
          fe-protocol2.c:(.text+0xde8): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-protocol2.o): In function `pqBuildStartupPacket2':
          fe-protocol2.c:(.text+0x1bad): undefined reference to `htonl'
          /usr/local/musl/lib/libpq.a(fe-protocol3.o): In function `build_startup_packet':
          fe-protocol3.c:(.text+0x4b3): undefined reference to `htonl'
          /usr/local/musl/lib/libpq.a(fe-protocol3.o): In function `pqGetErrorNotice3':
          fe-protocol3.c:(.text+0x11f7): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-protocol3.o): In function `pqParseInput3':
          fe-protocol3.c:(.text+0x19a8): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-secure.o): In function `pq_block_sigpipe':
          fe-secure.c:(.text+0x19c): undefined reference to `sigaddset'
          fe-secure.c:(.text+0x1c6): undefined reference to `sigismember'
          fe-secure.c:(.text+0x20c): undefined reference to `sigpending'
          fe-secure.c:(.text+0x21f): undefined reference to `sigismember'
          /usr/local/musl/lib/libpq.a(fe-secure.o): In function `pq_reset_sigpipe':
          fe-secure.c:(.text+0x288): undefined reference to `sigpending'
          fe-secure.c:(.text+0x2d1): undefined reference to `sigismember'
          fe-secure.c:(.text+0x2f2): undefined reference to `sigaddset'
          fe-secure.c:(.text+0x2ff): undefined reference to `sigwait'
          /usr/local/musl/lib/libpq.a(chklocale.o): In function `pg_get_encoding_from_locale':
          chklocale.c:(.text+0x50): undefined reference to `setlocale'
          chklocale.c:(.text+0x77): undefined reference to `setlocale'
          chklocale.c:(.text+0x8a): undefined reference to `nl_langinfo'
          chklocale.c:(.text+0xa7): undefined reference to `setlocale'
          chklocale.c:(.text+0x115): undefined reference to `setlocale'
          chklocale.c:(.text+0x159): undefined reference to `nl_langinfo'
          chklocale.c:(.text+0x1ba): undefined reference to `fputc'
          /usr/local/musl/lib/libpq.a(inet_net_ntop.o): In function `inet_net_ntop':
          inet_net_ntop.c:(.text+0xd3): undefined reference to `sprintf'
          inet_net_ntop.c:(.text+0x10b): undefined reference to `sprintf'
          inet_net_ntop.c:(.text+0x324): undefined reference to `sprintf'
          inet_net_ntop.c:(.text+0x3c4): undefined reference to `sprintf'
          inet_net_ntop.c:(.text+0x41b): undefined reference to `sprintf'
          /usr/local/musl/lib/libpq.a(ip.o): In function `pg_getnameinfo_all':
          ip.c:(.text+0x281): undefined reference to `getnameinfo'
          ip.c:(.text+0x2a7): undefined reference to `strlcpy'
          ip.c:(.text+0x2be): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(ip.o): In function `pg_sockaddr_cidr_mask':
          ip.c:(.text+0x46f): undefined reference to `htonl'
          /usr/local/musl/lib/libpq.a(ip.o): In function `pg_foreach_ifaddr':
          ip.c:(.text+0x5ce): undefined reference to `getifaddrs'
          ip.c:(.text+0x65e): undefined reference to `freeifaddrs'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `SSLerrmessage':
          fe-secure-openssl.c:(.text+0x38): undefined reference to `ERR_reason_error_string'
          fe-secure-openssl.c:(.text+0x4d): undefined reference to `strlcpy'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `initialize_SSL':
          fe-secure-openssl.c:(.text+0x122): undefined reference to `SSLv23_method'
          fe-secure-openssl.c:(.text+0x12a): undefined reference to `SSL_CTX_new'
          fe-secure-openssl.c:(.text+0x14a): undefined reference to `SSL_CTX_ctrl'
          fe-secure-openssl.c:(.text+0x15e): undefined reference to `SSL_CTX_ctrl'
          fe-secure-openssl.c:(.text+0x1c8): undefined reference to `SSL_new'
          fe-secure-openssl.c:(.text+0x1e5): undefined reference to `SSL_set_ex_data'
          fe-secure-openssl.c:(.text+0x209): undefined reference to `BIO_new'
          fe-secure-openssl.c:(.text+0x22d): undefined reference to `SSL_set_bio'
          fe-secure-openssl.c:(.text+0x244): undefined reference to `BIO_int_ctrl'
          fe-secure-openssl.c:(.text+0x253): undefined reference to `SSL_CTX_free'
          fe-secure-openssl.c:(.text+0x2bc): undefined reference to `ENGINE_by_id'
          fe-secure-openssl.c:(.text+0x2d4): undefined reference to `ENGINE_init'
          fe-secure-openssl.c:(.text+0x2ef): undefined reference to `ENGINE_load_private_key'
          fe-secure-openssl.c:(.text+0x307): undefined reference to `SSL_use_PrivateKey'
          fe-secure-openssl.c:(.text+0x405): undefined reference to `ERR_put_error'
          fe-secure-openssl.c:(.text+0x40a): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x44e): undefined reference to `SSL_CTX_free'
          fe-secure-openssl.c:(.text+0x471): undefined reference to `strlcpy'
          fe-secure-openssl.c:(.text+0x4e9): undefined reference to `strlcpy'
          fe-secure-openssl.c:(.text+0x5b1): undefined reference to `SSL_check_private_key'
          fe-secure-openssl.c:(.text+0x5bf): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x619): undefined reference to `SSL_CTX_load_verify_locations'
          fe-secure-openssl.c:(.text+0x62a): undefined reference to `SSL_CTX_get_cert_store'
          fe-secure-openssl.c:(.text+0x661): undefined reference to `ERR_clear_error'
          fe-secure-openssl.c:(.text+0x6a9): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x6fc): undefined reference to `SSL_set_verify'
          fe-secure-openssl.c:(.text+0x715): undefined reference to `SSL_CTX_use_certificate_chain_file'
          fe-secure-openssl.c:(.text+0x723): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x7b4): undefined reference to `SSL_ctrl'
          fe-secure-openssl.c:(.text+0x834): undefined reference to `SSL_use_PrivateKey_file'
          fe-secure-openssl.c:(.text+0x842): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x8a1): undefined reference to `BIO_s_socket'
          fe-secure-openssl.c:(.text+0x954): undefined reference to `strlcpy'
          fe-secure-openssl.c:(.text+0x969): undefined reference to `strlcpy'
          fe-secure-openssl.c:(.text+0x984): undefined reference to `X509_STORE_load_locations'
          fe-secure-openssl.c:(.text+0x99a): undefined reference to `X509_STORE_set_flags'
          fe-secure-openssl.c:(.text+0x9d1): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0xa1a): undefined reference to `ENGINE_finish'
          fe-secure-openssl.c:(.text+0xa26): undefined reference to `ENGINE_free'
          fe-secure-openssl.c:(.text+0xa75): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0xa9e): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0xb08): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0xb6d): undefined reference to `ERR_get_error'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `verify_peer_name_matches_certificate_name':
          fe-secure-openssl.c:(.text+0xbc5): undefined reference to `ASN1_STRING_data'
          fe-secure-openssl.c:(.text+0xbd0): undefined reference to `ASN1_STRING_length'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `my_sock_write':
          fe-secure-openssl.c:(.text+0xdb1): undefined reference to `BIO_clear_flags'
          fe-secure-openssl.c:(.text+0xde2): undefined reference to `BIO_set_flags'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `my_sock_read':
          fe-secure-openssl.c:(.text+0xe11): undefined reference to `BIO_clear_flags'
          fe-secure-openssl.c:(.text+0xe42): undefined reference to `BIO_set_flags'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pgtls_read_pending':
          fe-secure-openssl.c:(.text+0xeec): undefined reference to `SSL_pending'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pgtls_read':
          fe-secure-openssl.c:(.text+0xf4a): undefined reference to `ERR_clear_error'
          fe-secure-openssl.c:(.text+0xf5d): undefined reference to `SSL_read'
          fe-secure-openssl.c:(.text+0xf6e): undefined reference to `SSL_get_error'
          fe-secure-openssl.c:(.text+0xfa1): undefined reference to `ERR_get_error'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pgtls_write':
          fe-secure-openssl.c:(.text+0x11b8): undefined reference to `ERR_clear_error'
          fe-secure-openssl.c:(.text+0x11ca): undefined reference to `SSL_write'
          fe-secure-openssl.c:(.text+0x11db): undefined reference to `SSL_get_error'
          fe-secure-openssl.c:(.text+0x1211): undefined reference to `ERR_get_error'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pgtls_init':
          fe-secure-openssl.c:(.text+0x1461): undefined reference to `CRYPTO_get_id_callback'
          fe-secure-openssl.c:(.text+0x146f): undefined reference to `CRYPTO_get_locking_callback'
          fe-secure-openssl.c:(.text+0x1480): undefined reference to `CRYPTO_set_locking_callback'
          fe-secure-openssl.c:(.text+0x1493): undefined reference to `OPENSSL_config'
          fe-secure-openssl.c:(.text+0x1498): undefined reference to `SSL_library_init'
          fe-secure-openssl.c:(.text+0x149d): undefined reference to `SSL_load_error_strings'
          fe-secure-openssl.c:(.text+0x14b1): undefined reference to `CRYPTO_num_locks'
          fe-secure-openssl.c:(.text+0x14dc): undefined reference to `CRYPTO_num_locks'
          fe-secure-openssl.c:(.text+0x153a): undefined reference to `CRYPTO_set_id_callback'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pgtls_close':
          fe-secure-openssl.c:(.text+0x1568): undefined reference to `SSL_shutdown'
          fe-secure-openssl.c:(.text+0x1579): undefined reference to `SSL_free'
          fe-secure-openssl.c:(.text+0x159c): undefined reference to `X509_free'
          fe-secure-openssl.c:(.text+0x15b8): undefined reference to `ENGINE_finish'
          fe-secure-openssl.c:(.text+0x15c4): undefined reference to `ENGINE_free'
          fe-secure-openssl.c:(.text+0x1631): undefined reference to `CRYPTO_get_locking_callback'
          fe-secure-openssl.c:(.text+0x1642): undefined reference to `CRYPTO_get_id_callback'
          fe-secure-openssl.c:(.text+0x1655): undefined reference to `CRYPTO_set_id_callback'
          fe-secure-openssl.c:(.text+0x165e): undefined reference to `CRYPTO_set_locking_callback'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pgtls_open_client':
          fe-secure-openssl.c:(.text+0x16a6): undefined reference to `ERR_clear_error'
          fe-secure-openssl.c:(.text+0x16b2): undefined reference to `SSL_connect'
          fe-secure-openssl.c:(.text+0x16c8): undefined reference to `SSL_get_peer_certificate'
          fe-secure-openssl.c:(.text+0x1773): undefined reference to `SSL_get_error'
          fe-secure-openssl.c:(.text+0x177b): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x183d): undefined reference to `X509_get_ext_d2i'
          fe-secure-openssl.c:(.text+0x1851): undefined reference to `sk_num'
          fe-secure-openssl.c:(.text+0x188c): undefined reference to `sk_value'
          fe-secure-openssl.c:(.text+0x18ed): undefined reference to `sk_free'
          fe-secure-openssl.c:(.text+0x1931): undefined reference to `ERR_get_error'
          fe-secure-openssl.c:(.text+0x19cc): undefined reference to `sk_free'
          fe-secure-openssl.c:(.text+0x1a2d): undefined reference to `sk_free'
          fe-secure-openssl.c:(.text+0x1a40): undefined reference to `X509_get_subject_name'
          fe-secure-openssl.c:(.text+0x1a5e): undefined reference to `X509_NAME_get_index_by_NID'
          fe-secure-openssl.c:(.text+0x1a7a): undefined reference to `X509_NAME_get_entry'
          fe-secure-openssl.c:(.text+0x1a82): undefined reference to `X509_NAME_ENTRY_get_data'
          fe-secure-openssl.c:(.text+0x1b6d): undefined reference to `X509_get_subject_name'
          fe-secure-openssl.c:(.text+0x1b85): undefined reference to `X509_NAME_get_index_by_NID'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `PQsslAttribute':
          fe-secure-openssl.c:(.text+0x1ce3): undefined reference to `SSL_get_version'
          fe-secure-openssl.c:(.text+0x1d04): undefined reference to `SSL_get_current_cipher'
          fe-secure-openssl.c:(.text+0x1d11): undefined reference to `SSL_CIPHER_get_bits'
          fe-secure-openssl.c:(.text+0x1d44): undefined reference to `SSL_get_current_compression'
          fe-secure-openssl.c:(.text+0x1d64): undefined reference to `SSL_get_current_cipher'
          fe-secure-openssl.c:(.text+0x1d6c): undefined reference to `SSL_CIPHER_get_name'
          /usr/local/musl/lib/libpq.a(fe-secure-openssl.o): In function `pq_threadidcallback':
          fe-secure-openssl.c:(.text+0xd81): undefined reference to `pthread_self'
          collect2: error: ld returned 1 exit status

error: aborting due to previous error

error: Could not compile `using-diesel`.
emk commented 5 years ago

Thank you! I've confirmed this bug still exists after all known workarounds are applied. I'll take a shot at it tomorrow.

emk commented 5 years ago

OK, I've spent the last several hours updating everything to the latest dependencies, and I can still reproduce this bug.

Here's a few things I've observed so far:

1. All the link errors involve libpq_sys linking to OpenSSL

...at least as far as I can tell. Here's a sample:

  = note: /home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libpq_sys-3a6911426f910838.rlib(fe-secure-openssl.o): In function `SSLerrmessage':
          fe-secure-openssl.c:(.text+0x39): undefined reference to `ERR_reason_error_string'

This is interesting because libpq actually tries to link to openssl at the C level, but not (necessarily?) at the Rust level. I need to investigate this.

2. The example links to OpenSSL before libpq-sys

This:

/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libopenssl_sys-4783752d3593d472.rlib

...appears before:

"/home/rust/src/target/x86_64-unknown-linux-musl/release/deps/libpq_sys-3a6911426f910838.rlib"

IIRC correctly, this means that libpq won't be able to access libopenssl, because symbols in a library can only be looked up in libraries that come after.

3. In the past, we've fixed similar problems by adding extern crate openssl

This suggests that libpq isn't correctly managing to link to OpenSSL by itself.

4. I'm successfully using rust-musl-builder for a number of other projects

...and some of those projects have been updated or created very recently. So at least some of the time, this does work.

Hypothesis

Taken together, this suggests that that problem might be that libpq isn't correctly declaring a dependency on libopenssl

Things to try:

emk commented 5 years ago

OK, so I have verified that:

So this sounds like a case of libpq not correctly pulling in its dependencies, as hypothesized. On to the next step...

emk commented 5 years ago

libpq's build.rs is here: https://github.com/sgrif/pq-sys/blob/master/build.rs

It doesn't do anything in particular to ensure that OpenSSL, etc., get linked in. And none of the bugs in the bug tracker look relevant.

So now I want to look at the other, similar Rust images that statically link libpq, and see if anybody else has an existing fix for this.

emk commented 5 years ago

As mentioned in #64, it may be possible to force correct linking using:

extern crate openssl;

#[macro_use]
extern crate diesel;
emk commented 5 years ago

Other cross builders:

So there's no obvious, existing solution in any other Rust static builders.

Next steps:

emk commented 5 years ago

Issue filed upstream: https://github.com/sgrif/pq-sys/issues/25

iddm commented 5 years ago

Would you mind notifying watchers of this issue when the problem is solved? I am really concerned.

emk commented 5 years ago

@vityafx Please try the workaround mentioned above:

// Order matters!
extern crate openssl;
#[macro_use]
extern crate diesel;

This should work for most current versions of Rust.

iddm commented 5 years ago

It worked for me but I think importing openssl crate when I don't need it is a bit weird, especially breaking the order of the imports.

onelson commented 5 years ago

The deliberately ordered extern crate workaround worked for me on one project, but didn't on another. After a couple hours of disbelief, I shrugged my shoulders and just ran cargo update, which was apparently all I needed to do. I'm not sure which crate was the offensive one, but included in the bumps were openssl 0.10.21 -> 0.10.22, and openssl-sys 0.9.44 -> 0.9.46.

Not sure who needs to hear this, but just in case anyone else gets stuck... give cargo update a shot.

emk commented 5 years ago

We're going to need somebody to submit a PR for sgrif/pq-sys#25. I'm extremely busy on another project right now and won't be able to tackle this for a couple of weeks. Please feel free to ping me at the end of July or early August.

iddm commented 5 years ago

Can I use this hack still on the rust 2018 edition?

iddm commented 5 years ago

I have asked the question about rust 2018 because it does not work in it. The hack with extern crate order. cargo update also does not help.

UPD: It worked again suddenly. I don't know why.

iddm commented 5 years ago
  = note: /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `parseServiceFile':
          (.text+0xbd1): undefined reference to `ldap_init'
          (.text+0xbf1): undefined reference to `ldap_set_option'
          (.text+0xc05): undefined reference to `ldap_simple_bind'
          (.text+0xc39): undefined reference to `ldap_result'
          (.text+0xc57): undefined reference to `ldap_msgfree'
          (.text+0xc76): undefined reference to `ldap_set_option'
          (.text+0xcb4): undefined reference to `ldap_search_st'
          (.text+0xcda): undefined reference to `ldap_msgfree'
          (.text+0xce9): undefined reference to `ldap_err2string'
          (.text+0xd14): undefined reference to `ldap_unbind'
          (.text+0x1001): undefined reference to `ldap_unbind'
          (.text+0x101c): undefined reference to `ldap_count_entries'
          (.text+0x1055): undefined reference to `ldap_msgfree'
          (.text+0x105d): undefined reference to `ldap_unbind'
          (.text+0x1093): undefined reference to `ldap_first_entry'
          (.text+0x10b8): undefined reference to `ldap_get_values_len'
          (.text+0x10e1): undefined reference to `ldap_msgfree'
          (.text+0x11ac): undefined reference to `ldap_value_free_len'
          (.text+0x11b7): undefined reference to `ldap_unbind'
          (.text+0x124d): undefined reference to `ldap_msgfree'
          (.text+0x125d): undefined reference to `ldap_unbind'
          (.text+0x1287): undefined reference to `ldap_value_free_len'
          (.text+0x128f): undefined reference to `ldap_unbind'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `default_threadlock':
          (.text+0x1a79): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `pqDropConnection':
          (.text+0x208b): undefined reference to `gss_delete_sec_context'
          (.text+0x20a5): undefined reference to `gss_release_name'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `PQconnectPoll':
          (.text+0x28dc): undefined reference to `__snprintf_chk'
          (.text+0x2955): undefined reference to `__snprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `PQsetClientEncoding':
          (.text+0x48fb): undefined reference to `__sprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `parseServiceInfo':
          (.text+0x4c8a): undefined reference to `__snprintf_chk'
          (.text+0x4d15): undefined reference to `__snprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-connect.o): In function `connectOptions2':
          (.text+0x6468): undefined reference to `__snprintf_chk'
          (.text+0x67a0): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-exec.o): In function `pqInternalNotice':
          (.text+0x128f): undefined reference to `__vsnprintf_chk'
          (.text+0x1379): undefined reference to `__sprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-exec.o): In function `PQcopyResult':
          (.text+0x1677): undefined reference to `__strcpy_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-exec.o): In function `pqSaveParameterStatus':
          (.text+0x18e8): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-exec.o): In function `PQoidStatus':
          (.text+0x3c86): undefined reference to `__memcpy_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-misc.o): In function `pqGets_internal':
          (.text+0xc7): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-misc.o): In function `pqGetc':
          (.text+0x19b): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-misc.o): In function `pqGetnchar':
          (.text+0x242): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-misc.o): In function `pqSkipnchar':
          (.text+0x2ee): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-misc.o): In function `pqGetInt':
          (.text+0x3da): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-misc.o):(.text+0x619): more undefined references to `__fprintf_chk' follow
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-protocol2.o): In function `pqSetenvPoll':
          (.text+0xb24): undefined reference to `__sprintf_chk'
          (.text+0xc4a): undefined reference to `__sprintf_chk'
          (.text+0xcd2): undefined reference to `__sprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(pqexpbuffer.o): In function `appendPQExpBufferVA':
          (.text+0x265): undefined reference to `__vsnprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(chklocale.o): In function `pg_get_encoding_from_locale':
          (.text+0x1ff): undefined reference to `__fprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(inet_net_ntop.o): In function `inet_net_ntop':
          (.text+0xdc): undefined reference to `__sprintf_chk'
          (.text+0x2d2): undefined reference to `__sprintf_chk'
          (.text+0x337): undefined reference to `__sprintf_chk'
          (.text+0x3b8): undefined reference to `__sprintf_chk'
          (.text+0x478): undefined reference to `__sprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(inet_net_ntop.o):(.text+0x4b7): more undefined references to `__sprintf_chk' follow
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(ip.o): In function `pg_getaddrinfo_all':
          (.text+0x170): undefined reference to `__strcpy_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-secure-openssl.o): In function `SSLerrmessage':
          (.text+0x84): undefined reference to `__snprintf_chk'
          (.text+0xb7): undefined reference to `__snprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-secure-openssl.o): In function `initialize_SSL':
          (.text+0x4de): undefined reference to `__snprintf_chk'
          (.text+0x5ee): undefined reference to `__snprintf_chk'
          (.text+0x6b6): undefined reference to `__snprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-secure-openssl.o):(.text+0x963): more undefined references to `__snprintf_chk' follow
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-auth.o): In function `pg_GSS_error_int':
          (.text+0x5b): undefined reference to `gss_display_status'
          (.text+0x7e): undefined reference to `gss_release_buffer'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-auth.o): In function `pg_GSS_continue':
          (.text+0x15b): undefined reference to `gss_init_sec_context'
          (.text+0x188): undefined reference to `gss_release_buffer'
          (.text+0x1eb): undefined reference to `gss_release_buffer'
          (.text+0x270): undefined reference to `gss_release_name'
          (.text+0x28b): undefined reference to `gss_delete_sec_context'
          (.text+0x2a3): undefined reference to `gss_release_name'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-auth.o): In function `pg_fe_sendauth':
          (.text+0x531): undefined reference to `__snprintf_chk'
          (.text+0x545): undefined reference to `GSS_C_NT_HOSTBASED_SERVICE'
          (.text+0x55c): undefined reference to `gss_import_name'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-auth.o): In function `PQencryptPasswordConn':
          (.text+0xf34): undefined reference to `__memcpy_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(fe-auth-scram.o): In function `pg_fe_scram_exchange':
          (.text+0x5c6): undefined reference to `__snprintf_chk'
          /home/rust/src/target/x86_64-unknown-linux-musl/debug/deps/libpq_sys-f2ec40b7c53867fb.rlib(scram-common.o): In function `scram_build_verifier':
          (.text+0x5a4): undefined reference to `__sprintf_chk'
          collect2: error: ld returned 1 exit status

error: aborting due to previous error

This thing does not let me sleep normally.

emk commented 4 years ago

I haven't seen any new reports of this error in a while, so maybe the upstream fixes all went through. If you're still seeing problems on the most recent versions of everything, please feel free to reopen this issue.

Thank you to everybody who has found workarounds or fixes for this issue!

Raniz85 commented 4 years ago

Just a note that if you have multiple binaries in your project you need to put the extern crate declarations at the top of all of them.

alertedsnake commented 4 years ago

I'm still having this issue and no combination of any of the suggestions I've found work. Are there any new suggestions?

Edit: actually nevermind - I forgot I had a main.rs and a lib.rs which it imports (there are multiple binaries, though I'm only building one). It's working with the proper ordering of the extern crate statements. So thanks for the help!

adwhit commented 3 years ago

This bug could be related to https://github.com/rust-lang/rust/issues/61328 (which has bitten me multiple times). It seems to be something to do with the order in which linker inputs are declared - the above workaround presumably changes the declaration order of linker libs which somehow fixes it.