Skip to content

Commit

Permalink
Correctly apply section fragment offsets to contained symbols
Browse files Browse the repository at this point in the history
  • Loading branch information
ISSOtm committed Aug 18, 2024
1 parent 3692966 commit 86140b5
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/link/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) {
if (auto *label = std::get_if<Label>(&fileSymbols[i].data); label) {
if (Section *section = label->section; section->modifier != SECTION_NORMAL) {
if (section->modifier == SECTION_FRAGMENT)
// Add the fragment's offset to the symbol's
// Add the fragment's offset to the symbol's (`section->offset` is computed by `sect_AddSection`)
label->offset += section->offset;
// Associate the symbol with the main section, not the "component" one
label->section = sect_GetSection(section->name);
Expand Down
22 changes: 15 additions & 7 deletions src/link/sdas_obj.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -868,14 +868,22 @@ void sdobj_ReadFile(FileStackNode const &where, FILE *file, std::vector<Symbol>
section->size
);
}

if (section->modifier == SECTION_FRAGMENT) {
// Add the fragment's offset to all of its symbols
for (Symbol *symbol : section->symbols)
symbol->label().offset += section->offset;
}

// Calling `sect_AddSection` invalidates the contents of `fileSections`!
sect_AddSection(std::move(section));
}

// Fix symbols' section pointers to component sections
// This has to run **after** all the `sect_AddSection()` calls,
// so that `sect_GetSection()` will work
for (Symbol &sym : fileSymbols) {
if (auto *label = std::get_if<Label>(&sym.data); label) {
if (Section *section = label->section; section->modifier != SECTION_NORMAL) {
if (section->modifier == SECTION_FRAGMENT)
// Add the fragment's offset to the symbol's (`section->offset` is computed by `sect_AddSection`)
label->offset += section->offset;
// Associate the symbol with the main section, not the "component" one
label->section = sect_GetSection(section->name);
}
}
}
}

0 comments on commit 86140b5

Please sign in to comment.