Skip to content

Commit b932b46

Browse files
alx32Alex B
authored andcommitted
[lld-macho] Category merger: handle addends when getting symbol at isec offset
1 parent f80a407 commit b932b46

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

lld/MachO/ObjC.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ class ObjcCategoryMerger {
490490
Defined *emitCategoryName(const std::string &name, ObjFile *objFile);
491491
void createSymbolReference(Defined *refFrom, const Symbol *refTo,
492492
uint32_t offset, const Reloc &relocTemplate);
493+
Defined *tryFindDefinedOnIsec(const InputSection *isec, uint32_t offset);
493494
Symbol *tryGetSymbolAtIsecOffset(const ConcatInputSection *isec,
494495
uint32_t offset);
495496
Defined *tryGetDefinedAtIsecOffset(const ConcatInputSection *isec,
@@ -566,7 +567,25 @@ ObjcCategoryMerger::tryGetSymbolAtIsecOffset(const ConcatInputSection *isec,
566567
if (!reloc)
567568
return nullptr;
568569

569-
return reloc->referent.get<Symbol *>();
570+
Symbol *sym = reloc->referent.get<Symbol *>();
571+
572+
if (reloc->addend) {
573+
assert(isa<Defined>(sym) && "Expected defined for non-zero addend");
574+
Defined *definedSym = cast<Defined>(sym);
575+
sym = tryFindDefinedOnIsec(definedSym->isec(),
576+
definedSym->value + reloc->addend);
577+
}
578+
579+
return sym;
580+
}
581+
582+
Defined *ObjcCategoryMerger::tryFindDefinedOnIsec(const InputSection *isec,
583+
uint32_t offset) {
584+
for (Defined *sym : isec->symbols)
585+
if ((sym->value <= offset) && (sym->value + sym->size > offset))
586+
return sym;
587+
588+
return nullptr;
570589
}
571590

572591
Defined *

0 commit comments

Comments
 (0)