aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2005-12-07 19:21:44 +0000
committerH.J. Lu <hjl.tools@gmail.com>2005-12-07 19:21:44 +0000
commitf28760375823ffa73dc8db93c6abf9d2e3148981 (patch)
tree3f8ae462659865f34ce2693a0219bb30d40bc249
parentfe21a8fc74862995effcdc1d994a1dec827ca3ac (diff)
downloadgdb-f28760375823ffa73dc8db93c6abf9d2e3148981.zip
gdb-f28760375823ffa73dc8db93c6abf9d2e3148981.tar.gz
gdb-f28760375823ffa73dc8db93c6abf9d2e3148981.tar.bz2
2005-12-07 H.J. Lu <hongjiu.lu@intel.com>
Andreas Schwab <schwab@suse.de> PR binutils/1991 * elf.c (assign_section_numbers): Always use the output section when setting up sh_link for SHF_LINK_ORDER.
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf.c21
2 files changed, 26 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e34e2db..3051cdc 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2005-12-07 H.J. Lu <hongjiu.lu@intel.com>
+ Andreas Schwab <schwab@suse.de>
+
+ PR binutils/1991
+ * elf.c (assign_section_numbers): Always use the output section
+ when setting up sh_link for SHF_LINK_ORDER.
+
2005-12-07 Thiemo Seufer <ths@networkno.de>
H.J. Lu <hongjiu.lu@intel.com>
diff --git a/bfd/elf.c b/bfd/elf.c
index ea86c3e..644ac6d 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3053,10 +3053,10 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
s = elf_linked_to_section (sec);
if (s)
{
+ /* elf_linked_to_section points to the input section. */
if (link_info != NULL)
{
- /* For linker, elf_linked_to_section points to the
- input section. */
+ /* Check discarded linkonce section. */
if (elf_discarded_section (s))
{
asection *kept;
@@ -3074,9 +3074,26 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
}
s = kept;
}
+ }
+ if (link_info != NULL)
+ {
+ /* Handle linker. */
s = s->output_section;
BFD_ASSERT (s != NULL);
}
+ else
+ {
+ /* Handle objcopy. */
+ if (s->output_section == NULL)
+ {
+ (*_bfd_error_handler)
+ (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
+ abfd, d->this_hdr.bfd_section, s, s->owner);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ s = s->output_section;
+ }
d->this_hdr.sh_link = elf_section_data (s)->this_idx;
}
else