-Z linker-flavor
This patch adds a `-Z linker-flavor` flag to rustc which can be used to invoke the linker using a different interface. For example, by default rustc assumes that all the Linux targets will be linked using GCC. This makes it impossible to use LLD as a linker using just `-C linker=ld.lld` because that will invoke LLD with invalid command line arguments. (e.g. rustc will pass -Wl,--gc-sections to LLD but LLD doesn't understand that; --gc-sections would be the right argument) With this patch one can pass `-Z linker-flavor=ld` to rustc to invoke the linker using a LD-like interface. This way, `rustc -C linker=ld.lld -Z linker-flavor=ld` will invoke LLD with the right arguments. `-Z linker-flavor` accepts 4 different arguments: `em` (emcc), `ld`, `gcc`, `msvc` (link.exe). `em`, `gnu` and `msvc` cover all the existing linker interfaces. `ld` is a new flavor for interfacing GNU's ld and LLD. This patch also changes target specifications. `linker-flavor` is now a mandatory field that specifies the *default* linker flavor that the target will use. This change also makes the linker interface *explicit*; before, it used to be derived from other fields like linker-is-gnu, is-like-msvc, is-like-emscripten, etc. Another change to target specifications is that the fields `pre-link-args`, `post-link-args` and `late-link-args` now expect a map from flavor to linker arguments. ``` diff - "pre-link-args": ["-Wl,--as-needed", "-Wl,-z,-noexecstack"], + "pre-link-args": { + "gcc": ["-Wl,--as-needed", "-Wl,-z,-noexecstack"], + "ld": ["--as-needed", "-z,-noexecstack"], + }, ``` [breaking-change] for users of custom targets specifications
This commit is contained in:
parent
c438c1fb39
commit
9d11b089ad
@ -19,7 +19,7 @@ pub use self::DebugInfoLevel::*;
|
|||||||
use session::{early_error, early_warn, Session};
|
use session::{early_error, early_warn, Session};
|
||||||
use session::search_paths::SearchPaths;
|
use session::search_paths::SearchPaths;
|
||||||
|
|
||||||
use rustc_back::PanicStrategy;
|
use rustc_back::{LinkerFlavor, PanicStrategy};
|
||||||
use rustc_back::target::Target;
|
use rustc_back::target::Target;
|
||||||
use lint;
|
use lint;
|
||||||
use middle::cstore;
|
use middle::cstore;
|
||||||
@ -641,12 +641,14 @@ macro_rules! options {
|
|||||||
Some("either `panic` or `abort`");
|
Some("either `panic` or `abort`");
|
||||||
pub const parse_sanitizer: Option<&'static str> =
|
pub const parse_sanitizer: Option<&'static str> =
|
||||||
Some("one of: `address`, `leak`, `memory` or `thread`");
|
Some("one of: `address`, `leak`, `memory` or `thread`");
|
||||||
|
pub const parse_linker_flavor: Option<&'static str> =
|
||||||
|
Some(::rustc_back::LinkerFlavor::one_of());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
mod $mod_set {
|
mod $mod_set {
|
||||||
use super::{$struct_name, Passes, SomePasses, AllPasses, Sanitizer};
|
use super::{$struct_name, Passes, SomePasses, AllPasses, Sanitizer};
|
||||||
use rustc_back::PanicStrategy;
|
use rustc_back::{LinkerFlavor, PanicStrategy};
|
||||||
|
|
||||||
$(
|
$(
|
||||||
pub fn $opt(cg: &mut $struct_name, v: Option<&str>) -> bool {
|
pub fn $opt(cg: &mut $struct_name, v: Option<&str>) -> bool {
|
||||||
@ -777,6 +779,14 @@ macro_rules! options {
|
|||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_linker_flavor(slote: &mut Option<LinkerFlavor>, v: Option<&str>) -> bool {
|
||||||
|
match v.and_then(LinkerFlavor::from_str) {
|
||||||
|
Some(lf) => *slote = Some(lf),
|
||||||
|
_ => return false,
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
) }
|
) }
|
||||||
|
|
||||||
@ -979,6 +989,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
|
|||||||
"pass `-install_name @rpath/...` to the macOS linker"),
|
"pass `-install_name @rpath/...` to the macOS linker"),
|
||||||
sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
|
sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
|
||||||
"Use a sanitizer"),
|
"Use a sanitizer"),
|
||||||
|
linker_flavor: Option<LinkerFlavor> = (None, parse_linker_flavor, [UNTRACKED],
|
||||||
|
"Linker flavor"),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn default_lib_output() -> CrateType {
|
pub fn default_lib_output() -> CrateType {
|
||||||
|
@ -36,7 +36,7 @@ use syntax::{ast, codemap};
|
|||||||
use syntax::feature_gate::AttributeType;
|
use syntax::feature_gate::AttributeType;
|
||||||
use syntax_pos::{Span, MultiSpan};
|
use syntax_pos::{Span, MultiSpan};
|
||||||
|
|
||||||
use rustc_back::PanicStrategy;
|
use rustc_back::{LinkerFlavor, PanicStrategy};
|
||||||
use rustc_back::target::Target;
|
use rustc_back::target::Target;
|
||||||
use rustc_data_structures::flock;
|
use rustc_data_structures::flock;
|
||||||
use llvm;
|
use llvm;
|
||||||
@ -363,6 +363,9 @@ impl Session {
|
|||||||
pub fn panic_strategy(&self) -> PanicStrategy {
|
pub fn panic_strategy(&self) -> PanicStrategy {
|
||||||
self.opts.cg.panic.unwrap_or(self.target.target.options.panic_strategy)
|
self.opts.cg.panic.unwrap_or(self.target.target.options.panic_strategy)
|
||||||
}
|
}
|
||||||
|
pub fn linker_flavor(&self) -> LinkerFlavor {
|
||||||
|
self.opts.debugging_opts.linker_flavor.unwrap_or(self.target.target.linker_flavor)
|
||||||
|
}
|
||||||
pub fn no_landing_pads(&self) -> bool {
|
pub fn no_landing_pads(&self) -> bool {
|
||||||
self.opts.debugging_opts.no_landing_pads || self.panic_strategy() == PanicStrategy::Abort
|
self.opts.debugging_opts.no_landing_pads || self.panic_strategy() == PanicStrategy::Abort
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,48 @@ pub mod dynamic_lib;
|
|||||||
|
|
||||||
use serialize::json::{Json, ToJson};
|
use serialize::json::{Json, ToJson};
|
||||||
|
|
||||||
|
macro_rules! linker_flavor {
|
||||||
|
($(($variant:ident, $string:expr),)+) => {
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash,
|
||||||
|
RustcEncodable, RustcDecodable)]
|
||||||
|
pub enum LinkerFlavor {
|
||||||
|
$($variant,)+
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LinkerFlavor {
|
||||||
|
pub const fn one_of() -> &'static str {
|
||||||
|
concat!("one of: ", $($string, " ",)+)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_str(s: &str) -> Option<Self> {
|
||||||
|
Some(match s {
|
||||||
|
$($string => LinkerFlavor::$variant,)+
|
||||||
|
_ => return None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn desc(&self) -> &str {
|
||||||
|
match *self {
|
||||||
|
$(LinkerFlavor::$variant => $string,)+
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToJson for LinkerFlavor {
|
||||||
|
fn to_json(&self) -> Json {
|
||||||
|
self.desc().to_json()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
linker_flavor! {
|
||||||
|
(Em, "em"),
|
||||||
|
(Gcc, "gcc"),
|
||||||
|
(Ld, "ld"),
|
||||||
|
(Msvc, "msvc"),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Hash, RustcEncodable, RustcDecodable)]
|
#[derive(Clone, Copy, Debug, PartialEq, Hash, RustcEncodable, RustcDecodable)]
|
||||||
pub enum PanicStrategy {
|
pub enum PanicStrategy {
|
||||||
Unwind,
|
Unwind,
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
use super::apple_ios_base::{opts, Arch};
|
use super::apple_ios_base::{opts, Arch};
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "ios".to_string(),
|
target_os: "ios".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
features: "+neon,+fp-armv8,+cyclone".to_string(),
|
features: "+neon,+fp-armv8,+cyclone".to_string(),
|
||||||
eliminate_frame_pointer: false,
|
eliminate_frame_pointer: false,
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
// See https://developer.android.com/ndk/guides/abis.html#arm64-v8a
|
// See https://developer.android.com/ndk/guides/abis.html#arm64-v8a
|
||||||
@ -28,6 +29,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "android".to_string(),
|
target_os: "android".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -26,6 +27,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "freebsd".to_string(),
|
target_os: "freebsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -23,6 +24,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "fuchsia".to_string(),
|
target_os: "fuchsia".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -26,6 +27,7 @@ pub fn target() -> TargetResult {
|
|||||||
arch: "aarch64".to_string(),
|
arch: "aarch64".to_string(),
|
||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,13 +8,15 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::TargetOptions;
|
use target::TargetOptions;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
let mut base = super::linux_base::opts();
|
let mut base = super::linux_base::opts();
|
||||||
// Many of the symbols defined in compiler-rt are also defined in libgcc.
|
// Many of the symbols defined in compiler-rt are also defined in libgcc.
|
||||||
// Android's linker doesn't like that by default.
|
// Android's linker doesn't like that by default.
|
||||||
base.pre_link_args.push("-Wl,--allow-multiple-definition".to_string());
|
base.pre_link_args
|
||||||
|
.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,--allow-multiple-definition".to_string());
|
||||||
base.is_like_android = true;
|
base.is_like_android = true;
|
||||||
base.position_independent_executables = true;
|
base.position_independent_executables = true;
|
||||||
base.has_elf_tls = false;
|
base.has_elf_tls = false;
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
use target::TargetOptions;
|
use target::{LinkArgs, TargetOptions};
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
// ELF TLS is only available in macOS 10.7+. If you try to compile for 10.6
|
// ELF TLS is only available in macOS 10.7+. If you try to compile for 10.6
|
||||||
@ -43,7 +43,7 @@ pub fn opts() -> TargetOptions {
|
|||||||
dll_prefix: "lib".to_string(),
|
dll_prefix: "lib".to_string(),
|
||||||
dll_suffix: ".dylib".to_string(),
|
dll_suffix: ".dylib".to_string(),
|
||||||
archive_format: "bsd".to_string(),
|
archive_format: "bsd".to_string(),
|
||||||
pre_link_args: Vec::new(),
|
pre_link_args: LinkArgs::new(),
|
||||||
exe_allocation_crate: super::maybe_jemalloc(),
|
exe_allocation_crate: super::maybe_jemalloc(),
|
||||||
has_elf_tls: version >= (10, 7),
|
has_elf_tls: version >= (10, 7),
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use target::TargetOptions;
|
use target::{LinkArgs, TargetOptions};
|
||||||
|
|
||||||
use self::Arch::*;
|
use self::Arch::*;
|
||||||
|
|
||||||
@ -60,7 +61,7 @@ pub fn get_sdk_root(sdk_name: &str) -> Result<String, String> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_pre_link_args(arch: Arch) -> Result<Vec<String>, String> {
|
fn build_pre_link_args(arch: Arch) -> Result<LinkArgs, String> {
|
||||||
let sdk_name = match arch {
|
let sdk_name = match arch {
|
||||||
Armv7 | Armv7s | Arm64 => "iphoneos",
|
Armv7 | Armv7s | Arm64 => "iphoneos",
|
||||||
I386 | X86_64 => "iphonesimulator"
|
I386 | X86_64 => "iphonesimulator"
|
||||||
@ -70,8 +71,14 @@ fn build_pre_link_args(arch: Arch) -> Result<Vec<String>, String> {
|
|||||||
|
|
||||||
let sdk_root = get_sdk_root(sdk_name)?;
|
let sdk_root = get_sdk_root(sdk_name)?;
|
||||||
|
|
||||||
Ok(vec!["-arch".to_string(), arch_name.to_string(),
|
let mut args = LinkArgs::new();
|
||||||
"-Wl,-syslibroot".to_string(), sdk_root])
|
args.insert(LinkerFlavor::Gcc,
|
||||||
|
vec!["-arch".to_string(),
|
||||||
|
arch_name.to_string(),
|
||||||
|
"-Wl,-syslibroot".to_string(),
|
||||||
|
sdk_root]);
|
||||||
|
|
||||||
|
Ok(args)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn target_cpu(arch: Arch) -> String {
|
fn target_cpu(arch: Arch) -> String {
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -24,6 +25,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "android".to_string(),
|
target_os: "android".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
features: "+v6".to_string(),
|
features: "+v6".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
features: "+v6,+vfp2".to_string(),
|
features: "+v6,+vfp2".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -29,6 +30,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -29,6 +30,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -21,6 +22,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
features: "+soft-float".to_string(),
|
features: "+soft-float".to_string(),
|
||||||
@ -31,4 +33,3 @@ pub fn target() -> TargetResult {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
use super::apple_ios_base::{opts, Arch};
|
use super::apple_ios_base::{opts, Arch};
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "ios".to_string(),
|
target_os: "ios".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
features: "+v7,+vfp3,+neon".to_string(),
|
features: "+v7,+vfp3,+neon".to_string(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
// See https://developer.android.com/ndk/guides/abis.html#v7a
|
// See https://developer.android.com/ndk/guides/abis.html#v7a
|
||||||
@ -27,6 +28,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "android".to_string(),
|
target_os: "android".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -21,6 +22,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
// Info about features at https://wiki.debian.org/ArmHardFloatPort
|
// Info about features at https://wiki.debian.org/ArmHardFloatPort
|
||||||
@ -32,4 +34,3 @@ pub fn target() -> TargetResult {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -30,6 +31,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
abi_blacklist: super::arm_base::abi_blacklist(),
|
abi_blacklist: super::arm_base::abi_blacklist(),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
use super::apple_ios_base::{opts, Arch};
|
use super::apple_ios_base::{opts, Arch};
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "ios".to_string(),
|
target_os: "ios".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
features: "+v7,+vfp4,+neon".to_string(),
|
features: "+v7,+vfp4,+neon".to_string(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
|
@ -8,10 +8,16 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::{Target, TargetOptions};
|
use LinkerFlavor;
|
||||||
|
use super::{LinkArgs, Target, TargetOptions};
|
||||||
use super::emscripten_base::{cmd};
|
use super::emscripten_base::{cmd};
|
||||||
|
|
||||||
pub fn target() -> Result<Target, String> {
|
pub fn target() -> Result<Target, String> {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Em,
|
||||||
|
vec!["-s".to_string(),
|
||||||
|
"ERROR_ON_UNDEFINED_SYMBOLS=1".to_string()]);
|
||||||
|
|
||||||
let opts = TargetOptions {
|
let opts = TargetOptions {
|
||||||
linker: cmd("emcc"),
|
linker: cmd("emcc"),
|
||||||
ar: cmd("emar"),
|
ar: cmd("emar"),
|
||||||
@ -24,7 +30,7 @@ pub fn target() -> Result<Target, String> {
|
|||||||
obj_is_bitcode: true,
|
obj_is_bitcode: true,
|
||||||
is_like_emscripten: true,
|
is_like_emscripten: true,
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
post_link_args: vec!["-s".to_string(), "ERROR_ON_UNDEFINED_SYMBOLS=1".to_string()],
|
post_link_args: args,
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
};
|
};
|
||||||
@ -37,6 +43,7 @@ pub fn target() -> Result<Target, String> {
|
|||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
|
data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
|
||||||
arch: "asmjs".to_string(),
|
arch: "asmjs".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Em,
|
||||||
options: opts,
|
options: opts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,26 +8,30 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
// GNU-style linkers will use this to omit linking to libraries
|
||||||
|
// which don't actually fulfill any relocations, but only for
|
||||||
|
// libraries which follow this flag. Thus, use it before
|
||||||
|
// specifying libraries to link to.
|
||||||
|
"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
|
// Always enable NX protection when it is available
|
||||||
|
"-Wl,-z,noexecstack".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
dynamic_linking: true,
|
dynamic_linking: true,
|
||||||
executables: true,
|
executables: true,
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
has_rpath: true,
|
has_rpath: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
// GNU-style linkers will use this to omit linking to libraries
|
|
||||||
// which don't actually fulfill any relocations, but only for
|
|
||||||
// libraries which follow this flag. Thus, use it before
|
|
||||||
// specifying libraries to link to.
|
|
||||||
"-Wl,--as-needed".to_string(),
|
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
|
||||||
"-Wl,-z,noexecstack".to_string(),
|
|
||||||
],
|
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
exe_allocation_crate: super::maybe_jemalloc(),
|
exe_allocation_crate: super::maybe_jemalloc(),
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
|
@ -8,26 +8,30 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
// GNU-style linkers will use this to omit linking to libraries
|
||||||
|
// which don't actually fulfill any relocations, but only for
|
||||||
|
// libraries which follow this flag. Thus, use it before
|
||||||
|
// specifying libraries to link to.
|
||||||
|
"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
|
// Always enable NX protection when it is available
|
||||||
|
"-Wl,-z,noexecstack".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
dynamic_linking: true,
|
dynamic_linking: true,
|
||||||
executables: true,
|
executables: true,
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
has_rpath: true,
|
has_rpath: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
// GNU-style linkers will use this to omit linking to libraries
|
|
||||||
// which don't actually fulfill any relocations, but only for
|
|
||||||
// libraries which follow this flag. Thus, use it before
|
|
||||||
// specifying libraries to link to.
|
|
||||||
"-Wl,--as-needed".to_string(),
|
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
|
||||||
"-Wl,-z,noexecstack".to_string(),
|
|
||||||
],
|
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
exe_allocation_crate: super::maybe_jemalloc(),
|
exe_allocation_crate: super::maybe_jemalloc(),
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
|
@ -8,30 +8,34 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
// We want to be able to strip as much executable code as possible
|
||||||
|
// from the linker command line, and this flag indicates to the
|
||||||
|
// linker that it can avoid linking in dynamic libraries that don't
|
||||||
|
// actually satisfy any symbols up to that point (as with many other
|
||||||
|
// resolutions the linker does). This option only applies to all
|
||||||
|
// following libraries so we're sure to pass it as one of the first
|
||||||
|
// arguments.
|
||||||
|
// FIXME: figure out whether these linker args are desirable
|
||||||
|
//"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
|
// Always enable NX protection when it is available
|
||||||
|
//"-Wl,-z,noexecstack".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
dynamic_linking: true,
|
dynamic_linking: true,
|
||||||
executables: true,
|
executables: true,
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
has_rpath: true,
|
has_rpath: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
// We want to be able to strip as much executable code as possible
|
|
||||||
// from the linker command line, and this flag indicates to the
|
|
||||||
// linker that it can avoid linking in dynamic libraries that don't
|
|
||||||
// actually satisfy any symbols up to that point (as with many other
|
|
||||||
// resolutions the linker does). This option only applies to all
|
|
||||||
// following libraries so we're sure to pass it as one of the first
|
|
||||||
// arguments.
|
|
||||||
// FIXME: figure out whether these linker args are desirable
|
|
||||||
//"-Wl,--as-needed".to_string(),
|
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
|
||||||
//"-Wl,-z,noexecstack".to_string(),
|
|
||||||
],
|
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
exe_allocation_crate: "alloc_system".to_string(),
|
exe_allocation_crate: "alloc_system".to_string(),
|
||||||
has_elf_tls: true,
|
has_elf_tls: true,
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
use super::apple_ios_base::{opts, Arch};
|
use super::apple_ios_base::{opts, Arch};
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "ios".to_string(),
|
target_os: "ios".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::apple_base::opts();
|
let mut base = super::apple_base::opts();
|
||||||
base.cpu = "yonah".to_string();
|
base.cpu = "yonah".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-apple-darwin".to_string(),
|
llvm_target: "i686-apple-darwin".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "macos".to_string(),
|
target_os: "macos".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
// See https://developer.android.com/ndk/guides/abis.html#x86
|
// See https://developer.android.com/ndk/guides/abis.html#x86
|
||||||
@ -31,6 +32,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "android".to_string(),
|
target_os: "android".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -18,7 +19,8 @@ pub fn target() -> TargetResult {
|
|||||||
|
|
||||||
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
|
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
|
||||||
// space available to x86 Windows binaries on x86_64.
|
// space available to x86 Windows binaries on x86_64.
|
||||||
base.pre_link_args.push("-Wl,--large-address-aware".to_string());
|
base.pre_link_args
|
||||||
|
.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,--large-address-aware".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-pc-windows-gnu".to_string(),
|
llvm_target: "i686-pc-windows-gnu".to_string(),
|
||||||
@ -29,6 +31,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "windows".to_string(),
|
target_os: "windows".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "pc".to_string(),
|
target_vendor: "pc".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -17,12 +18,13 @@ pub fn target() -> TargetResult {
|
|||||||
|
|
||||||
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
|
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
|
||||||
// space available to x86 Windows binaries on x86_64.
|
// space available to x86 Windows binaries on x86_64.
|
||||||
base.pre_link_args.push("/LARGEADDRESSAWARE".to_string());
|
base.pre_link_args
|
||||||
|
.get_mut(&LinkerFlavor::Msvc).unwrap().push("/LARGEADDRESSAWARE".to_string());
|
||||||
|
|
||||||
// Ensure the linker will only produce an image if it can also produce a table of
|
// Ensure the linker will only produce an image if it can also produce a table of
|
||||||
// the image's safe exception handlers.
|
// the image's safe exception handlers.
|
||||||
// https://msdn.microsoft.com/en-us/library/9a89h429.aspx
|
// https://msdn.microsoft.com/en-us/library/9a89h429.aspx
|
||||||
base.pre_link_args.push("/SAFESEH".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Msvc).unwrap().push("/SAFESEH".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-pc-windows-msvc".to_string(),
|
llvm_target: "i686-pc-windows-msvc".to_string(),
|
||||||
@ -33,6 +35,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "windows".to_string(),
|
target_os: "windows".to_string(),
|
||||||
target_env: "msvc".to_string(),
|
target_env: "msvc".to_string(),
|
||||||
target_vendor: "pc".to_string(),
|
target_vendor: "pc".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Msvc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::dragonfly_base::opts();
|
let mut base = super::dragonfly_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-unknown-dragonfly".to_string(),
|
llvm_target: "i686-unknown-dragonfly".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "dragonfly".to_string(),
|
target_os: "dragonfly".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::freebsd_base::opts();
|
let mut base = super::freebsd_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-unknown-freebsd".to_string(),
|
llvm_target: "i686-unknown-freebsd".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "freebsd".to_string(),
|
target_os: "freebsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::haiku_base::opts();
|
let mut base = super::haiku_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-unknown-haiku".to_string(),
|
llvm_target: "i686-unknown-haiku".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "haiku".to_string(),
|
target_os: "haiku".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_base::opts();
|
let mut base = super::linux_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-unknown-linux-gnu".to_string(),
|
llvm_target: "i686-unknown-linux-gnu".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,14 +8,15 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_musl_base::opts();
|
let mut base = super::linux_musl_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.pre_link_args.push("-Wl,-melf_i386".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,-melf_i386".to_string());
|
||||||
|
|
||||||
// The unwinder used by i686-unknown-linux-musl, the LLVM libunwind
|
// The unwinder used by i686-unknown-linux-musl, the LLVM libunwind
|
||||||
// implementation, apparently relies on frame pointers existing... somehow.
|
// implementation, apparently relies on frame pointers existing... somehow.
|
||||||
@ -40,6 +41,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-unknown-netbsdelf".to_string(),
|
llvm_target: "i686-unknown-netbsdelf".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "netbsd".to_string(),
|
target_os: "netbsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::openbsd_base::opts();
|
let mut base = super::openbsd_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-unknown-openbsd".to_string(),
|
llvm_target: "i686-unknown-openbsd".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "openbsd".to_string(),
|
target_os: "openbsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,17 +8,25 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::{Target, TargetOptions, TargetResult};
|
use LinkerFlavor;
|
||||||
|
use super::{LinkArgs, Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
|
let mut pre_link_args = LinkArgs::new();
|
||||||
|
pre_link_args.insert(LinkerFlavor::Gcc,
|
||||||
|
vec!["--pnacl-exceptions=sjlj".to_string(),
|
||||||
|
"--target=le32-unknown-nacl".to_string(),
|
||||||
|
"-Wl,--start-group".to_string()]);
|
||||||
|
let mut post_link_args = LinkArgs::new();
|
||||||
|
post_link_args.insert(LinkerFlavor::Gcc,
|
||||||
|
vec!["-Wl,--end-group".to_string()]);
|
||||||
|
|
||||||
let opts = TargetOptions {
|
let opts = TargetOptions {
|
||||||
linker: "pnacl-clang".to_string(),
|
linker: "pnacl-clang".to_string(),
|
||||||
ar: "pnacl-ar".to_string(),
|
ar: "pnacl-ar".to_string(),
|
||||||
|
|
||||||
pre_link_args: vec!["--pnacl-exceptions=sjlj".to_string(),
|
pre_link_args: pre_link_args,
|
||||||
"--target=le32-unknown-nacl".to_string(),
|
post_link_args: post_link_args,
|
||||||
"-Wl,--start-group".to_string()],
|
|
||||||
post_link_args: vec!["-Wl,--end-group".to_string()],
|
|
||||||
dynamic_linking: false,
|
dynamic_linking: false,
|
||||||
executables: true,
|
executables: true,
|
||||||
exe_suffix: ".pexe".to_string(),
|
exe_suffix: ".pexe".to_string(),
|
||||||
@ -36,6 +44,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
data_layout: "e-i64:64:64-p:32:32:32-v128:32:32".to_string(),
|
data_layout: "e-i64:64:64-p:32:32:32-v128:32:32".to_string(),
|
||||||
arch: "le32".to_string(),
|
arch: "le32".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: opts,
|
options: opts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,29 +8,33 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
// We want to be able to strip as much executable code as possible
|
||||||
|
// from the linker command line, and this flag indicates to the
|
||||||
|
// linker that it can avoid linking in dynamic libraries that don't
|
||||||
|
// actually satisfy any symbols up to that point (as with many other
|
||||||
|
// resolutions the linker does). This option only applies to all
|
||||||
|
// following libraries so we're sure to pass it as one of the first
|
||||||
|
// arguments.
|
||||||
|
"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
|
// Always enable NX protection when it is available
|
||||||
|
"-Wl,-z,noexecstack".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
dynamic_linking: true,
|
dynamic_linking: true,
|
||||||
executables: true,
|
executables: true,
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
has_rpath: true,
|
has_rpath: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
// We want to be able to strip as much executable code as possible
|
|
||||||
// from the linker command line, and this flag indicates to the
|
|
||||||
// linker that it can avoid linking in dynamic libraries that don't
|
|
||||||
// actually satisfy any symbols up to that point (as with many other
|
|
||||||
// resolutions the linker does). This option only applies to all
|
|
||||||
// following libraries so we're sure to pass it as one of the first
|
|
||||||
// arguments.
|
|
||||||
"-Wl,--as-needed".to_string(),
|
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
|
||||||
"-Wl,-z,noexecstack".to_string(),
|
|
||||||
],
|
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
exe_allocation_crate: super::maybe_jemalloc(),
|
exe_allocation_crate: super::maybe_jemalloc(),
|
||||||
has_elf_tls: true,
|
has_elf_tls: true,
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::TargetOptions;
|
use target::TargetOptions;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
@ -15,13 +16,13 @@ pub fn opts() -> TargetOptions {
|
|||||||
|
|
||||||
// Make sure that the linker/gcc really don't pull in anything, including
|
// Make sure that the linker/gcc really don't pull in anything, including
|
||||||
// default objects, libs, etc.
|
// default objects, libs, etc.
|
||||||
base.pre_link_args.push("-nostdlib".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-nostdlib".to_string());
|
||||||
|
|
||||||
// At least when this was tested, the linker would not add the
|
// At least when this was tested, the linker would not add the
|
||||||
// `GNU_EH_FRAME` program header to executables generated, which is required
|
// `GNU_EH_FRAME` program header to executables generated, which is required
|
||||||
// when unwinding to locate the unwinding information. I'm not sure why this
|
// when unwinding to locate the unwinding information. I'm not sure why this
|
||||||
// argument is *not* necessary for normal builds, but it can't hurt!
|
// argument is *not* necessary for normal builds, but it can't hurt!
|
||||||
base.pre_link_args.push("-Wl,--eh-frame-hdr".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,--eh-frame-hdr".to_string());
|
||||||
|
|
||||||
// There's a whole bunch of circular dependencies when dealing with MUSL
|
// There's a whole bunch of circular dependencies when dealing with MUSL
|
||||||
// unfortunately. To put this in perspective libc is statically linked to
|
// unfortunately. To put this in perspective libc is statically linked to
|
||||||
@ -45,8 +46,8 @@ pub fn opts() -> TargetOptions {
|
|||||||
// link everything as a group, not stripping anything out until everything
|
// link everything as a group, not stripping anything out until everything
|
||||||
// is processed. The linker will still perform a pass to strip out object
|
// is processed. The linker will still perform a pass to strip out object
|
||||||
// files but it won't do so until all objects/archives have been processed.
|
// files but it won't do so until all objects/archives have been processed.
|
||||||
base.pre_link_args.push("-Wl,-(".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,-(".to_string());
|
||||||
base.post_link_args.push("-Wl,-)".to_string());
|
base.post_link_args.insert(LinkerFlavor::Gcc, vec!["-Wl,-)".to_string()]);
|
||||||
|
|
||||||
// When generating a statically linked executable there's generally some
|
// When generating a statically linked executable there's generally some
|
||||||
// small setup needed which is listed in these files. These are provided by
|
// small setup needed which is listed in these files. These are provided by
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
// NOTE(mips64r2) matches C toolchain
|
// NOTE(mips64r2) matches C toolchain
|
||||||
cpu: "mips64r2".to_string(),
|
cpu: "mips64r2".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
// NOTE(mips64r2) matches C toolchain
|
// NOTE(mips64r2) matches C toolchain
|
||||||
cpu: "mips64r2".to_string(),
|
cpu: "mips64r2".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
cpu: "mips32r2".to_string(),
|
cpu: "mips32r2".to_string(),
|
||||||
features: "+mips32r2".to_string(),
|
features: "+mips32r2".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
cpu: "mips32r2".to_string(),
|
cpu: "mips32r2".to_string(),
|
||||||
features: "+mips32r2,+soft-float".to_string(),
|
features: "+mips32r2,+soft-float".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "uclibc".to_string(),
|
target_env: "uclibc".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
cpu: "mips32r2".to_string(),
|
cpu: "mips32r2".to_string(),
|
||||||
features: "+mips32r2,+soft-float".to_string(),
|
features: "+mips32r2,+soft-float".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
cpu: "mips32".to_string(),
|
cpu: "mips32".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
cpu: "mips32".to_string(),
|
cpu: "mips32".to_string(),
|
||||||
features: "+mips32,+soft-float".to_string(),
|
features: "+mips32,+soft-float".to_string(),
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -20,6 +21,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "uclibc".to_string(),
|
target_env: "uclibc".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
cpu: "mips32".to_string(),
|
cpu: "mips32".to_string(),
|
||||||
|
@ -50,7 +50,7 @@ use std::default::Default;
|
|||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use syntax::abi::{Abi, lookup as lookup_abi};
|
use syntax::abi::{Abi, lookup as lookup_abi};
|
||||||
|
|
||||||
use PanicStrategy;
|
use {LinkerFlavor, PanicStrategy};
|
||||||
|
|
||||||
mod android_base;
|
mod android_base;
|
||||||
mod apple_base;
|
mod apple_base;
|
||||||
@ -72,6 +72,7 @@ mod thumb_base;
|
|||||||
mod fuchsia_base;
|
mod fuchsia_base;
|
||||||
mod redox_base;
|
mod redox_base;
|
||||||
|
|
||||||
|
pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<String>>;
|
||||||
pub type TargetResult = Result<Target, String>;
|
pub type TargetResult = Result<Target, String>;
|
||||||
|
|
||||||
macro_rules! supported_targets {
|
macro_rules! supported_targets {
|
||||||
@ -241,6 +242,8 @@ pub struct Target {
|
|||||||
pub arch: String,
|
pub arch: String,
|
||||||
/// [Data layout](http://llvm.org/docs/LangRef.html#data-layout) to pass to LLVM.
|
/// [Data layout](http://llvm.org/docs/LangRef.html#data-layout) to pass to LLVM.
|
||||||
pub data_layout: String,
|
pub data_layout: String,
|
||||||
|
/// Linker flavor
|
||||||
|
pub linker_flavor: LinkerFlavor,
|
||||||
/// Optional settings with defaults.
|
/// Optional settings with defaults.
|
||||||
pub options: TargetOptions,
|
pub options: TargetOptions,
|
||||||
}
|
}
|
||||||
@ -261,7 +264,7 @@ pub struct TargetOptions {
|
|||||||
|
|
||||||
/// Linker arguments that are unconditionally passed *before* any
|
/// Linker arguments that are unconditionally passed *before* any
|
||||||
/// user-defined libraries.
|
/// user-defined libraries.
|
||||||
pub pre_link_args: Vec<String>,
|
pub pre_link_args: LinkArgs,
|
||||||
/// Objects to link before all others, always found within the
|
/// Objects to link before all others, always found within the
|
||||||
/// sysroot folder.
|
/// sysroot folder.
|
||||||
pub pre_link_objects_exe: Vec<String>, // ... when linking an executable
|
pub pre_link_objects_exe: Vec<String>, // ... when linking an executable
|
||||||
@ -269,13 +272,13 @@ pub struct TargetOptions {
|
|||||||
/// Linker arguments that are unconditionally passed after any
|
/// Linker arguments that are unconditionally passed after any
|
||||||
/// user-defined but before post_link_objects. Standard platform
|
/// user-defined but before post_link_objects. Standard platform
|
||||||
/// libraries that should be always be linked to, usually go here.
|
/// libraries that should be always be linked to, usually go here.
|
||||||
pub late_link_args: Vec<String>,
|
pub late_link_args: LinkArgs,
|
||||||
/// Objects to link after all others, always found within the
|
/// Objects to link after all others, always found within the
|
||||||
/// sysroot folder.
|
/// sysroot folder.
|
||||||
pub post_link_objects: Vec<String>,
|
pub post_link_objects: Vec<String>,
|
||||||
/// Linker arguments that are unconditionally passed *after* any
|
/// Linker arguments that are unconditionally passed *after* any
|
||||||
/// user-defined libraries.
|
/// user-defined libraries.
|
||||||
pub post_link_args: Vec<String>,
|
pub post_link_args: LinkArgs,
|
||||||
|
|
||||||
/// Extra arguments to pass to the external assembler (when used)
|
/// Extra arguments to pass to the external assembler (when used)
|
||||||
pub asm_args: Vec<String>,
|
pub asm_args: Vec<String>,
|
||||||
@ -412,8 +415,8 @@ impl Default for TargetOptions {
|
|||||||
is_builtin: false,
|
is_builtin: false,
|
||||||
linker: option_env!("CFG_DEFAULT_LINKER").unwrap_or("cc").to_string(),
|
linker: option_env!("CFG_DEFAULT_LINKER").unwrap_or("cc").to_string(),
|
||||||
ar: option_env!("CFG_DEFAULT_AR").unwrap_or("ar").to_string(),
|
ar: option_env!("CFG_DEFAULT_AR").unwrap_or("ar").to_string(),
|
||||||
pre_link_args: Vec::new(),
|
pre_link_args: LinkArgs::new(),
|
||||||
post_link_args: Vec::new(),
|
post_link_args: LinkArgs::new(),
|
||||||
asm_args: Vec::new(),
|
asm_args: Vec::new(),
|
||||||
cpu: "generic".to_string(),
|
cpu: "generic".to_string(),
|
||||||
features: "".to_string(),
|
features: "".to_string(),
|
||||||
@ -445,7 +448,7 @@ impl Default for TargetOptions {
|
|||||||
pre_link_objects_exe: Vec::new(),
|
pre_link_objects_exe: Vec::new(),
|
||||||
pre_link_objects_dll: Vec::new(),
|
pre_link_objects_dll: Vec::new(),
|
||||||
post_link_objects: Vec::new(),
|
post_link_objects: Vec::new(),
|
||||||
late_link_args: Vec::new(),
|
late_link_args: LinkArgs::new(),
|
||||||
archive_format: "gnu".to_string(),
|
archive_format: "gnu".to_string(),
|
||||||
custom_unwind_resume: false,
|
custom_unwind_resume: false,
|
||||||
lib_allocation_crate: "alloc_system".to_string(),
|
lib_allocation_crate: "alloc_system".to_string(),
|
||||||
@ -529,6 +532,10 @@ impl Target {
|
|||||||
target_os: get_req_field("os")?,
|
target_os: get_req_field("os")?,
|
||||||
target_env: get_opt_field("env", ""),
|
target_env: get_opt_field("env", ""),
|
||||||
target_vendor: get_opt_field("vendor", "unknown"),
|
target_vendor: get_opt_field("vendor", "unknown"),
|
||||||
|
linker_flavor: LinkerFlavor::from_str(&*get_req_field("linker-flavor")?)
|
||||||
|
.ok_or_else(|| {
|
||||||
|
format!("linker flavor must be {}", LinkerFlavor::one_of())
|
||||||
|
})?,
|
||||||
options: Default::default(),
|
options: Default::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -579,17 +586,49 @@ impl Target {
|
|||||||
.map(|s| s.to_string() );
|
.map(|s| s.to_string() );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
($key_name:ident, LinkerFlavor) => ( {
|
||||||
|
let name = (stringify!($key_name)).replace("_", "-");
|
||||||
|
obj.find(&name[..]).and_then(|o| o.as_string().map(|s| {
|
||||||
|
LinkerFlavor::from_str(&s).ok_or_else(|| {
|
||||||
|
Err(format!("'{}' is not a valid value for linker-flavor. \
|
||||||
|
Use 'em', 'gcc', 'ld' or 'msvc.", s))
|
||||||
|
})
|
||||||
|
})).unwrap_or(Ok(()))
|
||||||
|
} );
|
||||||
|
($key_name:ident, link_args) => ( {
|
||||||
|
let name = (stringify!($key_name)).replace("_", "-");
|
||||||
|
if let Some(obj) = obj.find(&name[..]).and_then(|o| o.as_object()) {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
for (k, v) in obj {
|
||||||
|
let k = LinkerFlavor::from_str(&k).ok_or_else(|| {
|
||||||
|
format!("{}: '{}' is not a valid value for linker-flavor. \
|
||||||
|
Use 'em', 'gcc', 'ld' or 'msvc'", name, k)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let v = v.as_array().map(|a| {
|
||||||
|
a
|
||||||
|
.iter()
|
||||||
|
.filter_map(|o| o.as_string())
|
||||||
|
.map(|s| s.to_owned())
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
}).unwrap_or(vec![]);
|
||||||
|
|
||||||
|
args.insert(k, v);
|
||||||
|
}
|
||||||
|
base.options.$key_name = args;
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
key!(is_builtin, bool);
|
key!(is_builtin, bool);
|
||||||
key!(linker);
|
key!(linker);
|
||||||
key!(ar);
|
key!(ar);
|
||||||
key!(pre_link_args, list);
|
key!(pre_link_args, link_args);
|
||||||
key!(pre_link_objects_exe, list);
|
key!(pre_link_objects_exe, list);
|
||||||
key!(pre_link_objects_dll, list);
|
key!(pre_link_objects_dll, list);
|
||||||
key!(late_link_args, list);
|
key!(late_link_args, link_args);
|
||||||
key!(post_link_objects, list);
|
key!(post_link_objects, list);
|
||||||
key!(post_link_args, list);
|
key!(post_link_args, link_args);
|
||||||
key!(asm_args, list);
|
key!(asm_args, list);
|
||||||
key!(cpu);
|
key!(cpu);
|
||||||
key!(features);
|
key!(features);
|
||||||
@ -734,6 +773,16 @@ impl ToJson for Target {
|
|||||||
d.insert(name.to_string(), self.options.$attr.to_json());
|
d.insert(name.to_string(), self.options.$attr.to_json());
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
(link_args - $attr:ident) => ( {
|
||||||
|
let name = (stringify!($attr)).replace("_", "-");
|
||||||
|
if default.$attr != self.options.$attr {
|
||||||
|
let obj = self.options.$attr
|
||||||
|
.iter()
|
||||||
|
.map(|(k, v)| (k.desc().to_owned(), v.clone()))
|
||||||
|
.collect::<BTreeMap<_, _>>();
|
||||||
|
d.insert(name.to_string(), obj.to_json());
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
target_val!(llvm_target);
|
target_val!(llvm_target);
|
||||||
@ -743,18 +792,18 @@ impl ToJson for Target {
|
|||||||
target_val!(target_os, "os");
|
target_val!(target_os, "os");
|
||||||
target_val!(target_env, "env");
|
target_val!(target_env, "env");
|
||||||
target_val!(target_vendor, "vendor");
|
target_val!(target_vendor, "vendor");
|
||||||
target_val!(arch);
|
|
||||||
target_val!(data_layout);
|
target_val!(data_layout);
|
||||||
|
target_val!(linker_flavor);
|
||||||
|
|
||||||
target_option_val!(is_builtin);
|
target_option_val!(is_builtin);
|
||||||
target_option_val!(linker);
|
target_option_val!(linker);
|
||||||
target_option_val!(ar);
|
target_option_val!(ar);
|
||||||
target_option_val!(pre_link_args);
|
target_option_val!(link_args - pre_link_args);
|
||||||
target_option_val!(pre_link_objects_exe);
|
target_option_val!(pre_link_objects_exe);
|
||||||
target_option_val!(pre_link_objects_dll);
|
target_option_val!(pre_link_objects_dll);
|
||||||
target_option_val!(late_link_args);
|
target_option_val!(link_args - late_link_args);
|
||||||
target_option_val!(post_link_objects);
|
target_option_val!(post_link_objects);
|
||||||
target_option_val!(post_link_args);
|
target_option_val!(link_args - post_link_args);
|
||||||
target_option_val!(asm_args);
|
target_option_val!(asm_args);
|
||||||
target_option_val!(cpu);
|
target_option_val!(cpu);
|
||||||
target_option_val!(features);
|
target_option_val!(features);
|
||||||
|
@ -8,26 +8,30 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
// GNU-style linkers will use this to omit linking to libraries
|
||||||
|
// which don't actually fulfill any relocations, but only for
|
||||||
|
// libraries which follow this flag. Thus, use it before
|
||||||
|
// specifying libraries to link to.
|
||||||
|
"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
|
// Always enable NX protection when it is available
|
||||||
|
"-Wl,-z,noexecstack".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
dynamic_linking: true,
|
dynamic_linking: true,
|
||||||
executables: true,
|
executables: true,
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
has_rpath: true,
|
has_rpath: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
// GNU-style linkers will use this to omit linking to libraries
|
|
||||||
// which don't actually fulfill any relocations, but only for
|
|
||||||
// libraries which follow this flag. Thus, use it before
|
|
||||||
// specifying libraries to link to.
|
|
||||||
"-Wl,--as-needed".to_string(),
|
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
|
||||||
"-Wl,-z,noexecstack".to_string(),
|
|
||||||
],
|
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
}
|
}
|
||||||
|
@ -8,10 +8,23 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
// GNU-style linkers will use this to omit linking to libraries
|
||||||
|
// which don't actually fulfill any relocations, but only for
|
||||||
|
// libraries which follow this flag. Thus, use it before
|
||||||
|
// specifying libraries to link to.
|
||||||
|
"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
|
// Always enable NX protection when it is available
|
||||||
|
"-Wl,-z,noexecstack".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
dynamic_linking: true,
|
dynamic_linking: true,
|
||||||
executables: true,
|
executables: true,
|
||||||
@ -19,16 +32,7 @@ pub fn opts() -> TargetOptions {
|
|||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
has_rpath: true,
|
has_rpath: true,
|
||||||
is_like_openbsd: true,
|
is_like_openbsd: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
// GNU-style linkers will use this to omit linking to libraries
|
|
||||||
// which don't actually fulfill any relocations, but only for
|
|
||||||
// libraries which follow this flag. Thus, use it before
|
|
||||||
// specifying libraries to link to.
|
|
||||||
"-Wl,--as-needed".to_string(),
|
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
|
||||||
"-Wl,-z,noexecstack".to_string(),
|
|
||||||
],
|
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
exe_allocation_crate: "alloc_system".to_string(),
|
exe_allocation_crate: "alloc_system".to_string(),
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
|
@ -8,12 +8,13 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_base::opts();
|
let mut base = super::linux_base::opts();
|
||||||
base.cpu = "ppc64".to_string();
|
base.cpu = "ppc64".to_string();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
|
|
||||||
// see #36994
|
// see #36994
|
||||||
@ -28,6 +29,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,13 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_base::opts();
|
let mut base = super::linux_base::opts();
|
||||||
base.cpu = "ppc64le".to_string();
|
base.cpu = "ppc64le".to_string();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
|
|
||||||
// see #36994
|
// see #36994
|
||||||
@ -28,6 +29,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_base::opts();
|
let mut base = super::linux_base::opts();
|
||||||
base.pre_link_args.push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.max_atomic_width = Some(32);
|
base.max_atomic_width = Some(32);
|
||||||
|
|
||||||
// see #36994
|
// see #36994
|
||||||
@ -27,6 +28,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,25 +8,28 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use PanicStrategy;
|
use {LinkerFlavor, PanicStrategy};
|
||||||
use target::TargetOptions;
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
TargetOptions {
|
let mut args = LinkArgs::new();
|
||||||
pre_link_args: vec![
|
args.insert(LinkerFlavor::Gcc, vec![
|
||||||
// We want to be able to strip as much executable code as possible
|
// We want to be able to strip as much executable code as possible
|
||||||
// from the linker command line, and this flag indicates to the
|
// from the linker command line, and this flag indicates to the
|
||||||
// linker that it can avoid linking in dynamic libraries that don't
|
// linker that it can avoid linking in dynamic libraries that don't
|
||||||
// actually satisfy any symbols up to that point (as with many other
|
// actually satisfy any symbols up to that point (as with many other
|
||||||
// resolutions the linker does). This option only applies to all
|
// resolutions the linker does). This option only applies to all
|
||||||
// following libraries so we're sure to pass it as one of the first
|
// following libraries so we're sure to pass it as one of the first
|
||||||
// arguments.
|
// arguments.
|
||||||
"-Wl,--as-needed".to_string(),
|
"-Wl,--as-needed".to_string(),
|
||||||
|
|
||||||
// Always enable NX protection when it is available
|
// Always enable NX protection when it is available
|
||||||
"-Wl,-z,noexecstack".to_string()
|
"-Wl,-z,noexecstack".to_string()
|
||||||
],
|
]);
|
||||||
|
|
||||||
|
TargetOptions {
|
||||||
|
pre_link_args: args,
|
||||||
executables: true,
|
executables: true,
|
||||||
relocation_model: "static".to_string(),
|
relocation_model: "static".to_string(),
|
||||||
disable_redzone: true,
|
disable_redzone: true,
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -31,6 +32,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,13 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
base.cpu = "v9".to_string();
|
base.cpu = "v9".to_string();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "netbsd".to_string(),
|
target_os: "netbsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::solaris_base::opts();
|
let mut base = super::solaris_base::opts();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
// llvm calls this "v9"
|
// llvm calls this "v9"
|
||||||
base.cpu = "v9".to_string();
|
base.cpu = "v9".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
@ -30,6 +31,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "solaris".to_string(),
|
target_os: "solaris".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "sun".to_string(),
|
target_vendor: "sun".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
// Targets the Cortex-M0, Cortex-M0+ and Cortex-M1 processors (ARMv6-M architecture)
|
// Targets the Cortex-M0, Cortex-M0+ and Cortex-M1 processors (ARMv6-M architecture)
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "none".to_string(),
|
target_os: "none".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "".to_string(),
|
target_vendor: "".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
// The ARMv6-M architecture doesn't support unaligned loads/stores so we disable them
|
// The ARMv6-M architecture doesn't support unaligned loads/stores so we disable them
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
// To opt-in to hardware accelerated floating point operations, you can use, for example,
|
// To opt-in to hardware accelerated floating point operations, you can use, for example,
|
||||||
// `-C target-feature=+vfp4` or `-C target-cpu=cortex-m4`.
|
// `-C target-feature=+vfp4` or `-C target-cpu=cortex-m4`.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -31,6 +32,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "none".to_string(),
|
target_os: "none".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "".to_string(),
|
target_vendor: "".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
//
|
//
|
||||||
// To opt into double precision hardware support, use the `-C target-feature=-fp-only-sp` flag.
|
// To opt into double precision hardware support, use the `-C target-feature=-fp-only-sp` flag.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -30,6 +31,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "none".to_string(),
|
target_os: "none".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "".to_string(),
|
target_vendor: "".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
// `+vfp4` is the lowest common denominator between the Cortex-M4 (vfp4-16) and the
|
// `+vfp4` is the lowest common denominator between the Cortex-M4 (vfp4-16) and the
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
// Targets the Cortex-M3 processor (ARMv7-M)
|
// Targets the Cortex-M3 processor (ARMv7-M)
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "none".to_string(),
|
target_os: "none".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "".to_string(),
|
target_vendor: "".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
|
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
|
@ -8,10 +8,18 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::{Target, TargetOptions};
|
use LinkerFlavor;
|
||||||
|
use super::{LinkArgs, Target, TargetOptions};
|
||||||
use super::emscripten_base::{cmd};
|
use super::emscripten_base::{cmd};
|
||||||
|
|
||||||
pub fn target() -> Result<Target, String> {
|
pub fn target() -> Result<Target, String> {
|
||||||
|
let mut post_link_args = LinkArgs::new();
|
||||||
|
post_link_args.insert(LinkerFlavor::Gcc,
|
||||||
|
vec!["-s".to_string(),
|
||||||
|
"BINARYEN=1".to_string(),
|
||||||
|
"-s".to_string(),
|
||||||
|
"ERROR_ON_UNDEFINED_SYMBOLS=1".to_string()]);
|
||||||
|
|
||||||
let opts = TargetOptions {
|
let opts = TargetOptions {
|
||||||
linker: cmd("emcc"),
|
linker: cmd("emcc"),
|
||||||
ar: cmd("emar"),
|
ar: cmd("emar"),
|
||||||
@ -26,8 +34,7 @@ pub fn target() -> Result<Target, String> {
|
|||||||
obj_is_bitcode: true,
|
obj_is_bitcode: true,
|
||||||
is_like_emscripten: true,
|
is_like_emscripten: true,
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
post_link_args: vec!["-s".to_string(), "BINARYEN=1".to_string(),
|
post_link_args: post_link_args,
|
||||||
"-s".to_string(), "ERROR_ON_UNDEFINED_SYMBOLS=1".to_string()],
|
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
};
|
};
|
||||||
@ -40,6 +47,7 @@ pub fn target() -> Result<Target, String> {
|
|||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
|
data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
|
||||||
arch: "wasm32".to_string(),
|
arch: "wasm32".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Em,
|
||||||
options: opts,
|
options: opts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,26 +8,13 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
TargetOptions {
|
let mut pre_link_args = LinkArgs::new();
|
||||||
// FIXME(#13846) this should be enabled for windows
|
pre_link_args.insert(LinkerFlavor::Gcc, vec![
|
||||||
function_sections: false,
|
|
||||||
linker: "gcc".to_string(),
|
|
||||||
dynamic_linking: true,
|
|
||||||
executables: true,
|
|
||||||
dll_prefix: "".to_string(),
|
|
||||||
dll_suffix: ".dll".to_string(),
|
|
||||||
exe_suffix: ".exe".to_string(),
|
|
||||||
staticlib_prefix: "".to_string(),
|
|
||||||
staticlib_suffix: ".lib".to_string(),
|
|
||||||
no_default_libraries: true,
|
|
||||||
target_family: Some("windows".to_string()),
|
|
||||||
is_like_windows: true,
|
|
||||||
allows_weak_linkage: false,
|
|
||||||
pre_link_args: vec![
|
|
||||||
// And here, we see obscure linker flags #45. On windows, it has been
|
// And here, we see obscure linker flags #45. On windows, it has been
|
||||||
// found to be necessary to have this flag to compile liblibc.
|
// found to be necessary to have this flag to compile liblibc.
|
||||||
//
|
//
|
||||||
@ -64,7 +51,34 @@ pub fn opts() -> TargetOptions {
|
|||||||
|
|
||||||
// Do not use the standard system startup files or libraries when linking
|
// Do not use the standard system startup files or libraries when linking
|
||||||
"-nostdlib".to_string(),
|
"-nostdlib".to_string(),
|
||||||
],
|
]);
|
||||||
|
|
||||||
|
let mut late_link_args = LinkArgs::new();
|
||||||
|
late_link_args.insert(LinkerFlavor::Gcc, vec![
|
||||||
|
"-lmingwex".to_string(),
|
||||||
|
"-lmingw32".to_string(),
|
||||||
|
"-lgcc".to_string(), // alas, mingw* libraries above depend on libgcc
|
||||||
|
"-lmsvcrt".to_string(),
|
||||||
|
"-luser32".to_string(),
|
||||||
|
"-lkernel32".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
TargetOptions {
|
||||||
|
// FIXME(#13846) this should be enabled for windows
|
||||||
|
function_sections: false,
|
||||||
|
linker: "gcc".to_string(),
|
||||||
|
dynamic_linking: true,
|
||||||
|
executables: true,
|
||||||
|
dll_prefix: "".to_string(),
|
||||||
|
dll_suffix: ".dll".to_string(),
|
||||||
|
exe_suffix: ".exe".to_string(),
|
||||||
|
staticlib_prefix: "".to_string(),
|
||||||
|
staticlib_suffix: ".lib".to_string(),
|
||||||
|
no_default_libraries: true,
|
||||||
|
target_family: Some("windows".to_string()),
|
||||||
|
is_like_windows: true,
|
||||||
|
allows_weak_linkage: false,
|
||||||
|
pre_link_args: pre_link_args,
|
||||||
pre_link_objects_exe: vec![
|
pre_link_objects_exe: vec![
|
||||||
"crt2.o".to_string(), // mingw C runtime initialization for executables
|
"crt2.o".to_string(), // mingw C runtime initialization for executables
|
||||||
"rsbegin.o".to_string(), // Rust compiler runtime initialization, see rsbegin.rs
|
"rsbegin.o".to_string(), // Rust compiler runtime initialization, see rsbegin.rs
|
||||||
@ -73,14 +87,7 @@ pub fn opts() -> TargetOptions {
|
|||||||
"dllcrt2.o".to_string(), // mingw C runtime initialization for dlls
|
"dllcrt2.o".to_string(), // mingw C runtime initialization for dlls
|
||||||
"rsbegin.o".to_string(),
|
"rsbegin.o".to_string(),
|
||||||
],
|
],
|
||||||
late_link_args: vec![
|
late_link_args: late_link_args,
|
||||||
"-lmingwex".to_string(),
|
|
||||||
"-lmingw32".to_string(),
|
|
||||||
"-lgcc".to_string(), // alas, mingw* libraries above depend on libgcc
|
|
||||||
"-lmsvcrt".to_string(),
|
|
||||||
"-luser32".to_string(),
|
|
||||||
"-lkernel32".to_string(),
|
|
||||||
],
|
|
||||||
post_link_objects: vec![
|
post_link_objects: vec![
|
||||||
"rsend.o".to_string()
|
"rsend.o".to_string()
|
||||||
],
|
],
|
||||||
|
@ -8,10 +8,16 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use target::TargetOptions;
|
use LinkerFlavor;
|
||||||
|
use target::{LinkArgs, TargetOptions};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
|
let mut args = LinkArgs::new();
|
||||||
|
args.insert(LinkerFlavor::Msvc,
|
||||||
|
vec!["/NOLOGO".to_string(),
|
||||||
|
"/NXCOMPAT".to_string()]);
|
||||||
|
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
function_sections: true,
|
function_sections: true,
|
||||||
linker: "link.exe".to_string(),
|
linker: "link.exe".to_string(),
|
||||||
@ -56,10 +62,7 @@ pub fn opts() -> TargetOptions {
|
|||||||
target_family: Some("windows".to_string()),
|
target_family: Some("windows".to_string()),
|
||||||
is_like_windows: true,
|
is_like_windows: true,
|
||||||
is_like_msvc: true,
|
is_like_msvc: true,
|
||||||
pre_link_args: vec![
|
pre_link_args: args,
|
||||||
"/NOLOGO".to_string(),
|
|
||||||
"/NXCOMPAT".to_string(),
|
|
||||||
],
|
|
||||||
exe_allocation_crate: "alloc_system".to_string(),
|
exe_allocation_crate: "alloc_system".to_string(),
|
||||||
|
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -15,7 +16,7 @@ pub fn target() -> TargetResult {
|
|||||||
base.cpu = "core2".to_string();
|
base.cpu = "core2".to_string();
|
||||||
base.max_atomic_width = Some(128); // core2 support cmpxchg16b
|
base.max_atomic_width = Some(128); // core2 support cmpxchg16b
|
||||||
base.eliminate_frame_pointer = false;
|
base.eliminate_frame_pointer = false;
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-apple-darwin".to_string(),
|
llvm_target: "x86_64-apple-darwin".to_string(),
|
||||||
@ -26,6 +27,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "macos".to_string(),
|
target_os: "macos".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetOptions, TargetResult};
|
use target::{Target, TargetOptions, TargetResult};
|
||||||
use super::apple_ios_base::{opts, Arch};
|
use super::apple_ios_base::{opts, Arch};
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "ios".to_string(),
|
target_os: "ios".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "apple".to_string(),
|
target_vendor: "apple".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
.. base
|
.. base
|
||||||
|
@ -8,12 +8,13 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::windows_base::opts();
|
let mut base = super::windows_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "windows".to_string(),
|
target_os: "windows".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "pc".to_string(),
|
target_vendor: "pc".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
@ -24,6 +25,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "windows".to_string(),
|
target_os: "windows".to_string(),
|
||||||
target_env: "msvc".to_string(),
|
target_env: "msvc".to_string(),
|
||||||
target_vendor: "pc".to_string(),
|
target_vendor: "pc".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Msvc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,13 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.linker = "x86_64-rumprun-netbsd-gcc".to_string();
|
base.linker = "x86_64-rumprun-netbsd-gcc".to_string();
|
||||||
base.ar = "x86_64-rumprun-netbsd-ar".to_string();
|
base.ar = "x86_64-rumprun-netbsd-ar".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
@ -34,6 +35,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "netbsd".to_string(),
|
target_os: "netbsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "rumprun".to_string(),
|
target_vendor: "rumprun".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::solaris_base::opts();
|
let mut base = super::solaris_base::opts();
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "solaris".to_string(),
|
target_os: "solaris".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "sun".to_string(),
|
target_vendor: "sun".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::bitrig_base::opts();
|
let mut base = super::bitrig_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-bitrig".to_string(),
|
llvm_target: "x86_64-unknown-bitrig".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "bitrig".to_string(),
|
target_os: "bitrig".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::dragonfly_base::opts();
|
let mut base = super::dragonfly_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-dragonfly".to_string(),
|
llvm_target: "x86_64-unknown-dragonfly".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "dragonfly".to_string(),
|
target_os: "dragonfly".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::freebsd_base::opts();
|
let mut base = super::freebsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-freebsd".to_string(),
|
llvm_target: "x86_64-unknown-freebsd".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "freebsd".to_string(),
|
target_os: "freebsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::fuchsia_base::opts();
|
let mut base = super::fuchsia_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-fuchsia".to_string(),
|
llvm_target: "x86_64-unknown-fuchsia".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "fuchsia".to_string(),
|
target_os: "fuchsia".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::haiku_base::opts();
|
let mut base = super::haiku_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-haiku".to_string(),
|
llvm_target: "x86_64-unknown-haiku".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "haiku".to_string(),
|
target_os: "haiku".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_base::opts();
|
let mut base = super::linux_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-linux-gnu".to_string(),
|
llvm_target: "x86_64-unknown-linux-gnu".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "gnu".to_string(),
|
target_env: "gnu".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::linux_musl_base::opts();
|
let mut base = super::linux_musl_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-linux-musl".to_string(),
|
llvm_target: "x86_64-unknown-linux-musl".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "linux".to_string(),
|
target_os: "linux".to_string(),
|
||||||
target_env: "musl".to_string(),
|
target_env: "musl".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-netbsd".to_string(),
|
llvm_target: "x86_64-unknown-netbsd".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "netbsd".to_string(),
|
target_os: "netbsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::openbsd_base::opts();
|
let mut base = super::openbsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-openbsd".to_string(),
|
llvm_target: "x86_64-unknown-openbsd".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "openbsd".to_string(),
|
target_os: "openbsd".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use LinkerFlavor;
|
||||||
use target::{Target, TargetResult};
|
use target::{Target, TargetResult};
|
||||||
|
|
||||||
pub fn target() -> TargetResult {
|
pub fn target() -> TargetResult {
|
||||||
let mut base = super::redox_base::opts();
|
let mut base = super::redox_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "x86_64-unknown-redox".to_string(),
|
llvm_target: "x86_64-unknown-redox".to_string(),
|
||||||
@ -25,6 +26,7 @@ pub fn target() -> TargetResult {
|
|||||||
target_os: "redox".to_string(),
|
target_os: "redox".to_string(),
|
||||||
target_env: "".to_string(),
|
target_env: "".to_string(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
|
linker_flavor: LinkerFlavor::Gcc,
|
||||||
options: base,
|
options: base,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -422,3 +422,4 @@ impl Drop for OperandBundleDef {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[link(name = "ffi")] extern {}
|
||||||
|
@ -707,13 +707,16 @@ fn link_natively(sess: &Session,
|
|||||||
outputs: &OutputFilenames,
|
outputs: &OutputFilenames,
|
||||||
tmpdir: &Path) {
|
tmpdir: &Path) {
|
||||||
info!("preparing {:?} from {:?} to {:?}", crate_type, objects, out_filename);
|
info!("preparing {:?} from {:?} to {:?}", crate_type, objects, out_filename);
|
||||||
|
let flavor = sess.linker_flavor();
|
||||||
|
|
||||||
// The invocations of cc share some flags across platforms
|
// The invocations of cc share some flags across platforms
|
||||||
let (pname, mut cmd, extra) = get_linker(sess);
|
let (pname, mut cmd, extra) = get_linker(sess);
|
||||||
cmd.env("PATH", command_path(sess, extra));
|
cmd.env("PATH", command_path(sess, extra));
|
||||||
|
|
||||||
let root = sess.target_filesearch(PathKind::Native).get_lib_path();
|
let root = sess.target_filesearch(PathKind::Native).get_lib_path();
|
||||||
cmd.args(&sess.target.target.options.pre_link_args);
|
if let Some(args) = sess.target.target.options.pre_link_args.get(&flavor) {
|
||||||
|
cmd.args(args);
|
||||||
|
}
|
||||||
|
|
||||||
let pre_link_objects = if crate_type == config::CrateTypeExecutable {
|
let pre_link_objects = if crate_type == config::CrateTypeExecutable {
|
||||||
&sess.target.target.options.pre_link_objects_exe
|
&sess.target.target.options.pre_link_objects_exe
|
||||||
@ -739,11 +742,15 @@ fn link_natively(sess: &Session,
|
|||||||
objects, out_filename, outputs, trans);
|
objects, out_filename, outputs, trans);
|
||||||
cmd = linker.finalize();
|
cmd = linker.finalize();
|
||||||
}
|
}
|
||||||
cmd.args(&sess.target.target.options.late_link_args);
|
if let Some(args) = sess.target.target.options.late_link_args.get(&flavor) {
|
||||||
|
cmd.args(args);
|
||||||
|
}
|
||||||
for obj in &sess.target.target.options.post_link_objects {
|
for obj in &sess.target.target.options.post_link_objects {
|
||||||
cmd.arg(root.join(obj));
|
cmd.arg(root.join(obj));
|
||||||
}
|
}
|
||||||
cmd.args(&sess.target.target.options.post_link_args);
|
if let Some(args) = sess.target.target.options.post_link_args.get(&flavor) {
|
||||||
|
cmd.args(args);
|
||||||
|
}
|
||||||
|
|
||||||
if sess.opts.debugging_opts.print_link_args {
|
if sess.opts.debugging_opts.print_link_args {
|
||||||
println!("{:?}", &cmd);
|
println!("{:?}", &cmd);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ffi::OsString;
|
use std::ffi::{OsStr, OsString};
|
||||||
use std::fs::{self, File};
|
use std::fs::{self, File};
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::io::{self, BufWriter};
|
use std::io::{self, BufWriter};
|
||||||
@ -22,6 +22,7 @@ use back::archive;
|
|||||||
use back::symbol_export::{self, ExportedSymbols};
|
use back::symbol_export::{self, ExportedSymbols};
|
||||||
use middle::dependency_format::Linkage;
|
use middle::dependency_format::Linkage;
|
||||||
use rustc::hir::def_id::{LOCAL_CRATE, CrateNum};
|
use rustc::hir::def_id::{LOCAL_CRATE, CrateNum};
|
||||||
|
use rustc_back::LinkerFlavor;
|
||||||
use session::Session;
|
use session::Session;
|
||||||
use session::config::{self, CrateType, OptLevel, DebugInfoLevel};
|
use session::config::{self, CrateType, OptLevel, DebugInfoLevel};
|
||||||
use serialize::{json, Encoder};
|
use serialize::{json, Encoder};
|
||||||
@ -45,25 +46,39 @@ impl<'a, 'tcx> LinkerInfo {
|
|||||||
pub fn to_linker(&'a self,
|
pub fn to_linker(&'a self,
|
||||||
cmd: Command,
|
cmd: Command,
|
||||||
sess: &'a Session) -> Box<Linker+'a> {
|
sess: &'a Session) -> Box<Linker+'a> {
|
||||||
if sess.target.target.options.is_like_msvc {
|
match sess.linker_flavor() {
|
||||||
Box::new(MsvcLinker {
|
LinkerFlavor::Msvc => {
|
||||||
cmd: cmd,
|
Box::new(MsvcLinker {
|
||||||
sess: sess,
|
cmd: cmd,
|
||||||
info: self
|
sess: sess,
|
||||||
}) as Box<Linker>
|
info: self
|
||||||
} else if sess.target.target.options.is_like_emscripten {
|
}) as Box<Linker>
|
||||||
Box::new(EmLinker {
|
}
|
||||||
cmd: cmd,
|
LinkerFlavor::Em => {
|
||||||
sess: sess,
|
Box::new(EmLinker {
|
||||||
info: self
|
cmd: cmd,
|
||||||
}) as Box<Linker>
|
sess: sess,
|
||||||
} else {
|
info: self
|
||||||
Box::new(GnuLinker {
|
}) as Box<Linker>
|
||||||
cmd: cmd,
|
}
|
||||||
sess: sess,
|
LinkerFlavor::Gcc => {
|
||||||
info: self,
|
Box::new(GccLinker {
|
||||||
hinted_static: false,
|
cmd: cmd,
|
||||||
}) as Box<Linker>
|
sess: sess,
|
||||||
|
info: self,
|
||||||
|
hinted_static: false,
|
||||||
|
is_ld: false,
|
||||||
|
}) as Box<Linker>
|
||||||
|
}
|
||||||
|
LinkerFlavor::Ld => {
|
||||||
|
Box::new(GccLinker {
|
||||||
|
cmd: cmd,
|
||||||
|
sess: sess,
|
||||||
|
info: self,
|
||||||
|
hinted_static: false,
|
||||||
|
is_ld: true,
|
||||||
|
}) as Box<Linker>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -100,14 +115,32 @@ pub trait Linker {
|
|||||||
fn finalize(&mut self) -> Command;
|
fn finalize(&mut self) -> Command;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GnuLinker<'a> {
|
pub struct GccLinker<'a> {
|
||||||
cmd: Command,
|
cmd: Command,
|
||||||
sess: &'a Session,
|
sess: &'a Session,
|
||||||
info: &'a LinkerInfo,
|
info: &'a LinkerInfo,
|
||||||
hinted_static: bool, // Keeps track of the current hinting mode.
|
hinted_static: bool, // Keeps track of the current hinting mode.
|
||||||
|
// Link as ld
|
||||||
|
is_ld: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> GnuLinker<'a> {
|
impl<'a> GccLinker<'a> {
|
||||||
|
/// Argument that must be passed *directly* to the linker
|
||||||
|
///
|
||||||
|
/// These arguments need to be prepended with '-Wl,' when a gcc-style linker is used
|
||||||
|
fn linker_arg<S>(&mut self, arg: S) -> &mut Self
|
||||||
|
where S: AsRef<OsStr>
|
||||||
|
{
|
||||||
|
if !self.is_ld {
|
||||||
|
let mut os = OsString::from("-Wl,");
|
||||||
|
os.push(arg.as_ref());
|
||||||
|
self.cmd.arg(os);
|
||||||
|
} else {
|
||||||
|
self.cmd.arg(arg);
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
fn takes_hints(&self) -> bool {
|
fn takes_hints(&self) -> bool {
|
||||||
!self.sess.target.target.options.is_like_osx
|
!self.sess.target.target.options.is_like_osx
|
||||||
}
|
}
|
||||||
@ -119,7 +152,7 @@ impl<'a> GnuLinker<'a> {
|
|||||||
fn hint_static(&mut self) {
|
fn hint_static(&mut self) {
|
||||||
if !self.takes_hints() { return }
|
if !self.takes_hints() { return }
|
||||||
if !self.hinted_static {
|
if !self.hinted_static {
|
||||||
self.cmd.arg("-Wl,-Bstatic");
|
self.linker_arg("-Bstatic");
|
||||||
self.hinted_static = true;
|
self.hinted_static = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,13 +160,13 @@ impl<'a> GnuLinker<'a> {
|
|||||||
fn hint_dynamic(&mut self) {
|
fn hint_dynamic(&mut self) {
|
||||||
if !self.takes_hints() { return }
|
if !self.takes_hints() { return }
|
||||||
if self.hinted_static {
|
if self.hinted_static {
|
||||||
self.cmd.arg("-Wl,-Bdynamic");
|
self.linker_arg("-Bdynamic");
|
||||||
self.hinted_static = false;
|
self.hinted_static = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Linker for GnuLinker<'a> {
|
impl<'a> Linker for GccLinker<'a> {
|
||||||
fn link_dylib(&mut self, lib: &str) { self.hint_dynamic(); self.cmd.arg("-l").arg(lib); }
|
fn link_dylib(&mut self, lib: &str) { self.hint_dynamic(); self.cmd.arg("-l").arg(lib); }
|
||||||
fn link_staticlib(&mut self, lib: &str) { self.hint_static(); self.cmd.arg("-l").arg(lib); }
|
fn link_staticlib(&mut self, lib: &str) { self.hint_static(); self.cmd.arg("-l").arg(lib); }
|
||||||
fn link_rlib(&mut self, lib: &Path) { self.hint_static(); self.cmd.arg(lib); }
|
fn link_rlib(&mut self, lib: &Path) { self.hint_static(); self.cmd.arg(lib); }
|
||||||
@ -164,27 +197,26 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
self.hint_static();
|
self.hint_static();
|
||||||
let target = &self.sess.target.target;
|
let target = &self.sess.target.target;
|
||||||
if !target.options.is_like_osx {
|
if !target.options.is_like_osx {
|
||||||
self.cmd.arg("-Wl,--whole-archive")
|
self.linker_arg("--whole-archive").cmd.arg("-l").arg(lib);
|
||||||
.arg("-l").arg(lib)
|
self.linker_arg("--no-whole-archive");
|
||||||
.arg("-Wl,--no-whole-archive");
|
|
||||||
} else {
|
} else {
|
||||||
// -force_load is the macOS equivalent of --whole-archive, but it
|
// -force_load is the macOS equivalent of --whole-archive, but it
|
||||||
// involves passing the full path to the library to link.
|
// involves passing the full path to the library to link.
|
||||||
let mut v = OsString::from("-Wl,-force_load,");
|
let mut v = OsString::from("-force_load,");
|
||||||
v.push(&archive::find_library(lib, search_path, &self.sess));
|
v.push(&archive::find_library(lib, search_path, &self.sess));
|
||||||
self.cmd.arg(&v);
|
self.linker_arg(&v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn link_whole_rlib(&mut self, lib: &Path) {
|
fn link_whole_rlib(&mut self, lib: &Path) {
|
||||||
self.hint_static();
|
self.hint_static();
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.target.options.is_like_osx {
|
||||||
let mut v = OsString::from("-Wl,-force_load,");
|
let mut v = OsString::from("-force_load,");
|
||||||
v.push(lib);
|
v.push(lib);
|
||||||
self.cmd.arg(&v);
|
self.linker_arg(&v);
|
||||||
} else {
|
} else {
|
||||||
self.cmd.arg("-Wl,--whole-archive").arg(lib)
|
self.linker_arg("--whole-archive").cmd.arg(lib);
|
||||||
.arg("-Wl,--no-whole-archive");
|
self.linker_arg("--no-whole-archive");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,10 +236,10 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
// for partial linking when using multiple codegen units (-r). So we
|
// for partial linking when using multiple codegen units (-r). So we
|
||||||
// insert it here.
|
// insert it here.
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.target.options.is_like_osx {
|
||||||
self.cmd.arg("-Wl,-dead_strip");
|
self.linker_arg("-dead_strip");
|
||||||
} else if self.sess.target.target.options.is_like_solaris {
|
} else if self.sess.target.target.options.is_like_solaris {
|
||||||
self.cmd.arg("-Wl,-z");
|
self.linker_arg("-z");
|
||||||
self.cmd.arg("-Wl,ignore");
|
self.linker_arg("ignore");
|
||||||
|
|
||||||
// If we're building a dylib, we don't use --gc-sections because LLVM
|
// If we're building a dylib, we don't use --gc-sections because LLVM
|
||||||
// has already done the best it can do, and we also don't want to
|
// has already done the best it can do, and we also don't want to
|
||||||
@ -215,7 +247,7 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
// --gc-sections drops the size of hello world from 1.8MB to 597K, a 67%
|
// --gc-sections drops the size of hello world from 1.8MB to 597K, a 67%
|
||||||
// reduction.
|
// reduction.
|
||||||
} else if !keep_metadata {
|
} else if !keep_metadata {
|
||||||
self.cmd.arg("-Wl,--gc-sections");
|
self.linker_arg("--gc-sections");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,7 +258,7 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
// need a numeric argument, but other linkers do.
|
// need a numeric argument, but other linkers do.
|
||||||
if self.sess.opts.optimize == config::OptLevel::Default ||
|
if self.sess.opts.optimize == config::OptLevel::Default ||
|
||||||
self.sess.opts.optimize == config::OptLevel::Aggressive {
|
self.sess.opts.optimize == config::OptLevel::Aggressive {
|
||||||
self.cmd.arg("-Wl,-O1");
|
self.linker_arg("-O1");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,13 +267,16 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn no_default_libraries(&mut self) {
|
fn no_default_libraries(&mut self) {
|
||||||
self.cmd.arg("-nodefaultlibs");
|
if !self.is_ld {
|
||||||
|
self.cmd.arg("-nodefaultlibs");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_dylib(&mut self, out_filename: &Path) {
|
fn build_dylib(&mut self, out_filename: &Path) {
|
||||||
// On mac we need to tell the linker to let this library be rpathed
|
// On mac we need to tell the linker to let this library be rpathed
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.target.options.is_like_osx {
|
||||||
self.cmd.args(&["-dynamiclib", "-Wl,-dylib"]);
|
self.cmd.arg("-dynamiclib");
|
||||||
|
self.linker_arg("-dylib");
|
||||||
|
|
||||||
// Note that the `osx_rpath_install_name` option here is a hack
|
// Note that the `osx_rpath_install_name` option here is a hack
|
||||||
// purely to support rustbuild right now, we should get a more
|
// purely to support rustbuild right now, we should get a more
|
||||||
@ -249,9 +284,9 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
// the right `-Wl,-install_name` with an `@rpath` in it.
|
// the right `-Wl,-install_name` with an `@rpath` in it.
|
||||||
if self.sess.opts.cg.rpath ||
|
if self.sess.opts.cg.rpath ||
|
||||||
self.sess.opts.debugging_opts.osx_rpath_install_name {
|
self.sess.opts.debugging_opts.osx_rpath_install_name {
|
||||||
let mut v = OsString::from("-Wl,-install_name,@rpath/");
|
let mut v = OsString::from("-install_name,@rpath/");
|
||||||
v.push(out_filename.file_name().unwrap());
|
v.push(out_filename.file_name().unwrap());
|
||||||
self.cmd.arg(&v);
|
self.linker_arg(&v);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.cmd.arg("-shared");
|
self.cmd.arg("-shared");
|
||||||
@ -307,11 +342,20 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.target.options.is_like_osx {
|
||||||
arg.push("-Wl,-exported_symbols_list,");
|
if !self.is_ld {
|
||||||
|
arg.push("-Wl,")
|
||||||
|
}
|
||||||
|
arg.push("-exported_symbols_list,");
|
||||||
} else if self.sess.target.target.options.is_like_solaris {
|
} else if self.sess.target.target.options.is_like_solaris {
|
||||||
arg.push("-Wl,-M,");
|
if !self.is_ld {
|
||||||
|
arg.push("-Wl,")
|
||||||
|
}
|
||||||
|
arg.push("-M,");
|
||||||
} else {
|
} else {
|
||||||
arg.push("-Wl,--version-script=");
|
if !self.is_ld {
|
||||||
|
arg.push("-Wl,")
|
||||||
|
}
|
||||||
|
arg.push("--version-script=");
|
||||||
}
|
}
|
||||||
|
|
||||||
arg.push(&path);
|
arg.push(&path);
|
||||||
@ -319,7 +363,7 @@ impl<'a> Linker for GnuLinker<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn subsystem(&mut self, subsystem: &str) {
|
fn subsystem(&mut self, subsystem: &str) {
|
||||||
self.cmd.arg(&format!("-Wl,--subsystem,{}", subsystem));
|
self.cmd.arg(&format!("--subsystem,{}", subsystem));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn finalize(&mut self) -> Command {
|
fn finalize(&mut self) -> Command {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"data-layout": "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128",
|
"data-layout": "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128",
|
||||||
|
"linker-flavor": "gcc",
|
||||||
"llvm-target": "i686-unknown-linux-gnu",
|
"llvm-target": "i686-unknown-linux-gnu",
|
||||||
"target-endian": "little",
|
"target-endian": "little",
|
||||||
"target-pointer-width": "32",
|
"target-pointer-width": "32",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"data-layout": "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32",
|
"data-layout": "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32",
|
||||||
|
"linker-flavor": "gcc",
|
||||||
"target-endian": "little",
|
"target-endian": "little",
|
||||||
"target-pointer-width": "32",
|
"target-pointer-width": "32",
|
||||||
"arch": "x86",
|
"arch": "x86",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"pre-link-args": ["-m64"],
|
"pre-link-args": ["-m64"],
|
||||||
"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",
|
"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",
|
||||||
|
"linker-flavor": "gcc",
|
||||||
"llvm-target": "x86_64-unknown-linux-gnu",
|
"llvm-target": "x86_64-unknown-linux-gnu",
|
||||||
"target-endian": "little",
|
"target-endian": "little",
|
||||||
"target-pointer-width": "64",
|
"target-pointer-width": "64",
|
||||||
|
Loading…
Reference in New Issue
Block a user