summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2004-05-07 06:28:39 +0000
committerAlexandre Oliva <aoliva@redhat.com>2004-05-07 06:28:39 +0000
commitdfab3864837abc6ac5445b829fe4fa496fea5570 (patch)
tree6471c28042dba563b8f56f01d466029f5e56bb1f
parent777f2fd860b7c97d68a1ba1e0c582307a5620bd3 (diff)
downloadgdb-dfab3864837abc6ac5445b829fe4fa496fea5570.tar.gz
* elf32-frv.c (elf32_frvfdpic_modify_segment_map): Return
immediately if there's no link info. (elf32_frvfdpic_copy_private_bfd_data): New. (bfd_elf32_bfd_copy_private_bfd_data): Use it for frvfdpic.
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf32-frv.c52
2 files changed, 59 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 26745e227a5..b124a751981 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2004-05-07 Alexandre Oliva <aoliva@redhat.com>
+
+ * elf32-frv.c (elf32_frvfdpic_modify_segment_map): Return
+ immediately if there's no link info.
+ (elf32_frvfdpic_copy_private_bfd_data): New.
+ (bfd_elf32_bfd_copy_private_bfd_data): Use it for frvfdpic.
+
2004-05-06 Zack Weinberg <zack@codesourcery.com>
* dwarf2.c (add_line_info): Also set info->filename to NULL if
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
index f00976f793e..59a312be8e2 100644
--- a/bfd/elf32-frv.c
+++ b/bfd/elf32-frv.c
@@ -3686,6 +3686,11 @@ elf32_frvfdpic_modify_segment_map (bfd *output_bfd,
{
struct elf_segment_map *m;
+ /* objcopy and strip preserve what's already there using
+ elf32_frvfdpic_copy_private_bfd_data (). */
+ if (! info)
+ return TRUE;
+
for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
if (m->p_type == PT_GNU_STACK)
break;
@@ -4311,6 +4316,50 @@ frv_elf_arch_extension_p (flagword base, flagword extension)
return FALSE;
}
+static bfd_boolean
+elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
+{
+ unsigned i;
+
+ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+ || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+ return TRUE;
+
+ if (! frv_elf_copy_private_bfd_data (ibfd, obfd))
+ return FALSE;
+
+ if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
+ || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
+ return TRUE;
+
+ /* Copy the stack size. */
+ for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
+ if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
+ {
+ Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
+
+ for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
+ if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
+ {
+ memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
+
+ /* Rewrite the phdrs, since we're only called after they
+ were first written. */
+ if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
+ ->s->sizeof_ehdr, SEEK_SET) != 0
+ || get_elf_backend_data (obfd)->s
+ ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
+ elf_elfheader (obfd)->e_phnum) != 0)
+ return FALSE;
+ break;
+ }
+
+ break;
+ }
+
+ return TRUE;
+}
+
/* Merge backend specific data from an object file to the output
object file when linking. */
@@ -4726,6 +4775,9 @@ frv_elf_print_private_bfd_data (abfd, ptr)
#undef elf_backend_modify_segment_map
#define elf_backend_modify_segment_map \
elf32_frvfdpic_modify_segment_map
+#undef bfd_elf32_bfd_copy_private_bfd_data
+#define bfd_elf32_bfd_copy_private_bfd_data \
+ elf32_frvfdpic_copy_private_bfd_data
#undef elf_backend_create_dynamic_sections
#define elf_backend_create_dynamic_sections \