module_frob_arch_sections() is called before the module is moved to its
final location. The function descriptor section addresses we are setting
here are thus invalid. Fix this by processing opd section during
module_finalize()
Fixes: 5633e85b2c313 ("powerpc64: Add .opd based function descriptor dereference")
Cc: stable@vger.kernel.org # v4.16
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
                                  (void *)sect->sh_addr + sect->sh_size);
 #endif /* CONFIG_PPC64 */
 
+#ifdef PPC64_ELF_ABI_v1
+       sect = find_section(hdr, sechdrs, ".opd");
+       if (sect != NULL) {
+               me->arch.start_opd = sect->sh_addr;
+               me->arch.end_opd = sect->sh_addr + sect->sh_size;
+       }
+#endif /* PPC64_ELF_ABI_v1 */
+
 #ifdef CONFIG_PPC_BARRIER_NOSPEC
        sect = find_section(hdr, sechdrs, "__spec_barrier_fixup");
        if (sect != NULL)
 
                else if (strcmp(secstrings+sechdrs[i].sh_name,"__versions")==0)
                        dedotify_versions((void *)hdr + sechdrs[i].sh_offset,
                                          sechdrs[i].sh_size);
-               else if (!strcmp(secstrings + sechdrs[i].sh_name, ".opd")) {
-                       me->arch.start_opd = sechdrs[i].sh_addr;
-                       me->arch.end_opd = sechdrs[i].sh_addr +
-                                          sechdrs[i].sh_size;
-               }
 
                /* We don't handle .init for the moment: rename to _init */
                while ((p = strstr(secstrings + sechdrs[i].sh_name, ".init")))