makeInitrdNG: Strip more and remove output

This strips all elf files as far as possible and removes a lot of
unnecessary output. Also wrap in the binaries instead of relying on
$PATH.
This commit is contained in:
Janne Heß 2022-05-01 14:56:58 +02:00
parent 5b47056b7d
commit e5995b2235
No known key found for this signature in database
GPG Key ID: 69165158F05265DF
3 changed files with 25 additions and 10 deletions

View File

@ -1,4 +1,4 @@
{ rustPlatform }:
{ rustPlatform, lib, makeWrapper, patchelf, glibc, binutils }:
rustPlatform.buildRustPackage {
pname = "make-initrd-ng";
@ -6,4 +6,11 @@ rustPlatform.buildRustPackage {
src = ./make-initrd-ng;
cargoLock.lockFile = ./make-initrd-ng/Cargo.lock;
nativeBuildInputs = [ makeWrapper ];
postInstall = ''
wrapProgram $out/bin/make-initrd-ng \
--prefix PATH : ${lib.makeBinPath [ patchelf glibc binutils ]}
'';
}

View File

@ -8,7 +8,7 @@ let
# compression type and filename extension.
compressorName = fullCommand: builtins.elemAt (builtins.match "([^ ]*/)?([^ ]+).*" fullCommand) 1;
in
{ stdenvNoCC, perl, cpio, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, patchelf, runCommand, glibc
{ stdenvNoCC, perl, cpio, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, patchelf, runCommand
# Name of the derivation (not of the resulting file!)
, name ? "initrd"
@ -72,7 +72,7 @@ in
passAsFile = ["contents"];
contents = lib.concatMapStringsSep "\n" ({ object, symlink, ... }: "${object}\n${if symlink == null then "" else symlink}") contents + "\n";
nativeBuildInputs = [makeInitrdNGTool patchelf glibc cpio] ++ lib.optional makeUInitrd ubootTools;
nativeBuildInputs = [makeInitrdNGTool patchelf cpio] ++ lib.optional makeUInitrd ubootTools;
} ''
mkdir ./root
make-initrd-ng "$contentsPath" ./root

View File

@ -6,7 +6,7 @@ use std::hash::Hash;
use std::io::{BufReader, BufRead, Error, ErrorKind};
use std::os::unix;
use std::path::{Component, Path, PathBuf};
use std::process::{Command, Stdio};
use std::process::Command;
struct NonRepeatingQueue<T> {
queue: VecDeque<T>,
@ -42,7 +42,6 @@ fn patch_elf<S: AsRef<OsStr>, P: AsRef<OsStr>>(mode: S, path: P) -> Result<Strin
let output = Command::new("patchelf")
.arg(&mode)
.arg(&path)
.stderr(Stdio::inherit())
.output()?;
if output.status.success() {
Ok(String::from_utf8(output.stdout).expect("Failed to parse output"))
@ -51,16 +50,15 @@ fn patch_elf<S: AsRef<OsStr>, P: AsRef<OsStr>>(mode: S, path: P) -> Result<Strin
}
}
fn copy_file<P: AsRef<Path> + AsRef<OsStr>, S: AsRef<Path>>(
fn copy_file<P: AsRef<Path> + AsRef<OsStr>, S: AsRef<Path> + AsRef<OsStr>>(
source: P,
target: S,
queue: &mut NonRepeatingQueue<Box<Path>>,
) -> Result<(), Error> {
fs::copy(&source, target)?;
fs::copy(&source, &target)?;
if !Command::new("ldd").arg(&source).output()?.status.success() {
//stdout(Stdio::inherit()).stderr(Stdio::inherit()).
println!("{:?} is not dynamically linked. Not recursing.", OsStr::new(&source));
// Not dynamically linked - no need to recurse
return Ok(());
}
@ -91,6 +89,17 @@ fn copy_file<P: AsRef<Path> + AsRef<OsStr>, S: AsRef<Path>>(
}
}
// Make file writable to strip it
let mut permissions = fs::metadata(&target)?.permissions();
permissions.set_readonly(false);
fs::set_permissions(&target, permissions)?;
// Strip further than normal
if !Command::new("strip").arg("--strip-all").arg(OsStr::new(&target)).output()?.status.success() {
println!("{:?} was not successfully stripped.", OsStr::new(&target));
}
Ok(())
}
@ -200,7 +209,6 @@ fn main() -> Result<(), Error> {
}
}
while let Some(obj) = queue.pop_front() {
println!("{:?}", obj);
handle_path(out_path, &*obj, &mut queue)?;
}