As discovered in #15460, a particular #[link(kind = "static", ...)] line is not actually guaranteed to link the library at all. The reason for this is that if the external library doesn't have any referenced symbols in the object generated by rustc, the entire library is dropped by the linker. For dynamic native libraries, this is solved by passing -lfoo for all downstream compilations unconditionally. For static libraries in rlibs this is solved because the entire archive is bundled in the rlib. The only situation in which this was a problem was when a static native library was linked to a rust dynamic library. This commit brings the behavior of dylibs in line with rlibs by passing the --whole-archive flag to the linker when linking native libraries. On OSX, this uses the -force_load flag. This flag ensures that the entire archive is considered candidate for being linked into the final dynamic library. This is a breaking change because if any static library is included twice in the same compilation unit then the linker will start emitting errors about duplicate definitions now. The fix for this would involve only statically linking to a library once. Closes #15460 [breaking-change]
52 lines
1.5 KiB
Rust
52 lines
1.5 KiB
Rust
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
//! This module contains the linkage attributes to all runtime dependencies of
|
|
//! the standard library This varies per-platform, but these libraries are
|
|
//! necessary for running libstd.
|
|
|
|
#![experimental]
|
|
|
|
// All platforms need to link to rustrt
|
|
#[cfg(not(test))]
|
|
#[link(name = "rust_builtin", kind = "static")]
|
|
extern {}
|
|
|
|
// LLVM implements the `frem` instruction as a call to `fmod`, which lives in
|
|
// libm. Hence, we must explicitly link to it.
|
|
//
|
|
// On linux librt and libdl are indirect dependencies via rustrt,
|
|
// and binutils 2.22+ won't add them automatically
|
|
#[cfg(target_os = "linux")]
|
|
#[link(name = "dl")]
|
|
#[link(name = "pthread")]
|
|
extern {}
|
|
|
|
#[cfg(target_os = "android")]
|
|
#[link(name = "dl")]
|
|
#[link(name = "log")]
|
|
extern {}
|
|
|
|
#[cfg(target_os = "freebsd")]
|
|
#[link(name = "execinfo")]
|
|
#[link(name = "pthread")]
|
|
extern {}
|
|
|
|
#[cfg(target_os = "dragonfly")]
|
|
#[link(name = "pthread")]
|
|
extern {}
|
|
|
|
#[cfg(target_os = "macos")]
|
|
#[link(name = "System")]
|
|
extern {}
|
|
|
|
#[cfg(target_os = "ios")]
|
|
#[link(name = "System")]
|
|
extern {}
|