Fix xcoff linker's ordering of pad sections

This commit is contained in:
Tom Rix 2002-01-03 22:06:38 +00:00
parent 741247bffa
commit 04b5af89ea
2 changed files with 35 additions and 21 deletions

View File

@ -1,3 +1,8 @@
2002-01-03 Tom Rix <trix@redhat.com>
* xcofflink.c (_bfd_xcoff_bfd_final_link): Update .pad section ordering
for recent bfd_make_section_anyway change.
2002-01-03 Nick Clifton <nickc@cambridge.redhat.com>
* elf32-arm.h (elf32_arm_final_link_relocate): Handle

View File

@ -3656,14 +3656,15 @@ _bfd_xcoff_bfd_final_link (abfd, info)
{
boolean saw_contents;
int indx;
asection **op;
asection **op, **prev;
file_ptr sofar;
/* Insert .pad sections before every section which has
contents and is loaded, if it is preceded by some other
section which has contents and is loaded. */
saw_contents = true;
for (op = &abfd->sections; *op != NULL; op = &(*op)->next)
for (op = &abfd->sections, prev = NULL;
*op != NULL; prev = op, op = &(*op)->next)
{
if (strcmp ((*op)->name, ".pad") == 0)
saw_contents = false;
@ -3674,20 +3675,39 @@ _bfd_xcoff_bfd_final_link (abfd, info)
saw_contents = true;
else
{
asection *n, *hold;
asection *n, *hold, **st;
/* Create a pad section and place it before the section
that needs padding. This requires unlinking and
relinking the bfd's sections list.
sections = S1
. S1.next = S2
. S2.next = S3
. S3.next = NULL
section_tail = &S3.next */
hold = *op;
*op = NULL;
st = abfd->section_tail;
n = bfd_make_section_anyway (abfd, ".pad");
BFD_ASSERT (*op == n);
n->next = hold;
n->flags = SEC_HAS_CONTENTS;
n->alignment_power = 0;
n->alignment_power = 0;
if (NULL == prev)
abfd->sections = n;
else
(*prev)->next = n;
n->next = hold;
*st = NULL;
abfd->section_tail = st;
saw_contents = false;
}
}
}
/* Reset the section indices after inserting the new
sections. */
indx = 0;
@ -3958,17 +3978,6 @@ _bfd_xcoff_bfd_final_link (abfd, info)
goto error_return;
}
/* init-fini */
if (info->init_function || info->fini_function)
{
struct xcoff_link_hash_entry *hrtinit;
hrtinit = xcoff_link_hash_lookup (xcoff_hash_table (info),
"__rtinit",
false, false, true);
}
/* Write out all the global symbols which do not come from XCOFF
input files. */
xcoff_link_hash_traverse (xcoff_hash_table (info),