diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 3a013ef..7e330c3 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -6036,10 +6036,29 @@ Target_powerpc::Scan::global( case elfcpp::R_PPC64_ADDR16_HIGHESTA: case elfcpp::R_PPC64_ADDR16_DS: case elfcpp::R_PPC64_ADDR16_LO_DS: + case elfcpp::R_PPC64_TOC16: + case elfcpp::R_PPC64_TOC16_LO: + case elfcpp::R_PPC64_TOC16_HI: + case elfcpp::R_PPC64_TOC16_HA: + case elfcpp::R_PPC64_TOC16_DS: + case elfcpp::R_PPC64_TOC16_LO_DS: case elfcpp::R_POWERPC_ADDR14: case elfcpp::R_POWERPC_ADDR14_BRTAKEN: case elfcpp::R_POWERPC_ADDR14_BRNTAKEN: { + // The toc-relative relocations need a GOT section + switch (r_type) + { + case elfcpp::R_PPC64_TOC16: + case elfcpp::R_PPC64_TOC16_LO: + case elfcpp::R_PPC64_TOC16_HI: + case elfcpp::R_PPC64_TOC16_HA: + case elfcpp::R_PPC64_TOC16_DS: + case elfcpp::R_PPC64_TOC16_LO_DS: + target->got_section(symtab, layout); + break; + } + // Make a PLT entry if necessary. if (gsym->needs_plt_entry()) { @@ -6248,16 +6265,6 @@ Target_powerpc::Scan::global( } break; - case elfcpp::R_PPC64_TOC16: - case elfcpp::R_PPC64_TOC16_LO: - case elfcpp::R_PPC64_TOC16_HI: - case elfcpp::R_PPC64_TOC16_HA: - case elfcpp::R_PPC64_TOC16_DS: - case elfcpp::R_PPC64_TOC16_LO_DS: - // We need a GOT section. - target->got_section(symtab, layout); - break; - case elfcpp::R_POWERPC_GOT_TLSGD16: case elfcpp::R_POWERPC_GOT_TLSGD16_LO: case elfcpp::R_POWERPC_GOT_TLSGD16_HI: