--- 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<A>::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());
