link in the prelude object
This commit is contained in:
1 parent
559a4275ba
commit
e20030fbc3
4 files changed
+60
-19
No files matched your search
+6
-1
@@ -1,7 +1,12 @@
|
||||
%include "defines.s"
|
||||
|
||||
[org BOOT1_LOADPOINT]
|
||||
[bits 16]
|
||||
|
||||
section .prelude
|
||||
|
||||
extern boot1_bin_len
|
||||
|
||||
global prelude
|
||||
prelude:
|
||||
hlt
|
||||
dd boot1_bin_len
|
||||
+17
-10
@@ -20,24 +20,31 @@ fn main() {
|
||||
}
|
||||
|
||||
fn emit_link_args() {
|
||||
println!("cargo::rustc-link-arg=-Tlink.ld");
|
||||
let linker_script_path = "link.ld";
|
||||
println!("cargo::rustc-link-arg=-T{}", linker_script_path);
|
||||
rerun_if_changed(linker_script_path.as_ref());
|
||||
}
|
||||
|
||||
fn rerun_if_changed(path: &Path) {
|
||||
if let Some(path_str) = path.to_str() {
|
||||
println!("cargo::rerun-if-changed={}", path_str);
|
||||
}
|
||||
else {
|
||||
eprintln!("invalid unicode file path");
|
||||
}
|
||||
let path_str = path.to_str()
|
||||
.expect("expected path to be valid utf8");
|
||||
println!("cargo::rerun-if-changed={}", path_str);
|
||||
}
|
||||
|
||||
fn link_obj(path: &Path) {
|
||||
let path_str = path.to_str()
|
||||
.expect("expected path to be valid utf8");
|
||||
println!("cargo::rustc-link-arg={}", path_str);
|
||||
}
|
||||
|
||||
fn build_asm(nasm: &Nasm, out_dir: &Path) {
|
||||
let prelude_obj_path = out_dir.join("prelude.o");
|
||||
nasm.assemble(
|
||||
&out_dir.join("prelude.bin"),
|
||||
&prelude_obj_path,
|
||||
&["asm/prelude.s".as_ref()],
|
||||
&["../include".as_ref()],
|
||||
).unwrap();
|
||||
link_obj(&prelude_obj_path);
|
||||
}
|
||||
|
||||
struct Nasm {
|
||||
@@ -57,9 +64,9 @@ impl Nasm {
|
||||
|
||||
let mut cmd = Command::new(&self.bin_path);
|
||||
cmd
|
||||
.arg("-Werror")
|
||||
.arg("-f")
|
||||
.arg("bin")
|
||||
.arg("-Werror");
|
||||
.arg("elf");
|
||||
|
||||
for include in includes {
|
||||
let mut buf = OsString::new();
|
||||
|
||||
+31
-7
@@ -1,10 +1,34 @@
|
||||
OUTPUT_FORMAT("binary")
|
||||
. = 0x9000;
|
||||
|
||||
. = 0x8200;
|
||||
|
||||
SECTIONS {
|
||||
.text : { *(.text); *(.text.*) }
|
||||
.data : { *(.data); *(.data.*) }
|
||||
.bss : { *(.bss); *(.bss.*) }
|
||||
.rodata : { *(.rodata); *(.rodata.*) }
|
||||
.prelude : {
|
||||
*(.prelude)
|
||||
}
|
||||
|
||||
.text : {
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
}
|
||||
|
||||
.data : {
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
}
|
||||
|
||||
.bss : {
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
}
|
||||
|
||||
.rodata : {
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
}
|
||||
|
||||
/* Define a symbol for the total length of the binary, so the prelude knows how many blocks to
|
||||
* load from disk.
|
||||
*/
|
||||
boot1_bin_len = . - 0x8200;
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -10,6 +10,10 @@ const VGA_ADDR: usize = 0xb8000;
|
||||
|
||||
const STR: &[u8] = b"the quick brown fox jumps over the lazy dog";
|
||||
|
||||
extern "C" {
|
||||
fn prelude() -> !;
|
||||
}
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(_info: &PanicInfo) -> ! {
|
||||
hlt()
|
||||
@@ -43,7 +47,8 @@ pub extern "C" fn _start() -> ! {
|
||||
|
||||
vga_buf[0] = 0x1f02; //smiley
|
||||
|
||||
hlt()
|
||||
// hlt()
|
||||
unsafe { prelude() };
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
||||
Reference in new issue
Block a user