If the LMA for a segment is known, use it for matching sections to segments.
Use the LMA when adjusting for inter-section alignment padding.
This commit is contained in:
parent
e0e8c97fe9
commit
f5ffc9190a
2 changed files with 17 additions and 10 deletions
|
@ -2,6 +2,10 @@
|
|||
|
||||
* elf.c (_bfd_elf_make_section_from_shdr): Set the LMA based on the
|
||||
p_paddr of the segment that contains it.
|
||||
(copy_private_bfd_data): If the LMA for a segment is known, use it
|
||||
for matching sections to segments.
|
||||
(assign_file_positions_for_segments): Use the LMA when adjusting
|
||||
for inter-section alignment padding.
|
||||
|
||||
2001-10-29 Kazu Hirata <kazu@hxi.com>
|
||||
|
||||
|
|
23
bfd/elf.c
23
bfd/elf.c
|
@ -3262,10 +3262,10 @@ assign_file_positions_for_segments (abfd)
|
|||
|
||||
/* The section may have artificial alignment forced by a
|
||||
link script. Notice this case by the gap between the
|
||||
cumulative phdr vma and the section's vma. */
|
||||
if (p->p_vaddr + p->p_memsz < sec->vma)
|
||||
cumulative phdr lma and the section's lma. */
|
||||
if (p->p_paddr + p->p_memsz < sec->lma)
|
||||
{
|
||||
bfd_vma adjust = sec->vma - (p->p_vaddr + p->p_memsz);
|
||||
bfd_vma adjust = sec->lma - (p->p_paddr + p->p_memsz);
|
||||
|
||||
p->p_memsz += adjust;
|
||||
off += adjust;
|
||||
|
@ -3994,16 +3994,19 @@ copy_private_bfd_data (ibfd, obfd)
|
|||
|
||||
/* Decide if the given section should be included in the given segment.
|
||||
A section will be included if:
|
||||
1. It is within the address space of the segment,
|
||||
1. It is within the address space of the segment -- we use the LMA
|
||||
if that is set for the segment and the VMA otherwise,
|
||||
2. It is an allocated segment,
|
||||
3. There is an output section associated with it,
|
||||
4. The section has not already been allocated to a previous segment. */
|
||||
#define INCLUDE_SECTION_IN_SEGMENT(section, segment) \
|
||||
((((IS_CONTAINED_BY_VMA (section, segment) \
|
||||
|| IS_SOLARIS_PT_INTERP (segment, section)) \
|
||||
&& (section->flags & SEC_ALLOC) != 0) \
|
||||
|| IS_COREFILE_NOTE (segment, section)) \
|
||||
&& section->output_section != NULL \
|
||||
#define INCLUDE_SECTION_IN_SEGMENT(section, segment) \
|
||||
(((((segment->p_paddr \
|
||||
? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
|
||||
: IS_CONTAINED_BY_VMA (section, segment)) \
|
||||
|| IS_SOLARIS_PT_INTERP (segment, section)) \
|
||||
&& (section->flags & SEC_ALLOC) != 0) \
|
||||
|| IS_COREFILE_NOTE (segment, section)) \
|
||||
&& section->output_section != NULL \
|
||||
&& section->segment_mark == false)
|
||||
|
||||
/* Returns true iff seg1 starts after the end of seg2. */
|
||||
|
|
Loading…
Reference in a new issue