1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-21 09:57:18 +03:00

[Mach-O] wip

This commit is contained in:
Rui Ueyama 2021-11-13 17:45:04 +09:00
parent 433666a470
commit 91b9f925d6
3 changed files with 12 additions and 1 deletions

View File

@ -30,6 +30,15 @@ static void visit(Context &ctx, Subsection &subsec) {
visit(ctx, *rel.subsec);
}
}
for (UnwindRecord &rec : subsec.get_unwind_records()) {
rec.is_alive = true;
visit(ctx, *rec.subsec);
if (rec.lsda)
visit(ctx, *rec.lsda);
if (Symbol *sym = rec.personality; sym && sym->subsec)
visit(ctx, *sym->subsec);
}
}
static void mark(Context &ctx, std::span<Subsection *> rootset) {

View File

@ -49,6 +49,7 @@ struct UnwindRecord {
Symbol *personality = nullptr;
Subsection *lsda = nullptr;
u32 lsda_offset = 0;
bool is_alive = false;
};
class InputFile {

View File

@ -1142,7 +1142,8 @@ static std::vector<u8> construct_unwind_info(Context &ctx) {
if (chunk->is_regular)
for (Subsection *subsec : ((OutputSection *)chunk)->members)
for (UnwindRecord &rec : subsec->get_unwind_records())
records.push_back(rec);
if (!ctx.arg.dead_strip || rec.is_alive)
records.push_back(rec);
return UnwindEncoder().encode(ctx, records);
}