Fix some nits shown up by objcopy.
authorAlan Modra <amodra@gmail.com>
Tue, 9 May 2000 00:43:44 +0000 (00:43 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 9 May 2000 00:43:44 +0000 (00:43 +0000)
bfd/ChangeLog
bfd/elf.c

index f1e4f033895d0acc23876456ec1a012b7dca3efd..1f11ad299cc3f9f4e73e2de0a72606bb5b912925 100644 (file)
@@ -1,3 +1,10 @@
+2000-05-09  Alan Modra  <alan@linuxcare.com.au>
+
+       * elf.c (bfd_section_from_shdr): Don't set use_rela_p if rela
+       section is empty.
+       (copy_private_bfd_data): Allow for space possibly taken up by elf
+       headers when calculating segment physical address from lma.
+
 2000-05-08  Alan Modra  <alan@linuxcare.com.au>
 
        * versados.c (versados_scan): Init stringlen and pass_2_done.
index 4c8846385282916068a7201c381851ced0a06dde..975b2b9cb37ca9b39cb667f3ba29d1bd934f88f8 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1354,8 +1354,9 @@ bfd_section_from_shdr (abfd, shindex)
        target_sect->rel_filepos = hdr->sh_offset;
        /* In the section to which the relocations apply, mark whether
           its relocations are of the REL or RELA variety.  */
-       elf_section_data (target_sect)->use_rela_p 
-         = (hdr->sh_type == SHT_RELA);
+       if (hdr->sh_size != 0)
+         elf_section_data (target_sect)->use_rela_p
+           = (hdr->sh_type == SHT_RELA);
        abfd->flags |= HAS_RELOC;
        return true;
       }
@@ -3744,7 +3745,7 @@ copy_private_bfd_data (ibfd, obfd)
         more to do.  */
 
       isec = 0;
-      matching_lma = false;
+      matching_lma = 0;
       suggested_lma = 0;
 
       for (j = 0, s = ibfd->sections; s != NULL; s = s->next)
@@ -3810,21 +3811,32 @@ copy_private_bfd_data (ibfd, obfd)
          free (sections);
          continue;
        }
-      else if (matching_lma != 0)
-       {
-         /* At least one section fits inside the current segment.
-            Keep it, but modify its physical address to match the
-            LMA of the first section that fitted.  */
-
-         m->p_paddr = matching_lma;
-       }
       else
        {
-         /* None of the sections fitted inside the current segment.
-            Change the current segment's physical address to match
-            the LMA of the first section.  */
+         if (matching_lma != 0)
+           {
+             /* At least one section fits inside the current segment.
+                Keep it, but modify its physical address to match the
+                LMA of the first section that fitted.  */
+
+             m->p_paddr = matching_lma;
+           }
+         else
+           {
+             /* None of the sections fitted inside the current segment.
+                Change the current segment's physical address to match
+                the LMA of the first section.  */
+
+             m->p_paddr = suggested_lma;
+           }
+
+         /* Offset the segment physical address from the lma to allow
+            for space taken up by elf headers.  */
+         if (m->includes_filehdr)
+           m->p_paddr -= iehdr->e_ehsize;
 
-         m->p_paddr = suggested_lma;
+         if (m->includes_phdrs)
+           m->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
        }
 
       /* Step Three: Loop over the sections again, this time assigning
@@ -3857,7 +3869,12 @@ copy_private_bfd_data (ibfd, obfd)
                    {
                      /* If the first section in a segment does not start at
                         the beginning of the segment, then something is wrong.  */
-                     if (os->lma != m->p_paddr)
+                     if (os->lma != (m->p_paddr
+                                     + (m->includes_filehdr
+                                        ? iehdr->e_ehsize : 0)
+                                     + (m->includes_phdrs
+                                        ? iehdr->e_phnum * iehdr->e_phentsize
+                                        : 0)))
                        abort ();
                    }
                  else