PATCH: Preserve segment physical address only if needed

H. J. Lu hjl@lucon.org
Fri Nov 24 06:16:00 GMT 2006


On Fri, Nov 24, 2006 at 11:27:56AM +1030, Alan Modra wrote:
> On Thu, Nov 23, 2006 at 03:38:39PM -0800, H. J. Lu wrote:
> > I meant to say "segment physical address". The test is to check if the
> > first section isn't removed. If it isn't removed, we will preserve
> > segment physical address by setting
> > 
> > 	map->p_paddr = segment->p_paddr;
> > 	map->p_paddr_valid = 1;
> > 
> > The first section isn't removed only if first_section == NULL or
> > first_section->output_section != NULL.
> 
> Hmm, OK, that makes some sort of sense.  For the first part of your
> patch, can you explain why you didn't use something like
> 
>       for (section = ibfd->sections, section_count = 0;
> 	   section != NULL;
> 	   section = section->next)
> 	if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed)
> 	  {
> 	    ++section_count;
> 	    if (first_section == NULL)
> 	      first_section = section;
> 	  }

INCLUDE_SECTION_IN_SEGMENT has

	&& section->output_section != NULL 

This will set first_section to the first section in the output
segment, which isn't the first section in the input segment if it
has been removed. What we need to know is if the first section in the
input segment has been removed or not. Here is the updated comment.


H.J.
-----
2006-11-23  H.J. Lu  <hongjiu.lu@intel.com>

	* elf.c (rewrite_elf_program_header): Don't preserve segment
	physical address in the output segment if the first section in
	the corresponding input segment is removed.

--- bfd/elf.c.strip	2006-11-23 07:55:03.000000000 -0800
+++ bfd/elf.c	2006-11-23 22:10:17.000000000 -0800
@@ -5427,16 +5427,30 @@ rewrite_elf_program_header (bfd *ibfd, b
       bfd_vma       suggested_lma;
       unsigned int  j;
       bfd_size_type amt;
+      asection *    first_section;
 
       if (segment->p_type == PT_NULL)
 	continue;
 
+      first_section = NULL;
       /* Compute how many sections might be placed into this segment.  */
       for (section = ibfd->sections, section_count = 0;
 	   section != NULL;
 	   section = section->next)
-	if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
-	  ++section_count;
+	{
+	  /* Find the first section in the input segment.  */
+	  if (first_section == NULL)
+	    {
+	      Elf_Internal_Shdr *hdr;
+	      hdr = &(elf_section_data(section)->this_hdr);
+	      if ((bfd_vma) hdr->sh_offset == segment->p_offset
+		  && hdr->sh_addr == segment->p_vaddr
+		  && ELF_IS_SECTION_IN_SEGMENT_FILE (hdr, segment))
+		first_section = section;
+	    }
+	  if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
+	    ++section_count;
+	}
 
       /* Allocate a segment map big enough to contain
 	 all of the sections we have selected.  */
@@ -5452,8 +5466,14 @@ rewrite_elf_program_header (bfd *ibfd, b
       map->p_type        = segment->p_type;
       map->p_flags       = segment->p_flags;
       map->p_flags_valid = 1;
-      map->p_paddr       = segment->p_paddr;
-      map->p_paddr_valid = 1;
+      /* If the first section in the input segment is removed, there is
+	 no need to preserve segment physical address in the output
+	 segment.  */
+      if (!first_section || first_section->output_section != NULL)
+	{
+	  map->p_paddr = segment->p_paddr;
+	  map->p_paddr_valid = 1;
+	}
 
       /* Determine if this segment contains the ELF file header
 	 and if it contains the program headers themselves.  */



More information about the Binutils mailing list