@@ -380,17 +380,43 @@ impl<'a> Toolchain<'a> {
380
380
}
381
381
382
382
pub fn set_ldpath ( & self , cmd : & mut Command ) {
383
- let new_path = self . path . join ( "lib" ) ;
383
+ let mut new_path = vec ! [ self . path. join( "lib" ) ] ;
384
384
385
385
#[ cfg( not( target_os = "macos" ) ) ]
386
386
mod sysenv {
387
387
pub const LOADER_PATH : & str = "LD_LIBRARY_PATH" ;
388
388
}
389
389
#[ cfg( target_os = "macos" ) ]
390
390
mod sysenv {
391
- pub const LOADER_PATH : & str = "DYLD_LIBRARY_PATH" ;
391
+ // When loading and linking a dynamic library or bundle, dlopen
392
+ // searches in LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, PWD, and
393
+ // DYLD_FALLBACK_LIBRARY_PATH.
394
+ // In the Mach-O format, a dynamic library has an "install path."
395
+ // Clients linking against the library record this path, and the
396
+ // dynamic linker, dyld, uses it to locate the library.
397
+ // dyld searches DYLD_LIBRARY_PATH *before* the install path.
398
+ // dyld searches DYLD_FALLBACK_LIBRARY_PATH only if it cannot
399
+ // find the library in the install path.
400
+ // Setting DYLD_LIBRARY_PATH can easily have unintended
401
+ // consequences.
402
+ pub const LOADER_PATH : & str = "DYLD_FALLBACK_LIBRARY_PATH" ;
392
403
}
393
- env_var:: prepend_path ( sysenv:: LOADER_PATH , vec ! [ new_path. clone( ) ] , cmd) ;
404
+ if cfg ! ( target_os = "macos" )
405
+ && env:: var_os ( sysenv:: LOADER_PATH )
406
+ . filter ( |x| x. len ( ) > 0 )
407
+ . is_none ( )
408
+ {
409
+ // These are the defaults when DYLD_FALLBACK_LIBRARY_PATH isn't
410
+ // set or set to an empty string. Since we are explicitly setting
411
+ // the value, make sure the defaults still work.
412
+ if let Some ( home) = env:: var_os ( "HOME" ) {
413
+ new_path. push ( PathBuf :: from ( home) . join ( "lib" ) ) ;
414
+ }
415
+ new_path. push ( PathBuf :: from ( "/usr/local/lib" ) ) ;
416
+ new_path. push ( PathBuf :: from ( "/usr/lib" ) ) ;
417
+ }
418
+
419
+ env_var:: prepend_path ( sysenv:: LOADER_PATH , new_path, cmd) ;
394
420
395
421
// Prepend CARGO_HOME/bin to the PATH variable so that we're sure to run
396
422
// cargo/rustc via the proxy bins. There is no fallback case for if the
0 commit comments