Skip to content

Commit

Permalink
Add build script to extract a list of registered syscalls
Browse files Browse the repository at this point in the history
The list is used in cargo-build-bpf to check generated .so modules for
undefined symbols that are not known run-time syscalls.
  • Loading branch information
dmakarov committed Jun 14, 2021
1 parent 76bb403 commit 32742df
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 26 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions programs/bpf/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions programs/bpf_loader/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ homepage = "https://solana.com/"
documentation = "https://docs.rs/solana-bpf-loader-program"
edition = "2018"

[build-dependencies]
regex = "1.5.4"

[dependencies]
bincode = "1.3.1"
byteorder = "1.3.4"
Expand Down
34 changes: 34 additions & 0 deletions programs/bpf_loader/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
use regex::Regex;
use std::{
fs::File,
io::{prelude::*, BufWriter, Read},
path::PathBuf,
process::exit,
str,
};

/**
* Extract a list of registered syscall names and save it in a file
* for distribution with the SDK. This file is read by cargo-build-bpf
* to verify undefined symbols in a .so module that cargo-build-bpf has built.
*/
fn main() {
let path = PathBuf::from("src/syscalls.rs");
let mut file = match File::open(&path) {
Ok(x) => x,
_ => exit(1),
};
let mut text = vec![];
file.read_to_end(&mut text).unwrap();
let text = str::from_utf8(&text).unwrap();
let path = PathBuf::from("../../sdk/bpf/syscalls.txt");
let file = match File::create(&path) {
Ok(x) => x,
_ => exit(1),
};
let mut out = BufWriter::new(file);
let sysc_re = Regex::new(r#"register_syscall_by_name\([[:space:]]*b"([^"]+)","#).unwrap();
for caps in sysc_re.captures_iter(&text) {
writeln!(out, "{}", caps[1].to_string()).unwrap();
}
}
1 change: 1 addition & 0 deletions sdk/bpf/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
/dependencies/bin*
/dependencies/.crates.toml
/dependencies/.crates2.json
/syscalls.txt
37 changes: 11 additions & 26 deletions sdk/cargo-build-bpf/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,32 +250,17 @@ fn postprocess_dump(program_dump: &Path) {
// Check whether the built .so file contains undefined symbols that are
// not known to the runtime and warn about them if any.
fn check_undefined_symbols(config: &Config, program: &Path) {
let syscalls: HashSet<String> = [
"abort",
"sol_panic_",
"sol_log_",
"sol_log_64_",
"sol_log_compute_units_",
"sol_log_pubkey",
"sol_create_program_address",
"sol_try_find_program_address",
"sol_sha256",
"sol_keccak256",
"sol_get_clock_sysvar",
"sol_get_epoch_schedule_sysvar",
"sol_get_fees_sysvar",
"sol_get_rent_sysvar",
"sol_memcpy_",
"sol_memmove_",
"sol_memcmp_",
"sol_memset_",
"sol_invoke_signed_c",
"sol_invoke_signed_rust",
"sol_alloc_free_",
]
.iter()
.map(|&symbol| symbol.to_owned())
.collect();
let syscalls_txt = config.bpf_sdk.join("syscalls.txt");
let file = match File::open(syscalls_txt) {
Ok(x) => x,
_ => return,
};
let mut syscalls = HashSet::new();
for line_result in BufReader::new(file).lines() {
let line = line_result.unwrap();
let line = line.trim_end();
syscalls.insert(line.to_string());
}
let entry =
Regex::new(r"^ *[0-9]+: [0-9a-f]{16} +[0-9a-f]+ +NOTYPE +GLOBAL +DEFAULT +UND +(.+)")
.unwrap();
Expand Down

0 comments on commit 32742df

Please sign in to comment.