nds32, sh, kvx: DT_JMPREL/DT_PLTRELSZ
authorAlan Modra <amodra@gmail.com>
Thu, 24 Aug 2023 01:22:19 +0000 (10:52 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 24 Aug 2023 06:24:39 +0000 (15:54 +0930)
As commit fa4f2d46f9 did for x86, there a few other targets that
wrongly use the output section rather than the dynamic section for
DT_JMPREL and others.

* elfnn-kvx.c (elfNN_kvx_finish_dynamic_sections): Use input
section for DT_JMPREL.
* elf32-sh.c (sh_elf_finish_dynamic_sections): Use input
section for DT_JMPREL and DT_PLTRELSZ.
* elf32-nds32.c (nds32_elf_finish_dynamic_sections): Likewise,
and for DT_PLTGOT and when adjusting DT_RELA.

bfd/elf32-nds32.c
bfd/elf32-sh.c
bfd/elfnn-kvx.c

index f8e24cbc6efda4620903ffff6cba59dfe673bd27..ac9106a55d4426e1077f02f14fedb42994c7c60a 100644 (file)
@@ -6385,18 +6385,18 @@ nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 
            case DT_PLTGOT:
              /* name = ".got";  */
-             s = ehtab->sgot->output_section;
+             s = ehtab->sgot;
              goto get_vma;
            case DT_JMPREL:
-             s = ehtab->srelplt->output_section;
+             s = ehtab->srelplt;
            get_vma:
              BFD_ASSERT (s != NULL);
-             dyn.d_un.d_ptr = s->vma;
+             dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
 
            case DT_PLTRELSZ:
-             s = ehtab->srelplt->output_section;
+             s = ehtab->srelplt;
              BFD_ASSERT (s != NULL);
              dyn.d_un.d_val = s->size;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
@@ -6414,7 +6414,7 @@ nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
                 about changing the DT_RELA entry.  */
              if (ehtab->srelplt != NULL)
                {
-                 s = ehtab->srelplt->output_section;
+                 s = ehtab->srelplt;
                  dyn.d_un.d_val -= s->size;
                }
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
index cba3529e2a5e4ef22a61ea26d96d456f49e57fc7..817efb58454a91f7dea84dfe8b66533dfae3fff0 100644 (file)
@@ -6291,15 +6291,13 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
              break;
 
            case DT_JMPREL:
-             s = htab->root.srelplt->output_section;
-             BFD_ASSERT (s != NULL);
-             dyn.d_un.d_ptr = s->vma;
+             s = htab->root.srelplt;
+             dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
 
            case DT_PLTRELSZ:
-             s = htab->root.srelplt->output_section;
-             BFD_ASSERT (s != NULL);
+             s = htab->root.srelplt;
              dyn.d_un.d_val = s->size;
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
              break;
index 95580d19930e2991e08bf8165727ac1ab0fda041..2dc6ae603ac94718150daae45ac627083ab5c575 100644 (file)
@@ -4589,7 +4589,8 @@ elfNN_kvx_finish_dynamic_sections (bfd *output_bfd,
              break;
 
            case DT_JMPREL:
-             dyn.d_un.d_ptr = htab->root.srelplt->output_section->vma;
+             s = htab->root.srelplt;
+             dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
              break;
 
            case DT_PLTRELSZ: