Skip to content

Commit 390ea2a

Browse files
committed
Prefix our own symbols we build
1 parent aa88913 commit 390ea2a

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

backtrace-sys/build.rs

+31-5
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@ extern crate gcc;
22

33
use std::env;
44
use std::ffi::OsString;
5+
use std::fs;
56
use std::path::PathBuf;
67
use std::process::Command;
78

9+
macro_rules! t {
10+
($e:expr) => (match $e {
11+
Ok(e) => e,
12+
Err(e) => panic!("{} failed with {}", stringify!($e), e),
13+
})
14+
}
15+
816
fn main() {
917
let src = env::current_dir().unwrap();
1018
let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap());
@@ -21,11 +29,6 @@ fn main() {
2129
return
2230
}
2331

24-
// libbacktrace is already included in the linux libstd for rust
25-
if target.contains("linux") {
26-
return
27-
}
28-
2932
// no way this will ever compile for emscripten
3033
if target.contains("emscripten") {
3134
return
@@ -56,6 +59,29 @@ fn main() {
5659
src.join("src/libbacktrace").display())));
5760
println!("cargo:rustc-link-search=native={}/.libs", dst.display());
5861
println!("cargo:rustc-link-lib=static=backtrace");
62+
63+
// The standard library currently bundles in libbacktrace, but it's
64+
// compiled with hidden visibility (naturally) so we can't use it.
65+
//
66+
// To prevent conflicts with a second statically linked copy we rename all
67+
// symbols with a '__rbt_' prefix manually here through `objcopy`.
68+
let lib = dst.join(".libs/libbacktrace.a");
69+
let tmpdir = dst.join("__tmp");
70+
drop(fs::remove_dir_all(&tmpdir));
71+
t!(fs::create_dir_all(&tmpdir));
72+
run(Command::new("ar").arg("x").arg(&lib).current_dir(&tmpdir));
73+
74+
t!(fs::remove_file(&lib));
75+
let mut objs = Vec::new();
76+
for obj in t!(tmpdir.read_dir()) {
77+
let obj = t!(obj);
78+
run(Command::new("objcopy")
79+
.arg("--redefine-syms=symbol-map")
80+
.arg(obj.path()));
81+
objs.push(obj.path());
82+
}
83+
84+
run(Command::new("ar").arg("crus").arg(&lib).args(&objs));
5985
}
6086

6187
fn run(cmd: &mut Command) {

backtrace-sys/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,18 @@ pub type backtrace_error_callback =
2424
pub enum backtrace_state {}
2525

2626
extern {
27+
#[link_name = "__rbt_backtrace_create_state"]
2728
pub fn backtrace_create_state(filename: *const c_char,
2829
threaded: c_int,
2930
error: backtrace_error_callback,
3031
data: *mut c_void) -> *mut backtrace_state;
32+
#[link_name = "__rbt_backtrace_syminfo"]
3133
pub fn backtrace_syminfo(state: *mut backtrace_state,
3234
addr: uintptr_t,
3335
cb: backtrace_syminfo_callback,
3436
error: backtrace_error_callback,
3537
data: *mut c_void) -> c_int;
38+
#[link_name = "__rbt_backtrace_pcinfo"]
3639
pub fn backtrace_pcinfo(state: *mut backtrace_state,
3740
addr: uintptr_t,
3841
cb: backtrace_full_callback,

backtrace-sys/symbol-map

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
backtrace_full __rbt_backtrace_full
2+
backtrace_dwarf_add __rbt_backtrace_dwarf_add
3+
backtrace_initialize __rbt_backtrace_initialize
4+
backtrace_pcinfo __rbt_backtrace_pcinfo
5+
backtrace_syminfo __rbt_backtrace_syminfo
6+
backtrace_get_view __rbt_backtrace_get_view
7+
backtrace_release_view __rbt_backtrace_release_view
8+
backtrace_alloc __rbt_backtrace_alloc
9+
backtrace_free __rbt_backtrace_free
10+
backtrace_vector_finish __rbt_backtrace_vector_finish
11+
backtrace_vector_grow __rbt_backtrace_vector_grow
12+
backtrace_vector_release __rbt_backtrace_vector_release
13+
backtrace_close __rbt_backtrace_close
14+
backtrace_open __rbt_backtrace_open
15+
backtrace_print __rbt_backtrace_print
16+
backtrace_simple __rbt_backtrace_simple
17+
backtrace_qsort __rbt_backtrace_qsort
18+
backtrace_create_state __rbt_backtrace_create_state

0 commit comments

Comments
 (0)