Skip to content

Commit b01f641

Browse files
committed
Check for presence of .ctors
1 parent 7cba23e commit b01f641

File tree

1 file changed

+11
-76
lines changed
  • compiler/rustc_codegen_ssa/src/back

1 file changed

+11
-76
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 11 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::io::{BufWriter, Write};
55
use std::ops::{ControlFlow, Deref};
66
use std::path::{Path, PathBuf};
77
use std::process::{ExitStatus, Output, Stdio};
8+
use std::time::Instant;
89
use std::{env, fmt, fs, io, mem, str};
910

1011
use cc::windows_registry;
@@ -785,70 +786,6 @@ fn link_natively(
785786
should_archive.then(|| tmpdir.join(out_filename.file_name().unwrap()).with_extension("so"));
786787
let temp_filename = archive_member.as_deref().unwrap_or(out_filename);
787788

788-
// Gather library search paths (-L)
789-
let mut library_search_dirs = vec![];
790-
walk_native_lib_search_dirs(sess, self_contained_components, None, |dir, is_framework| {
791-
if !is_framework {
792-
library_search_dirs.push(dir.to_path_buf());
793-
}
794-
ControlFlow::<()>::Continue(())
795-
});
796-
797-
// Find candidate objects to link
798-
let mut obj_candidates = vec![];
799-
800-
// Rust objects
801-
for module in &codegen_results.modules {
802-
if let Some(ref path) = module.object {
803-
obj_candidates.push(path.clone());
804-
}
805-
}
806-
807-
// eprintln!("Library dirs: {:?}", library_search_dirs);
808-
// Native libraries
809-
for native_lib in codegen_results.crate_info.native_libraries.values().flatten() {
810-
// eprintln!("native lib {}", native_lib.name);
811-
if let Some(ref path) = native_lib.filename {
812-
// eprintln!(" located at {path:?}");
813-
obj_candidates.push(PathBuf::from(path.to_string()));
814-
} else {
815-
// Try to find the library
816-
let name = native_lib.name.to_string();
817-
let candidates = &[format!("lib{name}.a"), format!("lib{name}.so")];
818-
for candidate in candidates {
819-
// eprintln!("Finding candidate {candidate}");
820-
for lib_dir in &library_search_dirs {
821-
let candidate_path = lib_dir.join(candidate);
822-
if candidate_path.is_file() {
823-
// eprintln!("Found native library at {candidate_path:?}");
824-
obj_candidates.push(candidate_path);
825-
}
826-
}
827-
}
828-
}
829-
}
830-
831-
use object::read::Object;
832-
833-
// Scan native libraries, sources of .ctors/.dtors
834-
let mut problematic_objects = vec![];
835-
let sections = &[".ctors", ".dtors"];
836-
for path in obj_candidates {
837-
match std::process::Command::new("readelf").arg("-S").arg(&path).output() {
838-
Ok(output) => {
839-
let stdout = String::from_utf8_lossy(&output.stdout);
840-
for section in sections {
841-
if stdout.lines().any(|line| line.contains(section)) {
842-
problematic_objects.push((path.clone(), section.to_string()));
843-
}
844-
}
845-
}
846-
Err(error) => {
847-
eprintln!("Cannot run readelf -S: {error:?}")
848-
}
849-
}
850-
}
851-
852789
let mut cmd = linker_with_args(
853790
&linker_path,
854791
flavor,
@@ -1055,20 +992,18 @@ fn link_natively(
1055992
}
1056993

1057994
// Scan the built artifact, lld might keep .ctors/.dtors in it
1058-
if let Ok(data) = std::fs::read(&temp_filename) {
1059-
if let Ok(file) = object::read::File::parse(data.as_slice()) {
1060-
for section_name in sections {
1061-
if let Some(_section) = file.section_by_name(section_name) {
1062-
problematic_objects
1063-
.push((temp_filename.to_path_buf(), section_name.to_string()));
1064-
}
1065-
}
995+
use object::read::Object;
996+
use rustc_data_structures::memmap::Mmap;
997+
998+
let start = Instant::now();
999+
let file = std::fs::File::open(&temp_filename).unwrap();
1000+
let mmap = unsafe { Mmap::map(file).unwrap() };
1001+
if let Ok(file) = object::read::File::parse(mmap.as_ref()) {
1002+
if let Some(_section) = file.section_by_name(".ctors") {
1003+
eprintln!(".ctors found!");
10661004
}
10671005
}
1068-
if !problematic_objects.is_empty() {
1069-
eprintln!("PROBLEMATIC OBJECtS\n{problematic_objects:?}");
1070-
panic!("{problematic_objects:?}");
1071-
}
1006+
eprintln!("{}s", start.elapsed().as_secs_f64());
10721007

10731008
match prog {
10741009
Ok(prog) => {

0 commit comments

Comments
 (0)