Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions packages/cli/src/build/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1693,6 +1693,7 @@ impl BuildRequest {

let rlib_contents = std::fs::read(rlib)?;
let mut reader = ar::Archive::new(std::io::Cursor::new(rlib_contents));
let mut keep_linker_rlib = false;
while let Some(Ok(object_file)) = reader.next_entry() {
let name = std::str::from_utf8(object_file.header().identifier()).unwrap();
if name.ends_with(".rmeta") {
Expand All @@ -1704,24 +1705,30 @@ impl BuildRequest {
}

// rlibs might contain dlls/sos/lib files which we don't want to include
if name.ends_with(".dll")
|| name.ends_with(".so")
|| name.ends_with(".lib")
|| name.ends_with(".dylib")
{
compiler_rlibs.push(rlib.to_owned());
//
// This catches .dylib, .so, .dll, .lib, .o, etc files that are not compatible with
// our "fat archive" linking process.
//
// We only trust `.rcgu.o` files to make it into the --all_load archive.
// This is a temporary stopgap to prevent issues with libraries that generate
// object files that are not compatible with --all_load.
// see https://github.com/DioxusLabs/dioxus/issues/4237
if !(name.ends_with(".rcgu.o") || name.ends_with(".obj")) {
keep_linker_rlib = true;
continue;
}

if !(name.ends_with(".o") || name.ends_with(".obj")) {
tracing::debug!("Unknown object file in rlib: {:?}", name);
}

archive_has_contents = true;
out_ar
.append(&object_file.header().clone(), object_file)
.context("Failed to add object file to archive")?;
}

// Some rlibs contain weird artifacts that we don't want to include in the fat archive.
// However, we still want them around in the linker in case the regular linker can handle them.
if keep_linker_rlib {
compiler_rlibs.push(rlib.clone());
}
}

let bytes = out_ar.into_inner().context("Failed to finalize archive")?;
Expand Down Expand Up @@ -1798,8 +1805,7 @@ impl BuildRequest {
args.push("-Wl,--export-dynamic-symbol,main".to_string());
}
LinkerFlavor::Darwin => {
// `-all_load` is an extra step to ensure that all symbols are loaded (different than force_load)
args.push("-Wl,-all_load".to_string());
args.push("-Wl,-exported_symbol,_main".to_string());
}
LinkerFlavor::Msvc => {
// Prevent alsr from overflowing 32 bits
Expand Down
Loading