Merge pull request #4583 from MiniRML/fix/relinker-section-name-address

fix(relinker): zero the unmapped section-name table address
This commit is contained in:
Adrià 2026-10-13 17:49:15 +02:00 committed by GitHub
commit 27477e5f47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 5 additions and 1 deletions

View File

@ -80,7 +80,7 @@ void SectionHeaderTableBuilder::WriteTable(
buf.resize(buf.size() + kShdrEntrySize * kSectionHeaderCount, 0);
_writeSectionHeader(buf, shOff + kShdrEntrySize * 0, 0, SHT_NULL, 0, 0, 0, 0, 0, 0, 0, 0);
_writeSectionHeader(buf, shOff + kShdrEntrySize * 1, kShStrTabNameOffset, SHT_STRTAB, 0, shStrTabOff, shStrTabOff, shStrTabSize, 0, 0, kNoSpecialAlignment, 0);
_writeSectionHeader(buf, shOff + kShdrEntrySize * 1, kShStrTabNameOffset, SHT_STRTAB, 0, 0, shStrTabOff, shStrTabSize, 0, 0, kNoSpecialAlignment, 0);
_writeSectionHeader(buf, shOff + kShdrEntrySize * 2, kDynStrNameOffset, SHT_STRTAB, SHF_ALLOC, dynStrAddress, request.DynStrOffset, request.DynStrSize, 0, 0, kNoSpecialAlignment, 0);
_writeSectionHeader(buf, shOff + kShdrEntrySize * 3, kDynSymNameOffset, SHT_DYNSYM, SHF_ALLOC, dynSymAddress, request.DynSymOffset, request.DynSymSize, kDynSymLinkToStrTab, kDynSymInfoFirstGlobal, kDynSymAlign, kSymEntrySize);
_writeSectionHeader(buf, shOff + kShdrEntrySize * 4, kDynamicNameOffset, SHT_DYNAMIC, SHF_ALLOC | SHF_WRITE, dynamicAddress, request.DynamicSegmentOffset, request.DynamicSegmentSize, kDynamicLinkToStrTab, 0, kDynSymAlign, kDynEntrySize);

View File

@ -21,6 +21,10 @@ int main() {
const Elfpatcher::SectionHeaderTableRequest valid{128, 8, 136, 24, 160, 16, 176, 16};
auto bytes = Fixture(); builder.WriteTable(bytes, valid);
const auto table = Io::ReadU64(bytes, 40);
Require(Io::ReadU64(bytes, table + 64 + 8) == 0);
Require(Io::ReadU64(bytes, table + 64 + 16) == 0);
Require(Io::ReadU64(bytes, table + 64 + 24) == 512);
Require(Io::ReadU64(bytes, table + 64 + 32) != 0);
Require(Io::ReadU64(bytes, table + 2 * 64 + 16) == 0x1000);
auto empty = valid; empty.StubOffset = 384; empty.StubSize = 0;
bytes = Fixture(); builder.WriteTable(bytes, empty);