--- src/ld/OutputFile.cpp +++ src/ld/OutputFile.cpp @@ -2984,7 +2984,8 @@ void OutputFile::addClassicRelocs(ld::Internal& state, ld::Internal::FinalSectio if ( (target->combine() == ld::Atom::combineByName) && (target->definition() == ld::Atom::definitionRegular) && (_options.outputKind() != Options::kStaticExecutable) - && (_options.outputKind() != Options::kPreload) ) { + && (_options.outputKind() != Options::kPreload) + && (atom != target) ) { needsExternReloc = true; } else if ( _options.outputKind() == Options::kDynamicExecutable ) { --- src/ld/parsers/macho_relocatable_file.cpp +++ src/ld/parsers/macho_relocatable_file.cpp @@ -2545,6 +2545,10 @@ void Parser::addFixups(const SourceLocation& src, ld::Fixup::Kind setKind, co // backing string in CFStrings should always be direct addFixup(src, cl, firstKind, target.atom); } + else if ( (src.atom == target.atom) && (target.atom->combine() == ld::Atom::combineByName) ) { + // reference to self should always be direct + addFixup(src, cl, firstKind, target.atom); + } else { // change direct fixup to by-name fixup addFixup(src, cl, firstKind, false, target.atom->name());