rust-lang/rust@7504897 (original) (raw)

`@@ -896,7 +896,7 @@ fn link_args(cmd: &mut Linker,

`

896

896

`// on other dylibs (e.g. other native deps).

`

897

897

`add_local_native_libraries(cmd, sess);

`

898

898

`add_upstream_rust_crates(cmd, sess, crate_type, tmpdir);

`

899

``

`-

add_upstream_native_libraries(cmd, sess);

`

``

899

`+

add_upstream_native_libraries(cmd, sess, crate_type);

`

900

900

``

901

901

`// # Telling the linker what we're doing

`

902

902

``

`@@ -1213,7 +1213,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker,

`

1213

1213

`// generic function calls a native function, then the generic function must

`

1214

1214

`// be instantiated in the target crate, meaning that the native symbol must

`

1215

1215

`// also be resolved in the target crate.

`

1216

``

`-

fn add_upstream_native_libraries(cmd: &mut Linker, sess: &Session) {

`

``

1216

`+

fn add_upstream_native_libraries(cmd: &mut Linker, sess: &Session, crate_type: config::CrateType) {

`

1217

1217

`// Be sure to use a topological sorting of crates because there may be

`

1218

1218

`// interdependencies between native libraries. When passing -nodefaultlibs,

`

1219

1219

`// for example, almost all native libraries depend on libc, so we have to

`

`@@ -1223,6 +1223,9 @@ fn add_upstream_native_libraries(cmd: &mut Linker, sess: &Session) {

`

1223

1223

`// This passes RequireStatic, but the actual requirement doesn't matter,

`

1224

1224

`// we're just getting an ordering of crate numbers, we're not worried about

`

1225

1225

`// the paths.

`

``

1226

`+

let formats = sess.dependency_formats.borrow();

`

``

1227

`+

let data = formats.get(&crate_type).unwrap();

`

``

1228

+

1226

1229

`let crates = sess.cstore.used_crates(LinkagePreference::RequireStatic);

`

1227

1230

`for (cnum, _) in crates {

`

1228

1231

`for lib in sess.cstore.native_libraries(cnum) {

`

`@@ -1232,8 +1235,15 @@ fn add_upstream_native_libraries(cmd: &mut Linker, sess: &Session) {

`

1232

1235

`match lib.kind {

`

1233

1236

`NativeLibraryKind::NativeUnknown => cmd.link_dylib(&lib.name.as_str()),

`

1234

1237

`NativeLibraryKind::NativeFramework => cmd.link_framework(&lib.name.as_str()),

`

1235

``

`-

NativeLibraryKind::NativeStaticNobundle => cmd.link_staticlib(&lib.name.as_str()),

`

1236

``

-

``

1238

`+

NativeLibraryKind::NativeStaticNobundle => {

`

``

1239

`+

// Link "static-nobundle" native libs only if the crate they originate from

`

``

1240

`+

// is being linked statically to the current crate. If it's linked dynamically

`

``

1241

`+

// or is an rlib already included via some other dylib crate, the symbols from

`

``

1242

`+

// native libs will have already been included in that dylib.

`

``

1243

`+

if data[cnum.as_usize() - 1] == Linkage::Static {

`

``

1244

`+

cmd.link_staticlib(&lib.name.as_str())

`

``

1245

`+

}

`

``

1246

`+

},

`

1237

1247

`// ignore statically included native libraries here as we've

`

1238

1248

`// already included them when we included the rust library

`

1239

1249

`// previously

`