pijul nest
guest [sign in]

Elfedit: edit to file

pmeunier
May 3, 2025, 11:19 AM
Z43EQIWNBMXB4VUXQGLJWFGVO6ZJNRL5I7HRY2622LQVYBBTUHAAC

Dependencies

  • [2] ZV57M4VN Debugging
  • [3] 5PJAXSZ7 Elfedit: correct reallocation of dynstr/dynamic
  • [4] AR2X3TLA Initial commit: introducing elfedit

Change contents

  • edit in elfedit/src/lib.rs at line 943
    [3.20577][3.20577:20578]()
  • replacement in elfedit/src/lib.rs at line 1031
    [3.6503][2.2071:2212]()
    (sh.offset(id) as usize,
    sh.size(id) as usize,
    sh.type_(id),
    p_ as isize)
    [3.6503]
    [3.6579]
    (
    sh.offset(id) as usize,
    sh.size(id) as usize,
    sh.type_(id),
    p_ as isize,
    )
  • replacement in elfedit/src/lib.rs at line 1176
    [2.2776][2.2776:3036]()
    let current_len =
    sections.iter().map(|(o, l, t, _)|
    if *t != Sht::NOBITS {
    o + l
    } else {
    0
    })
    [2.2776]
    [2.3036]
    let current_len = sections
    .iter()
    .map(|(o, l, t, _)| if *t != Sht::NOBITS { o + l } else { 0 })
  • replacement in elfedit/src/lib.rs at line 1180
    [2.3063][2.3063:3184]()
    .unwrap_or(
    self.f.metadata().unwrap().len() as usize
    );
    [2.3063]
    [3.11513]
    .unwrap_or(self.f.metadata().unwrap().len() as usize);
  • replacement in elfedit/src/lib.rs at line 1224
    [3.13767][2.3519:3803]()
    let current_len =
    sections.iter().map(|(o, l, t, _)| {
    if *t != Sht::NOBITS {
    o + l
    } else {
    0
    }
    })
    [3.13767]
    [2.3803]
    let current_len = sections
    .iter()
    .map(|(o, l, t, _)| if *t != Sht::NOBITS { o + l } else { 0 })
  • replacement in elfedit/src/lib.rs at line 1228
    [2.3830][2.3830:3951]()
    .unwrap_or(
    self.f.metadata().unwrap().len() as usize
    );
    [2.3830]
    [3.13844]
    .unwrap_or(self.f.metadata().unwrap().len() as usize);
  • replacement in elfedit/src/lib.rs at line 1296
    [2.4078][2.4078:4130]()
    return Err(Error::NoDynamicSection)
    [2.4078]
    [2.4130]
    return Err(Error::NoDynamicSection);
  • replacement in elfedit/src/lib.rs at line 1319
    [2.4198][2.4198:4250]()
    return Err(Error::NoDynamicSection)
    [2.4198]
    [2.4250]
    return Err(Error::NoDynamicSection);
  • edit in elfedit/src/lib.rs at line 1332
    [3.28356]
    [3.28356]
    data: Endianness,
  • edit in elfedit/src/lib.rs at line 1335
    [3.28422]
    [3.28422]
    runpath: Option<&[u8]>,
  • edit in elfedit/src/lib.rs at line 1338
    [3.28498][2.4266:4373]()
    let Some(parsed) = self.parse()? else {
    return Err(Error::NoDynamicSection)
    };
  • replacement in elfedit/src/lib.rs at line 1342
    [2.4524][3.28534:28615](),[3.28534][3.28534:28615](),[3.28615][3.15582:15652]()
    let runpath = parsed.runpath()?.map(|x| x.to_bytes_with_nul().to_vec());
    remove_trailing_needed_runpath(parsed.data, dynstr, dynamic);
    [2.4524]
    [3.15652]
    remove_trailing_needed_runpath(data, dynstr, dynamic);
  • replacement in elfedit/src/lib.rs at line 1358
    [2.4560][2.4560:4596]()
    OwnedDynamic::B32(d) =>
    [2.4560]
    [2.4596]
    OwnedDynamic::B32(d) => {
  • replacement in elfedit/src/lib.rs at line 1362
    [2.4730][2.4730:4766]()
    OwnedDynamic::B64(d) =>
    [2.4730]
    [2.4766]
    }
    OwnedDynamic::B64(d) => {
  • edit in elfedit/src/lib.rs at line 1367
    [2.4900]
    [3.29023]
    }
  • replacement in elfedit/src/lib.rs at line 1373
    [3.15974][3.29055:29106](),[3.29055][3.29055:29106]()
    pub fn update(mut self) -> Result<(), Error> {
    [3.15974]
    [2.4901]
    pub fn update<P: AsRef<std::path::Path>>(mut self, into: Option<P>) -> Result<bool, Error> {
  • replacement in elfedit/src/lib.rs at line 1375
    [2.4944][2.4944:4970]()
    return Ok(())
    [2.4944]
    [2.4970]
    return Ok(false);
  • edit in elfedit/src/lib.rs at line 1379
    [3.29243]
    [3.29243]
    let interp_owned = p.interp.to_owned();
  • replacement in elfedit/src/lib.rs at line 1381
    [3.29244][3.29244:29314]()
    self.update_sections(&mut dynstr_owned, &mut dynamic_owned)?;
    [3.29244]
    [3.29494]
    // Avoid a reparsing in `update_sections`.
    let p = Parsed {
    data: p.data,
    dynamic: dynamic_owned.as_ref(),
    dynstr: Names(&dynstr_owned),
    interp: interp_owned.as_deref(),
    };
    let runpath = p.runpath()?.map(|x| x.to_bytes_with_nul().to_vec());
    self.update_sections(
    p.data,
    &mut dynstr_owned,
    &mut dynamic_owned,
    runpath.as_deref(),
    )?;
  • edit in elfedit/src/lib.rs at line 1403
    [3.16136]
    [3.29894]
    let into_file = if let Some(into) = into {
    let mut f = std::fs::OpenOptions::new()
    .read(true)
    .write(true)
    .create(true)
    .open(&into)?;
    std::fs::set_permissions(into.as_ref(), self.f.metadata()?.permissions())?;
    std::io::copy(&mut self.f, &mut f)?;
    Some(f)
    } else {
    None
    };
    let mut elf = if let Some(ref file) = into_file {
    Elf::open(&file)?
    } else {
    self
    };
  • replacement in elfedit/src/lib.rs at line 1424
    [3.29958][3.16137:16203]()
    self.update_section(b".interp", &new_interp).unwrap()
    [3.29958]
    [3.30032]
    elf.update_section(b".interp", &new_interp).unwrap()
  • replacement in elfedit/src/lib.rs at line 1427
    [3.16265][3.16265:16334](),[3.16334][2.5032:5103]()
    self.update_section(b".dynstr", &dynstr_owned).unwrap();
    self.update_section(b".dynamic", dynamic_owned.as_bytes())
    [3.16265]
    [3.16422]
    elf.update_section(b".dynstr", &dynstr_owned).unwrap();
    elf.update_section(b".dynamic", dynamic_owned.as_bytes())
  • replacement in elfedit/src/lib.rs at line 1432
    [3.30167][3.16450:16483]()
    let id = self.id().data;
    [3.30167]
    [3.16483]
    let id = elf.id().data;
  • replacement in elfedit/src/lib.rs at line 1437
    [3.16600][3.16600:16654]()
    self.update_dynamic::<u32>(id, t)
    [3.16600]
    [3.16654]
    elf.update_dynamic::<u32>(id, t)
  • replacement in elfedit/src/lib.rs at line 1442
    [3.16772][3.16772:16826]()
    self.update_dynamic::<u64>(id, t)
    [3.16772]
    [3.16826]
    elf.update_dynamic::<u64>(id, t)
  • replacement in elfedit/src/lib.rs at line 1446
    [3.30442][3.16859:16926]()
    self.update_section(b".dynamic", dynamic_owned.as_bytes())
    [3.30442]
    [3.16926]
    elf.update_section(b".dynamic", dynamic_owned.as_bytes())
  • replacement in elfedit/src/lib.rs at line 1449
    [3.17001][3.30490:30505](),[3.30490][3.30490:30505]()
    Ok(())
    [3.16950]
    [3.30505]
    Ok(true)
  • edit in elfedit/src/lib.rs at line 1495
    [3.31150]
    [3.31150]
    fn as_ref(&self) -> Dynamic {
    match self {
    OwnedDynamic::B32(d) => Dynamic::B32(d),
    OwnedDynamic::B64(d) => Dynamic::B64(d),
    }
    }