]> git.pld-linux.org Git - packages/binutils.git/commitdiff
- https://bugs.pld-linux.org/show_bug.cgi?id=23
authorSzymon Siwek <sls@pld-linux.org>
Sat, 16 Jun 2007 18:54:18 +0000 (18:54 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    binutils-pr4497.patch -> 1.1

binutils-pr4497.patch [new file with mode: 0644]

diff --git a/binutils-pr4497.patch b/binutils-pr4497.patch
new file mode 100644 (file)
index 0000000..f0fe6c3
--- /dev/null
@@ -0,0 +1,125 @@
+===================================================================
+RCS file: /cvs/src/src/bfd/elf-eh-frame.c,v
+retrieving revision 1.57
+retrieving revision 1.58
+diff -u -r1.57 -r1.58
+--- src/bfd/elf-eh-frame.c     2007/05/10 15:08:02     1.57
++++ src/bfd/elf-eh-frame.c     2007/05/12 14:27:34     1.58
+@@ -32,12 +32,16 @@
+   unsigned int length;
+   unsigned int hash;
+   unsigned char version;
++  unsigned char local_personality;
+   char augmentation[20];
+   bfd_vma code_align;
+   bfd_signed_vma data_align;
+   bfd_vma ra_column;
+   bfd_vma augmentation_size;
+-  bfd_vma personality;
++  union {
++    struct elf_link_hash_entry *h;
++    bfd_vma val;
++  } personality;
+   asection *output_sec;
+   struct eh_cie_fde *cie_inf;
+   unsigned char per_encoding;
+@@ -216,13 +220,15 @@
+   if (c1->hash == c2->hash
+       && c1->length == c2->length
+       && c1->version == c2->version
++      && c1->local_personality == c2->local_personality
+       && strcmp (c1->augmentation, c2->augmentation) == 0
+       && strcmp (c1->augmentation, "eh") != 0
+       && c1->code_align == c2->code_align
+       && c1->data_align == c2->data_align
+       && c1->ra_column == c2->ra_column
+       && c1->augmentation_size == c2->augmentation_size
+-      && c1->personality == c2->personality
++      && memcmp (&c1->personality, &c2->personality,
++               sizeof (c1->personality)) == 0
+       && c1->output_sec == c2->output_sec
+       && c1->per_encoding == c2->per_encoding
+       && c1->lsda_encoding == c2->lsda_encoding
+@@ -670,12 +676,10 @@
+                         REQUIRE (skip_bytes (&buf, end, length));
+                       }
+                     ENSURE_NO_RELOCS (buf);
+-                    /* Ensure we have a reloc here, against
+-                       a global symbol.  */
++                    /* Ensure we have a reloc here.  */
+                     if (GET_RELOC (buf) != NULL)
+                       {
+                         unsigned long r_symndx;
+-                        asection *sym_sec = NULL;
+ #ifdef BFD64
+                         if (ptr_size == 8)
+@@ -683,7 +687,9 @@
+                         else
+ #endif
+                           r_symndx = ELF32_R_SYM (cookie->rel->r_info);
+-                        if (r_symndx >= cookie->locsymcount)
++                        if (r_symndx >= cookie->locsymcount
++                            || ELF_ST_BIND (cookie->locsyms[r_symndx]
++                                            .st_info) != STB_LOCAL)
+                           {
+                             struct elf_link_hash_entry *h;
+@@ -695,33 +701,29 @@
+                               h = (struct elf_link_hash_entry *)
+                                   h->root.u.i.link;
+-                            if (h->root.type == bfd_link_hash_defined
+-                                || h->root.type == bfd_link_hash_defweak)
+-                              {
+-                                cie->personality = h->root.u.def.value;
+-                                sym_sec = h->root.u.def.section;
+-                              }
++                            cie->personality.h = h;
+                           }
+                         else
+                           {
+-                            Elf_Internal_Shdr *symtab_hdr;
+                             Elf_Internal_Sym *sym;
++                            asection *sym_sec;
++                            bfd_vma val;
+-                            symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+-                            sym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+-                                                        1, r_symndx,
+-                                                        NULL, NULL, NULL);
+-                            if (sym != NULL)
++                            sym = &cookie->locsyms[r_symndx];
++                            sym_sec = (bfd_section_from_elf_index
++                                       (abfd, sym->st_shndx));
++                            if (sym_sec->kept_section != NULL)
++                              sym_sec = sym_sec->kept_section;
++                            if (sym_sec != NULL
++                                && sym_sec->output_section != NULL)
+                               {
+-                                cie->personality = sym->st_value;
+-                                sym_sec = (bfd_section_from_elf_index
+-                                           (abfd, sym->st_shndx));
+-                                free (sym);
++                                val = (sym->st_value
++                                       + sym_sec->output_offset
++                                       + sym_sec->output_section->vma);
++                                cie->personality.val = val;
++                                cie->local_personality = 1;
+                               }
+                           }
+-                        if (sym_sec != NULL)
+-                          cie->personality += (sym_sec->output_section->vma
+-                                               + sym_sec->output_offset);
+                         /* Cope with MIPS-style composite relocations.  */
+                         do
+@@ -729,7 +731,7 @@
+                         while (GET_RELOC (buf) != NULL);
+                       }
+                     REQUIRE (skip_bytes (&buf, end, per_width));
+-                    REQUIRE (cie->personality);
++                    REQUIRE (cie->local_personality || cie->personality.h);
+                   }
+                   break;
+                 default:
This page took 0.039058 seconds and 4 git commands to generate.