File tree Expand file tree Collapse file tree 1 file changed +20
-1
lines changed Expand file tree Collapse file tree 1 file changed +20
-1
lines changed Original file line number Diff line number Diff line change @@ -490,6 +490,7 @@ class ObjcCategoryMerger {
490
490
Defined *emitCategoryName (const std::string &name, ObjFile *objFile);
491
491
void createSymbolReference (Defined *refFrom, const Symbol *refTo,
492
492
uint32_t offset, const Reloc &relocTemplate);
493
+ Defined *tryFindDefinedOnIsec (const InputSection *isec, uint32_t offset);
493
494
Symbol *tryGetSymbolAtIsecOffset (const ConcatInputSection *isec,
494
495
uint32_t offset);
495
496
Defined *tryGetDefinedAtIsecOffset (const ConcatInputSection *isec,
@@ -566,7 +567,25 @@ ObjcCategoryMerger::tryGetSymbolAtIsecOffset(const ConcatInputSection *isec,
566
567
if (!reloc)
567
568
return nullptr ;
568
569
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 ;
570
589
}
571
590
572
591
Defined *
You can’t perform that action at this time.
0 commit comments