Skip to content

Commit bf24f78

Browse files
committed
rename everything
1 parent dee060a commit bf24f78

File tree

1 file changed

+68
-20
lines changed

1 file changed

+68
-20
lines changed

libafl_libfuzzer/build.rs

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
use std::{path::PathBuf, process::Command};
1+
use std::{
2+
fs::File,
3+
io::{BufRead, BufReader, BufWriter, Write},
4+
path::PathBuf,
5+
process::{Command, Stdio},
6+
};
27

38
fn main() {
49
if cfg!(any(feature = "cargo-clippy", docsrs)) {
@@ -83,6 +88,9 @@ fn main() {
8388
let rust_lld = target_libdir.join("../bin/rust-lld");
8489
let rust_ar = target_libdir.join("../bin/llvm-ar"); // NOTE: depends on llvm-tools
8590
let rust_objcopy = target_libdir.join("../bin/llvm-objcopy"); // NOTE: depends on llvm-tools
91+
let nm = "nm"; // NOTE: we use system nm here because llvm-nm doesn't respect the encoding?
92+
93+
let redefined_symbols = custom_lib_dir.join("redefs.txt");
8694

8795
let objfile_orig = custom_lib_dir.join("libFuzzer.o");
8896
let objfile_dest = custom_lib_dir.join("libFuzzer-mimalloc.o");
@@ -100,27 +108,67 @@ fn main() {
100108
"Couldn't link runtime crate! Do you have the llvm-tools component installed?"
101109
);
102110

111+
let mut child = Command::new(nm)
112+
.arg(&objfile_orig)
113+
.stdout(Stdio::piped())
114+
.spawn()
115+
.unwrap();
116+
117+
let mut redefinitions_file = BufWriter::new(File::create(&redefined_symbols).unwrap());
118+
119+
// redefine all the rust-mangled symbols we can
120+
// TODO this will break when v0 mangling is stabilised
121+
for line in BufReader::new(child.stdout.take().unwrap()).lines() {
122+
let line = line.unwrap();
123+
let (_, symbol) = line.rsplit_once(' ').unwrap();
124+
if symbol.starts_with("_ZN") {
125+
writeln!(
126+
redefinitions_file,
127+
"{} {}",
128+
symbol,
129+
symbol.replacen("_ZN", "_ZN26__libafl_libfuzzer_runtime", 1)
130+
)
131+
.unwrap();
132+
}
133+
}
134+
redefinitions_file.flush().unwrap();
135+
drop(redefinitions_file);
136+
137+
assert!(
138+
!child.wait().map(|s| !s.success()).unwrap_or(true),
139+
"Couldn't link runtime crate! Do you have the llvm-tools component installed?"
140+
);
141+
103142
let mut command = Command::new(rust_objcopy);
143+
144+
for symbol in [
145+
"__rust_drop_panic",
146+
"__rust_foreign_exception",
147+
"rust_begin_unwind",
148+
"rust_panic",
149+
"rust_eh_personality",
150+
"__rg_oom",
151+
"__rdl_oom",
152+
"__rdl_alloc",
153+
"__rust_alloc",
154+
"__rdl_dealloc",
155+
"__rust_dealloc",
156+
"__rdl_realloc",
157+
"__rust_realloc",
158+
"__rdl_alloc_zeroed",
159+
"__rust_alloc_zeroed",
160+
"__rust_alloc_error_handler",
161+
"__rust_no_alloc_shim_is_unstable",
162+
"__rust_alloc_error_handler_should_panic",
163+
] {
164+
command
165+
.arg("--redefine-sym")
166+
.arg(format!("{symbol}={symbol}_libafl_libfuzzer_runtime"));
167+
}
168+
104169
command
105-
.args(["--redefine-sym", "__rust_alloc=__rust_alloc_mimalloc"])
106-
.args(["--redefine-sym", "__rust_dealloc=__rust_dealloc_mimalloc"])
107-
.args(["--redefine-sym", "__rust_realloc=__rust_realloc_mimalloc"])
108-
.args([
109-
"--redefine-sym",
110-
"__rust_alloc_zeroed=__rust_alloc_zeroed_mimalloc",
111-
])
112-
.args([
113-
"--redefine-sym",
114-
"__rust_alloc_error_handler=__rust_alloc_error_handler_mimalloc",
115-
])
116-
.args([
117-
"--redefine-sym",
118-
"__rust_no_alloc_shim_is_unstable=__rust_no_alloc_shim_is_unstable_mimalloc",
119-
])
120-
.args([
121-
"--redefine-sym",
122-
"__rust_alloc_error_handler_should_panic=__rust_alloc_error_handler_should_panic_mimalloc",
123-
])
170+
.arg("--redefine-syms")
171+
.arg(redefined_symbols)
124172
.args([&objfile_orig, &objfile_dest]);
125173

126174
assert!(

0 commit comments

Comments
 (0)