From ce1b7dd4fb5ca5312256ee8e76a5cfa2f977fb2b Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 1 Oct 2020 00:03:03 +0800 Subject: [PATCH] feat: add greet-rs --- .gitignore | 1 + live-reload-rust/greet-rs/Cargo.lock | 5 +++++ live-reload-rust/greet-rs/Cargo.toml | 9 +++++++++ live-reload-rust/greet-rs/README.md | 11 +++++++++++ live-reload-rust/greet-rs/build.rs | 10 ++++++++++ live-reload-rust/greet-rs/src/main.rs | 14 ++++++++++++++ live-reload-rust/greet.c-compile-shared.sh | 1 + live-reload-rust/load-shared.c | 21 +++++++++++++++++++++ 8 files changed, 72 insertions(+) create mode 100644 live-reload-rust/greet-rs/Cargo.lock create mode 100644 live-reload-rust/greet-rs/Cargo.toml create mode 100644 live-reload-rust/greet-rs/README.md create mode 100644 live-reload-rust/greet-rs/build.rs create mode 100644 live-reload-rust/greet-rs/src/main.rs create mode 100755 live-reload-rust/greet.c-compile-shared.sh create mode 100644 live-reload-rust/load-shared.c diff --git a/.gitignore b/.gitignore index 7de617d..49551f8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ target/ wasm/pkg/ node_modules/ *.o +*.so # These are backup files generated by rustfmt **/*.rs.bk diff --git a/live-reload-rust/greet-rs/Cargo.lock b/live-reload-rust/greet-rs/Cargo.lock new file mode 100644 index 0000000..3cae304 --- /dev/null +++ b/live-reload-rust/greet-rs/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "greet-rs" +version = "0.1.0" diff --git a/live-reload-rust/greet-rs/Cargo.toml b/live-reload-rust/greet-rs/Cargo.toml new file mode 100644 index 0000000..1168e22 --- /dev/null +++ b/live-reload-rust/greet-rs/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "greet-rs" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/live-reload-rust/greet-rs/README.md b/live-reload-rust/greet-rs/README.md new file mode 100644 index 0000000..d21476d --- /dev/null +++ b/live-reload-rust/greet-rs/README.md @@ -0,0 +1,11 @@ +build libgreet.so + + +direct build or use build.rs: +RUSTFLAGS="-L ${PWD}/.." cargo build + + +run: +LD_LIBRARY_PATH="${PWD}/.." ./target/debug/greet-rs + + diff --git a/live-reload-rust/greet-rs/build.rs b/live-reload-rust/greet-rs/build.rs new file mode 100644 index 0000000..78eca7d --- /dev/null +++ b/live-reload-rust/greet-rs/build.rs @@ -0,0 +1,10 @@ +use std::path::PathBuf; + +fn main() { + let manifest_dir = + PathBuf::from(std::env::var_os("CARGO_MANIFEST_DIR").expect("manifest dir should be set")); + let lib_dir = manifest_dir + .parent() + .expect("manifest dir should have a parent"); + println!("cargo:rustc-link-search={}", lib_dir.display()); +} diff --git a/live-reload-rust/greet-rs/src/main.rs b/live-reload-rust/greet-rs/src/main.rs new file mode 100644 index 0000000..d2d9bca --- /dev/null +++ b/live-reload-rust/greet-rs/src/main.rs @@ -0,0 +1,14 @@ +use std::{ffi::CString, os::raw::c_char}; + +#[link(name = "greet")] +extern "C" { + fn greet(name: *const c_char); +} + +fn main() { + let name = CString::new("fresh coffee").unwrap(); + unsafe { + greet(name.as_ptr()); + } +} + diff --git a/live-reload-rust/greet.c-compile-shared.sh b/live-reload-rust/greet.c-compile-shared.sh new file mode 100755 index 0000000..f929d37 --- /dev/null +++ b/live-reload-rust/greet.c-compile-shared.sh @@ -0,0 +1 @@ +gcc -Wall -shared greet.c -o libgreet.so diff --git a/live-reload-rust/load-shared.c b/live-reload-rust/load-shared.c new file mode 100644 index 0000000..d00f30f --- /dev/null +++ b/live-reload-rust/load-shared.c @@ -0,0 +1,21 @@ +#include +#include + +typedef void (*greet_t)(const char *name); + +int main(void) { + // this was `./libmain.so` + void *lib = dlopen("./libgreet.so", RTLD_LAZY); + if (!lib) { + fprintf(stderr, "failed to load library\n"); + return 1; + } + greet_t greet = (greet_t) dlsym(lib, "greet"); + if (!lib) { + fprintf(stderr, "could not look up symbol 'greet'\n"); + return 1; + } + greet("venus"); + dlclose(lib); + return 0; +}