summaryrefslogtreecommitdiffstats
path: root/tests/run-make/reproducible-build/linker.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:20:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:20:39 +0000
commit1376c5a617be5c25655d0d7cb63e3beaa5a6e026 (patch)
tree3bb8d61aee02bc7a15eab3f36e3b921afc2075d0 /tests/run-make/reproducible-build/linker.rs
parentReleasing progress-linux version 1.69.0+dfsg1-1~progress7.99u1. (diff)
downloadrustc-1376c5a617be5c25655d0d7cb63e3beaa5a6e026.tar.xz
rustc-1376c5a617be5c25655d0d7cb63e3beaa5a6e026.zip
Merging upstream version 1.70.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/run-make/reproducible-build/linker.rs')
-rw-r--r--tests/run-make/reproducible-build/linker.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/run-make/reproducible-build/linker.rs b/tests/run-make/reproducible-build/linker.rs
new file mode 100644
index 000000000..3dda6f190
--- /dev/null
+++ b/tests/run-make/reproducible-build/linker.rs
@@ -0,0 +1,50 @@
+use std::env;
+use std::path::Path;
+use std::fs::File;
+use std::io::{Read, Write};
+
+fn main() {
+ let mut dst = env::current_exe().unwrap();
+ dst.pop();
+ dst.push("linker-arguments1");
+ if dst.exists() {
+ dst.pop();
+ dst.push("linker-arguments2");
+ assert!(!dst.exists());
+ }
+
+ let mut out = String::new();
+ for arg in env::args().skip(1) {
+ let path = Path::new(&arg);
+ if !path.is_file() {
+ out.push_str(&arg);
+ out.push_str("\n");
+ continue
+ }
+
+ let mut contents = Vec::new();
+ File::open(path).unwrap().read_to_end(&mut contents).unwrap();
+
+ // This file is produced during linking in a temporary directory.
+ let arg = if arg.ends_with("/symbols.o") || arg.ends_with("\\symbols.o") {
+ "symbols.o"
+ } else {
+ &*arg
+ };
+ out.push_str(&format!("{}: {}\n", arg, hash(&contents)));
+ }
+
+ File::create(dst).unwrap().write_all(out.as_bytes()).unwrap();
+}
+
+// fnv hash for now
+fn hash(contents: &[u8]) -> u64 {
+ let mut hash = 0xcbf29ce484222325;
+
+ for byte in contents {
+ hash = hash ^ (*byte as u64);
+ hash = hash.wrapping_mul(0x100000001b3);
+ }
+
+ hash
+}