Skip to content

Commit

Permalink
write/elf: fix alignment for SHT_HASH/SHT_GNU_verdef/SHT_GNU_verneed (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
philipc authored Jul 21, 2024
1 parent 7caf97f commit decc31d
Show file tree
Hide file tree
Showing 13 changed files with 45 additions and 38 deletions.
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.add-needed
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -383,7 +383,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.add-rpath
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -379,7 +379,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.add-runpath
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -379,7 +379,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.delete-needed
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -360,7 +360,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.delete-section
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ SectionHeader {
Size: 0x30
Link: 5
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -329,7 +329,7 @@ SectionHeader {
Size: 0x20
Link: 6
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.delete-symbol
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ SectionHeader {
Size: 0x2C
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -315,7 +315,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.noop
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -513,7 +513,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
VersionNeed {
Version: 1
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.rename-section
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -364,7 +364,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.rename-symbol
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -337,7 +337,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.replace-needed
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -375,7 +375,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.set-interpreter
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -364,7 +364,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
4 changes: 2 additions & 2 deletions crates/rewrite/testfiles/elf/base.set-runpath
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ SectionHeader {
Size: 0x30
Link: 6
Info: 0
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x4
Hash {
BucketCount: 3
Expand Down Expand Up @@ -379,7 +379,7 @@ SectionHeader {
Size: 0x20
Link: 7
Info: 1
AddressAlign: 0x8
AddressAlign: 0x4
EntrySize: 0x0
}
SectionHeader {
Expand Down
35 changes: 21 additions & 14 deletions src/write/elf/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ use crate::write::string::{StringId, StringTable};
use crate::write::util;
use crate::write::{Error, Result, WritableBuffer};

const ALIGN_SYMTAB_SHNDX: usize = 4;
const ALIGN_HASH: usize = 4;
const ALIGN_GNU_VERSYM: usize = 2;
const ALIGN_GNU_VERDEF: usize = 4;
const ALIGN_GNU_VERNEED: usize = 4;

/// The index of an ELF section.
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SectionIndex(pub u32);
Expand Down Expand Up @@ -914,7 +920,7 @@ impl<'a> Writer<'a> {
if !self.need_symtab_shndx {
return;
}
self.symtab_shndx_offset = self.reserve(self.symtab_num as usize * 4, 4);
self.symtab_shndx_offset = self.reserve(self.symtab_num as usize * 4, ALIGN_SYMTAB_SHNDX);
self.symtab_shndx_data.reserve(self.symtab_num as usize * 4);
}

Expand All @@ -925,6 +931,7 @@ impl<'a> Writer<'a> {
if self.symtab_shndx_offset == 0 {
return;
}
util::write_align(self.buffer, ALIGN_SYMTAB_SHNDX);
debug_assert_eq!(self.symtab_shndx_offset, self.buffer.len());
debug_assert_eq!(self.symtab_num as usize * 4, self.symtab_shndx_data.len());
self.buffer.write_bytes(&self.symtab_shndx_data);
Expand Down Expand Up @@ -973,7 +980,7 @@ impl<'a> Writer<'a> {
sh_size,
sh_link: self.symtab_index.0,
sh_info: 0,
sh_addralign: 4,
sh_addralign: ALIGN_SYMTAB_SHNDX as u64,
sh_entsize: 4,
});
}
Expand Down Expand Up @@ -1337,7 +1344,7 @@ impl<'a> Writer<'a> {
/// not the total number of symbols.
pub fn reserve_hash(&mut self, bucket_count: u32, chain_count: u32) -> usize {
self.hash_size = self.class().hash_size(bucket_count, chain_count);
self.hash_offset = self.reserve(self.hash_size, self.elf_align);
self.hash_offset = self.reserve(self.hash_size, ALIGN_HASH);
self.hash_offset
}

Expand All @@ -1359,7 +1366,7 @@ impl<'a> Writer<'a> {
}
}

util::write_align(self.buffer, self.elf_align);
util::write_align(self.buffer, ALIGN_HASH);
debug_assert_eq!(self.hash_offset, self.buffer.len());
self.buffer.write(&elf::HashHeader {
bucket_count: U32::new(self.endian, bucket_count),
Expand Down Expand Up @@ -1397,7 +1404,7 @@ impl<'a> Writer<'a> {
sh_size: self.hash_size as u64,
sh_link: self.dynsym_index.0,
sh_info: 0,
sh_addralign: self.elf_align as u64,
sh_addralign: ALIGN_HASH as u64,
sh_entsize: 4,
});
}
Expand Down Expand Up @@ -1541,7 +1548,7 @@ impl<'a> Writer<'a> {
if self.dynsym_num == 0 {
return 0;
}
self.gnu_versym_offset = self.reserve(self.dynsym_num as usize * 2, 2);
self.gnu_versym_offset = self.reserve(self.dynsym_num as usize * 2, ALIGN_GNU_VERSYM);
self.gnu_versym_offset
}

Expand All @@ -1553,7 +1560,7 @@ impl<'a> Writer<'a> {
if self.dynsym_num == 0 {
return;
}
util::write_align(self.buffer, 2);
util::write_align(self.buffer, ALIGN_GNU_VERSYM);
debug_assert_eq!(self.gnu_versym_offset, self.buffer.len());
self.write_gnu_versym(0);
}
Expand Down Expand Up @@ -1591,7 +1598,7 @@ impl<'a> Writer<'a> {
sh_size: self.class().gnu_versym_size(self.dynsym_num as usize) as u64,
sh_link: self.dynsym_index.0,
sh_info: 0,
sh_addralign: 2,
sh_addralign: ALIGN_GNU_VERSYM as u64,
sh_entsize: 2,
});
}
Expand All @@ -1603,7 +1610,7 @@ impl<'a> Writer<'a> {
return 0;
}
self.gnu_verdef_size = self.class().gnu_verdef_size(verdef_count, verdaux_count);
self.gnu_verdef_offset = self.reserve(self.gnu_verdef_size, self.elf_align);
self.gnu_verdef_offset = self.reserve(self.gnu_verdef_size, ALIGN_GNU_VERDEF);
self.gnu_verdef_count = verdef_count as u16;
self.gnu_verdef_remaining = self.gnu_verdef_count;
self.gnu_verdef_offset
Expand All @@ -1614,7 +1621,7 @@ impl<'a> Writer<'a> {
if self.gnu_verdef_offset == 0 {
return;
}
util::write_align(self.buffer, self.elf_align);
util::write_align(self.buffer, ALIGN_GNU_VERDEF);
debug_assert_eq!(self.gnu_verdef_offset, self.buffer.len());
}

Expand Down Expand Up @@ -1713,7 +1720,7 @@ impl<'a> Writer<'a> {
sh_size: self.gnu_verdef_size as u64,
sh_link: self.dynstr_index.0,
sh_info: self.gnu_verdef_count.into(),
sh_addralign: self.elf_align as u64,
sh_addralign: ALIGN_GNU_VERDEF as u64,
sh_entsize: 0,
});
}
Expand All @@ -1725,7 +1732,7 @@ impl<'a> Writer<'a> {
return 0;
}
self.gnu_verneed_size = self.class().gnu_verneed_size(verneed_count, vernaux_count);
self.gnu_verneed_offset = self.reserve(self.gnu_verneed_size, self.elf_align);
self.gnu_verneed_offset = self.reserve(self.gnu_verneed_size, ALIGN_GNU_VERNEED);
self.gnu_verneed_count = verneed_count as u16;
self.gnu_verneed_remaining = self.gnu_verneed_count;
self.gnu_verneed_offset
Expand All @@ -1736,7 +1743,7 @@ impl<'a> Writer<'a> {
if self.gnu_verneed_offset == 0 {
return;
}
util::write_align(self.buffer, self.elf_align);
util::write_align(self.buffer, ALIGN_GNU_VERNEED);
debug_assert_eq!(self.gnu_verneed_offset, self.buffer.len());
}

Expand Down Expand Up @@ -1813,7 +1820,7 @@ impl<'a> Writer<'a> {
sh_size: self.gnu_verneed_size as u64,
sh_link: self.dynstr_index.0,
sh_info: self.gnu_verneed_count.into(),
sh_addralign: self.elf_align as u64,
sh_addralign: ALIGN_GNU_VERNEED as u64,
sh_entsize: 0,
});
}
Expand Down

0 comments on commit decc31d

Please sign in to comment.