diff --git a/src/liblibc/lib.rs b/src/liblibc/lib.rs index 8825099e36c35..671e552e08cf5 100644 --- a/src/liblibc/lib.rs +++ b/src/liblibc/lib.rs @@ -1095,6 +1095,7 @@ pub mod types { pub type sighandler_t = size_t; } pub mod bsd44 { + use types::common::c95::{c_void}; use types::os::arch::c95::{c_char, c_int, c_uint}; pub type socklen_t = u32; @@ -1167,6 +1168,17 @@ pub mod types { pub sun_family: sa_family_t, pub sun_path: [c_char, ..104] } + #[repr(C)] + #[deriving(Copy)] pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut c_char, + pub ifa_flags: c_uint, + pub ifa_addr: *mut sockaddr, + pub ifa_netmask: *mut sockaddr, + pub ifa_dstaddr: *mut sockaddr, + pub ifa_data: *mut c_void + } + } } diff --git a/src/librustc_back/rpath.rs b/src/librustc_back/rpath.rs index 1f8549098d949..10ba023c6193d 100644 --- a/src/librustc_back/rpath.rs +++ b/src/librustc_back/rpath.rs @@ -215,22 +215,7 @@ mod test { } #[test] - #[cfg(target_os = "freebsd")] - fn test_rpath_relative() { - let config = &mut RPathConfig { - used_crates: Vec::new(), - has_rpath: true, - is_like_osx: false, - out_filename: Path::new("bin/rustc"), - get_install_prefix_lib_path: || panic!(), - realpath: |p| Ok(p.clone()) - }; - let res = get_rpath_relative_to_output(config, &Path::new("lib/libstd.so")); - assert_eq!(res, "$ORIGIN/../lib"); - } - - #[test] - #[cfg(target_os = "dragonfly")] + #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] fn test_rpath_relative() { let config = &mut RPathConfig { used_crates: Vec::new(), diff --git a/src/librustc_back/target/x86_64_unknown_dragonfly.rs b/src/librustc_back/target/x86_64_unknown_dragonfly.rs index 79f09a3b00bdb..75dbff9428b3e 100644 --- a/src/librustc_back/target/x86_64_unknown_dragonfly.rs +++ b/src/librustc_back/target/x86_64_unknown_dragonfly.rs @@ -11,13 +11,18 @@ use target::Target; pub fn target() -> Target { + let mut base = super::dragonfly_base::opts(); + base.pre_link_args.push("-m64".to_string()); + Target { - data_layout: "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32".to_string(), + data_layout: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-\ + f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-\ + s0:64:64-f80:128:128-n8:16:32:64-S128".to_string(), llvm_target: "x86_64-unknown-dragonfly".to_string(), target_endian: "little".to_string(), - target_word_size: "32".to_string(), + target_word_size: "64".to_string(), arch: "x86_64".to_string(), target_os: "dragonfly".to_string(), - options: super::dragonfly_base::opts() + options: base, } } diff --git a/src/libstd/os.rs b/src/libstd/os.rs index a3ecfb49acee0..8ae237850da09 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -665,7 +665,7 @@ pub fn dll_filename(base: &str) -> String { /// ``` pub fn self_exe_name() -> Option { - #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] + #[cfg(target_os = "freebsd")] fn load_self() -> Option> { unsafe { use libc::funcs::bsd44::*; @@ -691,6 +691,16 @@ pub fn self_exe_name() -> Option { } } + #[cfg(target_os = "dragonfly")] + fn load_self() -> Option> { + use std::io; + + match io::fs::readlink(&Path::new("/proc/curproc/file")) { + Ok(path) => Some(path.into_vec()), + Err(..) => None + } + } + #[cfg(any(target_os = "linux", target_os = "android"))] fn load_self() -> Option> { use std::io;