@@ -26,24 +26,18 @@ fn main() {
26
26
process:: exit ( 1 ) ;
27
27
}
28
28
} ) ;
29
+ let kernel_file_name = kernel
30
+ . file_name ( )
31
+ . expect ( "KERNEL has no valid file name" )
32
+ . to_str ( )
33
+ . expect ( "kernel file name not valid utf8" ) ;
29
34
30
35
// check that the kernel file exists
31
36
assert ! (
32
37
kernel. exists( ) ,
33
38
format!( "KERNEL does not exist: {}" , kernel. display( ) )
34
39
) ;
35
40
36
- let kernel_file_name = kernel
37
- . file_name ( )
38
- . expect ( "KERNEL has no valid file name" )
39
- . to_str ( )
40
- . expect ( "kernel file name not valid utf8" ) ;
41
- let kernel_stripped_file_name = format ! ( "kernel_stripped-{}" , kernel_file_name) ;
42
- let kernel_stripped_file_name_replaced = kernel_stripped_file_name. replace ( '-' , "_" ) ;
43
- let kernel_stripped_out_path = out_dir. join ( & kernel_stripped_file_name) ;
44
- let kernel_out_path = out_dir. join ( format ! ( "kernel_bin-{}.o" , kernel_file_name) ) ;
45
- let kernel_archive_path = out_dir. join ( format ! ( "libkernel_bin-{}.a" , kernel_file_name) ) ;
46
-
47
41
// get access to llvm tools shipped in the llvm-tools-preview rustup component
48
42
let llvm_tools = match llvm_tools:: LlvmTools :: new ( ) {
49
43
Ok ( tools) => tools,
@@ -77,40 +71,47 @@ fn main() {
77
71
}
78
72
79
73
// strip debug symbols from kernel for faster loading
74
+ let stripped_kernel_file_name = format ! ( "kernel_stripped-{}" , kernel_file_name) ;
75
+ let stripped_kernel = out_dir. join ( & stripped_kernel_file_name) ;
80
76
let objcopy = llvm_tools
81
77
. tool ( & llvm_tools:: exe ( "llvm-objcopy" ) )
82
78
. expect ( "llvm-objcopy not found in llvm-tools" ) ;
83
79
let mut cmd = Command :: new ( & objcopy) ;
84
80
cmd. arg ( "--strip-debug" ) ;
85
81
cmd. arg ( & kernel) ;
86
- cmd. arg ( & kernel_stripped_out_path) ;
87
- let exit_status = cmd. status ( ) . expect ( "failed to run objcopy to strip debug symbols" ) ;
82
+ cmd. arg ( & stripped_kernel) ;
83
+ let exit_status = cmd
84
+ . status ( )
85
+ . expect ( "failed to run objcopy to strip debug symbols" ) ;
88
86
if !exit_status. success ( ) {
89
87
eprintln ! ( "Error: Stripping debug symbols failed" ) ;
90
88
process:: exit ( 1 ) ;
91
89
}
92
90
93
91
// wrap the kernel executable as binary in a new ELF file
92
+ let stripped_kernel_file_name_replaced = stripped_kernel_file_name. replace ( '-' , "_" ) ;
93
+ let kernel_bin = out_dir. join ( format ! ( "kernel_bin-{}.o" , kernel_file_name) ) ;
94
+ let kernel_archive = out_dir. join ( format ! ( "libkernel_bin-{}.a" , kernel_file_name) ) ;
94
95
let mut cmd = Command :: new ( & objcopy) ;
95
96
cmd. arg ( "-I" ) . arg ( "binary" ) ;
96
97
cmd. arg ( "-O" ) . arg ( "elf64-x86-64" ) ;
97
98
cmd. arg ( "--binary-architecture=i386:x86-64" ) ;
98
99
cmd. arg ( "--rename-section" ) . arg ( ".data=.kernel" ) ;
99
100
cmd. arg ( "--redefine-sym" ) . arg ( format ! (
100
101
"_binary_{}_start=_kernel_start_addr" ,
101
- kernel_stripped_file_name_replaced
102
+ stripped_kernel_file_name_replaced
102
103
) ) ;
103
104
cmd. arg ( "--redefine-sym" ) . arg ( format ! (
104
105
"_binary_{}_end=_kernel_end_addr" ,
105
- kernel_stripped_file_name_replaced
106
+ stripped_kernel_file_name_replaced
106
107
) ) ;
107
108
cmd. arg ( "--redefine-sym" ) . arg ( format ! (
108
109
"_binary_{}_size=_kernel_size" ,
109
- kernel_stripped_file_name_replaced
110
+ stripped_kernel_file_name_replaced
110
111
) ) ;
111
112
cmd. current_dir ( & out_dir) ;
112
- cmd. arg ( & kernel_stripped_file_name ) ;
113
- cmd. arg ( & kernel_out_path ) ;
113
+ cmd. arg ( & stripped_kernel_file_name ) ;
114
+ cmd. arg ( & kernel_bin ) ;
114
115
let exit_status = cmd. status ( ) . expect ( "failed to run objcopy" ) ;
115
116
if !exit_status. success ( ) {
116
117
eprintln ! ( "Error: Running objcopy failed" ) ;
@@ -128,8 +129,8 @@ fn main() {
128
129
} ) ;
129
130
let mut cmd = Command :: new ( ar) ;
130
131
cmd. arg ( "crs" ) ;
131
- cmd. arg ( & kernel_archive_path ) ;
132
- cmd. arg ( & kernel_out_path ) ;
132
+ cmd. arg ( & kernel_archive ) ;
133
+ cmd. arg ( & kernel_bin ) ;
133
134
let exit_status = cmd. status ( ) . expect ( "failed to run ar" ) ;
134
135
if !exit_status. success ( ) {
135
136
eprintln ! ( "Error: Running ar failed" ) ;
0 commit comments