2007-12-24 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 24 Dec 2007 16:55:39 +0000 (16:55 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 24 Dec 2007 16:55:39 +0000 (16:55 +0000)
PR binutils/5449
* elf.c (rewrite_elf_program_header): Don't adjust p_paddr if
p_paddr is set to 0.
(copy_private_bfd_data): Call rewrite_elf_program_header if
p_paddr is set to 0.

* elfcode.h (elf_swap_phdr_out): Set p_paddr to 0 if needed.

* elfxx-ia64.c (ELF_MAXPAGESIZE): Don't redefine it for HPUX.

bfd/ChangeLog
bfd/elf.c
bfd/elfcode.h
bfd/elfxx-ia64.c

index bd611041f882238a1e69dc3076b52bfb9e4a4b15..8ebd721a2df26f5dfd6e387fe834151e139c3f19 100644 (file)
@@ -1,3 +1,15 @@
+2007-12-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/5449
+       * elf.c (rewrite_elf_program_header): Don't adjust p_paddr if
+       p_paddr is set to 0.
+       (copy_private_bfd_data): Call rewrite_elf_program_header if
+       p_paddr is set to 0.
+
+       * elfcode.h (elf_swap_phdr_out): Set p_paddr to 0 if needed.
+
+       * elfxx-ia64.c (ELF_MAXPAGESIZE): Don't redefine it for HPUX.
+
 2007-12-21  Bob Wilson  <bob.wilson@acm.org>
 
        * elf32-xtensa.c (relax_section): Update DIFF relocations in the
index f0b2e4d9fa1ec3bd0a663e36009274d6f75eb865..a4607e50fb963609e723c249afa964bde84f4e9b 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5392,9 +5392,13 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
       first_matching_lma = TRUE;
       first_suggested_lma = TRUE;
 
-      for (j = 0, section = ibfd->sections;
+      for (section = ibfd->sections;
           section != NULL;
           section = section->next)
+       if (section == first_section)
+         break;
+
+      for (j = 0; section != NULL; section = section->next)
        {
          if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
            {
@@ -5444,6 +5448,9 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
                  suggested_lma = output_section->lma;
                  first_suggested_lma = FALSE;
                }
+
+             if (j == section_count)
+               break;
            }
        }
 
@@ -5461,7 +5468,8 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
          *pointer_to_map = map;
          pointer_to_map = &map->next;
 
-         if (matching_lma != map->p_paddr
+         if (!bed->want_p_paddr_set_to_zero
+             && matching_lma != map->p_paddr
              && !map->includes_filehdr && !map->includes_phdrs)
            /* There is some padding before the first section in the
               segment.  So, we must account for that in the output
@@ -5815,6 +5823,13 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
       asection *section, *osec;
       unsigned int i, num_segments;
       Elf_Internal_Shdr *this_hdr;
+      const struct elf_backend_data *bed;
+
+      bed = get_elf_backend_data (ibfd);
+
+      /* Regenerate the segment map if p_paddr is set to 0.  */
+      if (bed->want_p_paddr_set_to_zero)
+       goto rewrite;
 
       /* Initialize the segment mark field.  */
       for (section = obfd->sections; section != NULL;
index ea2a6d3dadadc2fe1ad4c7f98a8e9b14811d34ee..969c25aa0cbaea9452f4abc2a8d765410a228516 100644 (file)
@@ -370,11 +370,17 @@ elf_swap_phdr_out (bfd *abfd,
                   const Elf_Internal_Phdr *src,
                   Elf_External_Phdr *dst)
 {
+  const struct elf_backend_data *bed;
+  bfd_vma p_paddr;
+
+  bed = get_elf_backend_data (abfd);
+  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
+
   /* note that all elements of dst are *arrays of unsigned char* already...  */
   H_PUT_32 (abfd, src->p_type, dst->p_type);
   H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
   H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
-  H_PUT_WORD (abfd, src->p_paddr, dst->p_paddr);
+  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
   H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
   H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
   H_PUT_32 (abfd, src->p_flags, dst->p_flags);
index 0c975c551c61ac18abd85055edea67d8f575144e..5aa1a0ab3910710f27eb767b78b4293844c3f7ea 100644 (file)
@@ -5715,8 +5715,6 @@ elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
 #undef  elf_backend_want_p_paddr_set_to_zero
 #define elf_backend_want_p_paddr_set_to_zero 1
 
-#undef  ELF_MAXPAGESIZE
-#define ELF_MAXPAGESIZE                 0x1000  /* 4K */
 #undef ELF_COMMONPAGESIZE
 #undef ELF_OSABI
 #define ELF_OSABI                      ELFOSABI_HPUX