This is the mail archive of the 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: [RFC PATCH, binutils, ARM 11/11, ping] Add support for stable secure gateway veneers addresses

Hi Christophe,

On 29/08/16 15:56, Christophe Lyon wrote:
On 26 August 2016 at 16:18, Thomas Preudhomme
<> wrote:
On 26/08/16 13:36, Thomas Preudhomme wrote:

Hi Christophe,

On 26/08/16 12:55, Christophe Lyon wrote:

I've noticed that the new tests fail on armeb. I didn't look at the
detailed logs yet, but I guess you can a look?

./ld/ld.sum:FAIL: Input secure gateway import library
./ld/ld.sum:FAIL: Input secure gateway import library: no output import
./ld/ld.sum:FAIL: Input secure gateway import library: earlier stub
section base
./ld/ld.sum:FAIL: Input secure gateway import library: later stub section
./ld/ld.sum:FAIL: Input secure gateway import library: veneer comeback
./ld/ld.sum:FAIL: Input secure gateway import library: entry function

I can reproduce indeed. I'll have a look, thanks for the notice. Note that
Monday is a bank holidays here so might only answer after that if I'm too
to find the root cause.

Doh, the code checks for a SG instruction by comparing the 4 bytes in the
code against its litteral value. The problem of course is that the read puts
the 4 bytes of the instruction in memory order but these will then be
interpreted according to the endianness.

The fix should be easy.

Indeed, thanks to your analysis it was quick enough.

Here is a patch, maybe there is a simpler way?

diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 9ff418a..5c04b9b 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -5791,11 +5791,19 @@ cmse_entry_fct_p (struct elf32_arm_link_hash_entry *hash)
   section = hash->root.root.u.def.section;
   abfd = section->owner;
   offset = hash->root.root.u.def.value - section->vma;
-  if (!bfd_get_section_contents (abfd, section, &first_insn, offset,
-				 sizeof (first_insn)))
-    return FALSE;

   /* Start by SG instruction.  */
+  bfd_byte * contents;
+  /* Get cached copy if it exists.  */
+  if (elf_section_data (section)->this_hdr.contents != NULL)
+    contents = elf_section_data (section)->this_hdr.contents;
+  else
+    {
+      /* Go get them off disk.  */
+      if (! bfd_malloc_and_get_section (abfd, section, &contents))
+	return FALSE;
+    }
+  first_insn = bfd_get_32 (abfd, contents + offset);
   return first_insn == 0xe97fe97f;

I have a similar patch but I'm still using bfd_get_section_contents with a 4byte buffer named contents. It avoids reading the entire section to just analyze 4 bytes. I did it on Friday so wanted to test it a bit more today.

Best regards,


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