Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Don't use GCC's startup objects (crtbegin.o/crtend.o); build and use …
…our own (for now on for -windows-gnu target only). Since it isn't possible to disable linkage of just GCC startup objects, we now need logic for finding libc installation directory and copying the required startup files (e.g. crt2.o) to rustlib directory. Bonus change: use the `-nodefaultlibs` flag on Windows, thus paving the way to direct linker invocation.
- Loading branch information
Showing
12 changed files
with
217 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
#![feature(no_std)] | ||
#![feature(linkage)] | ||
|
||
#![crate_type="rlib"] | ||
#![no_std] | ||
#![allow(non_camel_case_types)] | ||
|
||
#[cfg(all(target_os="windows", target_arch = "x86", target_env="gnu"))] | ||
pub mod eh_frames | ||
{ | ||
#[no_mangle] | ||
#[link_section = ".eh_frame"] | ||
pub static __EH_FRAME_BEGIN__: [u8; 0] = []; | ||
|
||
// Scratch space for unwinder's internal book-keeping. | ||
// This is defined as `struct object` in $GCC/libgcc/unwind-dw2-fde.h. | ||
static mut obj: [isize; 6] = [0; 6]; | ||
|
||
extern { | ||
fn rust_eh_register_frames(eh_frame_begin: *const u8, object: *mut u8); | ||
fn rust_eh_unregister_frames(eh_frame_begin: *const u8, object: *mut u8); | ||
} | ||
|
||
unsafe fn init() { | ||
rust_eh_register_frames(&__EH_FRAME_BEGIN__ as *const u8, | ||
&mut obj as *mut _ as *mut u8); | ||
} | ||
|
||
unsafe fn uninit() { | ||
rust_eh_unregister_frames(&__EH_FRAME_BEGIN__ as *const u8, | ||
&mut obj as *mut _ as *mut u8); | ||
} | ||
|
||
pub mod ms_init | ||
{ | ||
// .CRT$X?? sections are roughly analogous to ELF's .init_array and .fini_array, | ||
// except that they exploit the fact that linker will sort them alphabitically, | ||
// so e.g. sections with names between .CRT$XIA and .CRT$XIZ are guaranteed to be | ||
// placed between those two, without requiring any ordering of objects on the linker | ||
// command line. | ||
// Note that ordering of same-named sections from different objects is not guaranteed. | ||
// Since .CRT$XIA contains init array's header symbol, which must always come first, | ||
// we place our initialization callback into .CRT$XIB. | ||
|
||
#[link_section = ".CRT$XIB"] // .CRT$XI? : C initialization callbacks | ||
pub static P_INIT: unsafe fn() = super::init; | ||
|
||
#[link_section = ".CRT$XTY"] // .CRT$XT? : C termination callbacks | ||
pub static P_UNINIT: unsafe fn() = super::uninit; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
#![feature(no_std)] | ||
|
||
#![crate_type="rlib"] | ||
#![no_std] | ||
|
||
#[cfg(all(target_os="windows", target_arch = "x86", target_env="gnu"))] | ||
pub mod eh_frames | ||
{ | ||
// Terminate the frame unwind info section with a 0 as a sentinel; | ||
// this would be the 'length' field in a real FDE. | ||
#[no_mangle] | ||
#[link_section = ".eh_frame"] | ||
pub static __EH_FRAME_END__: u32 = 0; | ||
} |