This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/4] [ARC] General bug fixes


Hi Nick,

Thank you for your super fast feedback.
Here is a new patch with your suggestion.

Best regards,
Cupertino

+      /* Make sure we have with a dynamic linker.  In case of GOT and PLT
+         the sym_section should point to .got or .plt respectively.  */
+      if (is_reloc_for_GOT (howto) || is_reloc_for_PLT (howto))
+    {
+      (*_bfd_error_handler)
+        (_("GOT and PLT relocations cannot be fixed with a non dynamic
linker."));
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
+    }
+


On 06/13/2016 01:26 PM, Nick Clifton wrote:
> Hi Cupertino,
>
>> bfd/ChangeLog:
>>
>> Cupertino Miranda  <cmiranda@synospsy.com>
>>
>>     elf32-arc.c (arc_local_data, arc_local_data): Removed.
>>     (SECTSTART): Changed.
>>     (elf_arc_relocate_section): Fixed mistake in PIE related condition.
>>     (elf_arc_size_dynamic_sections): Changed DT_RELENT to DT_RELAENT.
> Approved, please apply, but...
>
>  
> +      /* Make sure we have with a dynamic linker.  In case of GOT and PLT
> +	  the sym_section should point to .got or .plt respectively.  */
> +      if (is_reloc_for_GOT (howto) || is_reloc_for_PLT (howto))
> +	BFD_ASSERT (reloc_data.sym_section != NULL);
> +
>
> I am not sure if an assertion is the right thing to use here.  Assertions
> trigger aborts which IMHO should only happen if the *code* in the library
> is broken.  If, on the other hand, the problem is because of a user error
> eg - not supplying a dynamic linker - then the library should not abort,
> but rather return an error value and set an error code.
>
> So in this case I think that you would be better off calling bfd_error_handler()
> and bfd_set_error() and then returning FALSE.
>
> Cheers
>   Nick
>
>

From 2c77853a93aa5afa3a799cd52369f1d020c75a9a Mon Sep 17 00:00:00 2001
From: Cupertino Miranda <cmiranda@synopsys.com>
Date: Fri, 20 May 2016 12:06:17 +0200
Subject: [PATCH 2/7] General fix on ARC BFD.

Fail safe for trying to reloc GOT and PLT on non dynamic linker.
Fix issue with dynamic relocs not being generated with -pie.
Removed some structures that were not being used.
Fixed typo changing RELENT to RELAENT. ;-)
Fix for all SECTOFF relocations.
---
 bfd/elf32-arc.c | 36 +++++++++++++++++-------------------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 82b7687..bb9cb29 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -70,20 +70,6 @@ name_for_global_symbol (struct elf_link_hash_entry *h)
     bfd_elf32_swap_reloca_out (BFD, &_rel, _loc);			\
   }
 
-struct arc_local_data
-{
-  bfd_vma	  sdata_begin_symbol_vma;
-  asection *      sdata_output_section;
-  bfd_vma	  got_symbol_vma;
-};
-
-struct arc_local_data global_arc_data =
-{
-  .sdata_begin_symbol_vma = 0,
-  .sdata_output_section = NULL,
-  .got_symbol_vma = 0,
-};
-
 struct dynamic_sections
 {
   bfd_boolean	  initialized;
@@ -874,7 +860,9 @@ arc_special_overflow_checks (const struct arc_relocation_data reloc_data,
 	    (reloc_data.input_section->output_section->vma \
 	     + reloc_data.input_section->output_offset \
 	     + (reloc_data.reloc_offset))))
-#define SECTSTART (bfd_signed_vma) (reloc_data.input_section->output_offset)
+#define SECTSTART (bfd_signed_vma) (reloc_data.sym_section->output_section->vma \
+				    + reloc_data.sym_section->output_offset)
+
 #define _SDA_BASE_ (bfd_signed_vma) (reloc_data.sdata_begin_symbol_vma)
 #define TLS_REL (bfd_signed_vma) \
   ((elf_hash_table (info))->tls_sec->output_section->vma)
@@ -1588,7 +1576,7 @@ elf_arc_relocate_section (bfd *		   output_bfd,
 	  case R_ARC_32_ME:
 	  case R_ARC_PC32:
 	  case R_ARC_32_PCREL:
-	    if (bfd_link_pic (info) && !bfd_link_pie (info)
+	    if ((bfd_link_pic (info) || bfd_link_pie (info))
 		&& ((r_type != R_ARC_PC32 && r_type != R_ARC_32_PCREL)
 		    || (h != NULL
 			&& h->dynindx != -1
@@ -1683,6 +1671,16 @@ elf_arc_relocate_section (bfd *		   output_bfd,
 
       DEBUG_ARC_RELOC (reloc_data);
 
+      /* Make sure we have with a dynamic linker.  In case of GOT and PLT
+         the sym_section should point to .got or .plt respectively.  */
+      if (is_reloc_for_GOT (howto) || is_reloc_for_PLT (howto))
+	{
+	  (*_bfd_error_handler)
+	    (_("GOT and PLT relocations cannot be fixed with a non dynamic linker."));
+	  bfd_set_error (bfd_error_bad_value);
+	  return FALSE;
+	}
+
       if (arc_do_relocation (contents, reloc_data, info) != bfd_reloc_ok)
 	return FALSE;
     }
@@ -1825,7 +1823,7 @@ elf_arc_check_relocs (bfd *		         abfd,
 	       and the dynamic linker can not resolve these.  However
 	       the error should not occur for e.g. debugging or
 	       non-readonly sections.  */
-	    if (bfd_link_dll (info) && !bfd_link_pie (info)
+	    if ((bfd_link_dll (info) && !bfd_link_pie (info))
 		&& (sec->flags & SEC_ALLOC) != 0
 		&& (sec->flags & SEC_READONLY) != 0
 		&& ((sec->flags & SEC_CODE) != 0
@@ -1856,7 +1854,7 @@ elf_arc_check_relocs (bfd *		         abfd,
 	    /* FALLTHROUGH */
 	  case R_ARC_PC32:
 	  case R_ARC_32_PCREL:
-	    if (bfd_link_pic (info) && !bfd_link_pie (info)
+	    if ((bfd_link_pic (info) || bfd_link_pie (info))
 		&& ((r_type != R_ARC_PC32 && r_type != R_ARC_32_PCREL)
 		    || (h != NULL
 			&& h->dynindx != -1
@@ -2686,7 +2684,7 @@ elf_arc_size_dynamic_sections (bfd * output_bfd,
       if (relocs_exist == TRUE)
 	if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
 	    || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
-	    || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
+	    || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
 					    sizeof (Elf32_External_Rela))
 	   )
 	  return FALSE;
-- 
1.9.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]