Fix some nits shown up by objcopy.

This commit is contained in:
Alan Modra 2000-05-09 00:43:44 +00:00
parent b9791fcdd6
commit 72730e0ced
2 changed files with 40 additions and 16 deletions

View 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.

View File

@ -1354,6 +1354,7 @@ 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. */
if (hdr->sh_size != 0)
elf_section_data (target_sect)->use_rela_p
= (hdr->sh_type == SHT_RELA);
abfd->flags |= HAS_RELOC;
@ -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,7 +3811,9 @@ copy_private_bfd_data (ibfd, obfd)
free (sections);
continue;
}
else if (matching_lma != 0)
else
{
if (matching_lma != 0)
{
/* At least one section fits inside the current segment.
Keep it, but modify its physical address to match the
@ -3827,6 +3830,15 @@ copy_private_bfd_data (ibfd, obfd)
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;
if (m->includes_phdrs)
m->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
}
/* Step Three: Loop over the sections again, this time assigning
those that fit to the current segment and remvoing them from the
sections array; but making sure not to leave large gaps. Once all
@ -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