This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] PR ld/18169: sh_info of .rel.plt/.rela.plt sections isn't correct
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Binutils <binutils at sourceware dot org>
- Date: Fri, 27 Mar 2015 15:14:17 -0700
- Subject: Re: [PATCH] PR ld/18169: sh_info of .rel.plt/.rela.plt sections isn't correct
- Authentication-results: sourceware.org; auth=none
- References: <20150326183455 dot GA9206 at gmail dot com> <20150326235524 dot GX26234 at bubble dot grove dot modra dot org>
On Thu, Mar 26, 2015 at 4:55 PM, Alan Modra <amodra@gmail.com> wrote:
> On Thu, Mar 26, 2015 at 11:34:55AM -0700, H.J. Lu wrote:
>> Since .rela.plt/rel.plt section doesn't contain relocations against .plt
>> section, we shouldn't set sh_info for .rela.plt/rel.plt section.
>
> That depends entirely on your ABI. I'd argue that on x86 you ought to
> be setting sh_info for .rel.plt to the .got.plt section index.
> Setting sh_info to zero is not correct.
>
Here is a patch. I used want_got_plt to check if .rel.plt applies to
.got.plt. If it doesn't work for a target, target can provide its own
elf_backend_get_reloc_section. OK for master?
Thanks.
--
H.J.
From 9c2217ed92cfd70174bb7bee1acbeacc947b3d98 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Fri, 27 Mar 2015 14:14:33 -0700
Subject: [PATCH] Properly set sh_info for .rela.plt/rel.plt section
Since .rela.plt/rel.plt section may contain relocations against .got.plt
section, we set sh_info for .rela.plt/rel.plt section to .got.plt section
index if target has .got.plt section.
bfd/
PR ld/18169
* elf-bfd.h (elf_backend_data): Add get_reloc_section.
(_bfd_elf_get_reloc_section): New.
* elf.c (_bfd_elf_get_reloc_section): Likewise.
(assign_section_numbers): Call get_reloc_section to look up the
section the relocs apply.
* elfxx-target.h (elf_backend_get_reloc_section): Likewise.
(elfNN_bed): Initialize get_reloc_section with
elf_backend_get_reloc_section.
ld/testsuite/
PR ld/18169
* ld-elf/linkinfo1a.d: Updated.
* ld-elf/linkinfo1b.d: Likewise.
---
bfd/elf-bfd.h | 5 +++++
bfd/elf.c | 43 ++++++++++++++++++++++++++++++++--------
bfd/elfxx-target.h | 5 +++++
ld/testsuite/ld-elf/linkinfo1a.d | 4 +++-
ld/testsuite/ld-elf/linkinfo1b.d | 4 +++-
5 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 53ef9d8..e435e52 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1239,6 +1239,9 @@ struct elf_backend_data
bfd_size_type (*maybe_function_sym) (const asymbol *sym, asection *sec,
bfd_vma *code_off);
+ /* Return the section which RELOC_SEC applies to. */
+ asection *(*get_reloc_section) (asection *reloc_sec);
+
/* Used to handle bad SHF_LINK_ORDER input. */
bfd_error_handler_type link_order_error_handler;
@@ -2247,6 +2250,8 @@ extern bfd_boolean _bfd_elf_is_function_type (unsigned int);
extern bfd_size_type _bfd_elf_maybe_function_sym (const asymbol *, asection *,
bfd_vma *);
+extern asection *_bfd_elf_get_reloc_section (asection *);
+
extern int bfd_elf_get_default_section_type (flagword);
extern bfd_boolean bfd_elf_lookup_section_flags
diff --git a/bfd/elf.c b/bfd/elf.c
index c4defda..f3c9050 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3074,6 +3074,40 @@ bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
}
+/* Return the section which RELOC_SEC applies to. */
+
+asection *
+_bfd_elf_get_reloc_section (asection *reloc_sec)
+{
+ const char *name;
+ unsigned int type;
+ bfd *abfd;
+
+ if (reloc_sec == NULL)
+ return NULL;
+
+ type = elf_section_data (reloc_sec)->this_hdr.sh_type;
+ if (type != SHT_REL && type != SHT_RELA)
+ return NULL;
+
+ /* We look up the section the relocs apply to by name. */
+ name = reloc_sec->name;
+ if (type == SHT_REL)
+ name += 4;
+ else
+ name += 5;
+
+ /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
+ section apply to .got.plt section. */
+ abfd = reloc_sec->owner;
+ if (get_elf_backend_data (abfd)->want_got_plt
+ && strcmp (name, ".plt") == 0)
+ name = ".got.plt";
+
+ reloc_sec = bfd_get_section_by_name (abfd, name);
+ return reloc_sec;
+}
+
/* Assign all ELF section numbers. The dummy first section is handled here
too. The link/info pointers for the standard section types are filled
in here too, while we're at it. */
@@ -3209,7 +3243,6 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
for (sec = abfd->sections; sec; sec = sec->next)
{
asection *s;
- const char *name;
d = elf_section_data (sec);
@@ -3313,13 +3346,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
if (s != NULL)
d->this_hdr.sh_link = elf_section_data (s)->this_idx;
- /* We look up the section the relocs apply to by name. */
- name = sec->name;
- if (d->this_hdr.sh_type == SHT_REL)
- name += 4;
- else
- name += 5;
- s = bfd_get_section_by_name (abfd, name);
+ s = get_elf_backend_data (abfd)->get_reloc_section (sec);
if (s != NULL)
{
d->this_hdr.sh_info = elf_section_data (s)->this_idx;
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 9760db4..5623662 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -672,6 +672,10 @@
#define elf_backend_maybe_function_sym _bfd_elf_maybe_function_sym
#endif
+#ifndef elf_backend_get_reloc_section
+#define elf_backend_get_reloc_section _bfd_elf_get_reloc_section
+#endif
+
#ifndef elf_match_priority
#define elf_match_priority \
(ELF_ARCH == bfd_arch_unknown ? 2 : ELF_OSABI == ELFOSABI_NONE ? 1 : 0)
@@ -769,6 +773,7 @@ static struct elf_backend_data elfNN_bed =
elf_backend_hash_symbol,
elf_backend_is_function_type,
elf_backend_maybe_function_sym,
+ elf_backend_get_reloc_section,
elf_backend_link_order_error_handler,
elf_backend_relplt_name,
ELF_MACHINE_ALT1,
diff --git a/ld/testsuite/ld-elf/linkinfo1a.d b/ld/testsuite/ld-elf/linkinfo1a.d
index 8c6fb71..b5ccf6f 100644
--- a/ld/testsuite/ld-elf/linkinfo1a.d
+++ b/ld/testsuite/ld-elf/linkinfo1a.d
@@ -4,5 +4,7 @@
#target: x86_64-* i?86-*
#...
- \[[ 0-9]+\] \.rel[a]?\.plt[ \t]+REL[A]?[ \t][ \t0-9a-f]+AI[ \t0-9a-f]+
+ \[[ 0-9]+\] \.rel[a]?\.plt[ \t]+REL[A]?[ \t][ \t0-9a-f]+AI[ \t]+[0-9a-f]+[ \t]+9[ \t]+[0-9a-f]+
+#...
+ \[[ 9\] \.got.plt[ \t]+PROGBITS?[ \t][ \t0-9a-f]+WA[ \t]+[0-9a-f]+[ \t]+0[ \t]+[0-9a-f]+
#pass
diff --git a/ld/testsuite/ld-elf/linkinfo1b.d b/ld/testsuite/ld-elf/linkinfo1b.d
index cc3aaed..cb17683 100644
--- a/ld/testsuite/ld-elf/linkinfo1b.d
+++ b/ld/testsuite/ld-elf/linkinfo1b.d
@@ -5,5 +5,7 @@
#target: x86_64-* i?86-*
#...
- \[[ 0-9]+\] \.rel[a]?\.plt[ \t]+REL[A]?[ \t][ \t0-9a-f]+AI[ \t0-9a-f]+
+ \[[ 0-9]+\] \.rel[a]?\.plt[ \t]+REL[A]?[ \t][ \t0-9a-f]+AI[ \t]+[0-9a-f]+[ \t]+9[ \t]+[0-9a-f]+
+#...
+ \[[ 9\] \.got.plt[ \t]+PROGBITS?[ \t][ \t0-9a-f]+WA[ \t]+[0-9a-f]+[ \t]+0[ \t]+[0-9a-f]+
#pass
--
2.1.0