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> 2002-01-03 Nick Clifton <nickc@cambridge.redhat.com>
* elf32-arm.h (elf32_arm_final_link_relocate): Handle * 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; boolean saw_contents;
int indx; int indx;
asection **op; asection **op, **prev;
file_ptr sofar; file_ptr sofar;
/* Insert .pad sections before every section which has /* Insert .pad sections before every section which has
contents and is loaded, if it is preceded by some other contents and is loaded, if it is preceded by some other
section which has contents and is loaded. */ section which has contents and is loaded. */
saw_contents = true; 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) if (strcmp ((*op)->name, ".pad") == 0)
saw_contents = false; saw_contents = false;
@ -3674,15 +3675,34 @@ _bfd_xcoff_bfd_final_link (abfd, info)
saw_contents = true; saw_contents = true;
else 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; hold = *op;
*op = NULL; st = abfd->section_tail;
n = bfd_make_section_anyway (abfd, ".pad"); n = bfd_make_section_anyway (abfd, ".pad");
BFD_ASSERT (*op == n);
n->next = hold;
n->flags = SEC_HAS_CONTENTS; 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; saw_contents = false;
} }
} }
@ -3958,17 +3978,6 @@ _bfd_xcoff_bfd_final_link (abfd, info)
goto error_return; 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 /* Write out all the global symbols which do not come from XCOFF
input files. */ input files. */
xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_link_hash_traverse (xcoff_hash_table (info),