Fix an orphan section problem caused by weird linker scripts.

This commit is contained in:
Alan Modra
2000-09-07 09:09:19 +00:00
parent 71bfc0aef6
commit ed15ac6a0a
2 changed files with 24 additions and 20 deletions

View File

@ -4,6 +4,7 @@
broken list handling. Create __start_SECNAME and __stop_SECNAME broken list handling. Create __start_SECNAME and __stop_SECNAME
when no place-holder. Add some comments. Test both SEC_CODE and when no place-holder. Add some comments. Test both SEC_CODE and
SEC_READONLY for hold_text to prevent .rodata orphan poisoning. SEC_READONLY for hold_text to prevent .rodata orphan poisoning.
Handle case where no output section statement created.
2000-09-07 Niibe Yutaka <gniibe@m17n.org>, Kaz Kojima <kkojima@rr.iij4u.or.jp>, Alexandre Oliva <aoliva@redhat.com> 2000-09-07 Niibe Yutaka <gniibe@m17n.org>, Kaz Kojima <kkojima@rr.iij4u.or.jp>, Alexandre Oliva <aoliva@redhat.com>

View File

@ -1203,29 +1203,32 @@ gld${EMULATION_NAME}_place_orphan (file, s)
} }
place->section = &snew->next; /* Save the end of this list. */ place->section = &snew->next; /* Save the end of this list. */
/* We try to put the output statements in some sort of if (add.head != NULL)
reasonable order here, because they determine the final load
addresses of the orphan sections. */
if (place->stmt == NULL)
{ {
/* Put the new statement list right at the head. */ /* We try to put the output statements in some sort of
*add.tail = place->os->header.next; reasonable order here, because they determine the final
place->os->header.next = add.head; load addresses of the orphan sections. */
} if (place->stmt == NULL)
else {
{ /* Put the new statement list right at the head. */
/* Put it after the last orphan statement we added. */ *add.tail = place->os->header.next;
*add.tail = *place->stmt; place->os->header.next = add.head;
*place->stmt = add.head; }
} else
{
/* Put it after the last orphan statement we added. */
*add.tail = *place->stmt;
*place->stmt = add.head;
}
/* Fix the global list pointer if we happened to tack our new /* Fix the global list pointer if we happened to tack our
list at the tail. */ new list at the tail. */
if (*old->tail == add.head) if (*old->tail == add.head)
old->tail = add.tail; old->tail = add.tail;
/* Save the end of this list. */ /* Save the end of this list. */
place->stmt = add.tail; place->stmt = add.tail;
}
} }
return true; return true;