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