mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-25 08:23:09 +00:00
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:
parent
5b47056b7d
commit
e5995b2235
@ -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 ]}
|
||||
'';
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)?;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user