aboutsummaryrefslogtreecommitdiff
path: root/bfd/xcofflink.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-10-28 05:51:49 +0000
committerIan Lance Taylor <ian@airs.com>1995-10-28 05:51:49 +0000
commit697a8fe872e62288c77e9208c97027b9824dbf3a (patch)
tree58ffbef961e74151937eb22c101e973ecf2aa5a3 /bfd/xcofflink.c
parentdf72d2a57686b1c4f91cf8c0a01e758119438bae (diff)
downloadgdb-697a8fe872e62288c77e9208c97027b9824dbf3a.zip
gdb-697a8fe872e62288c77e9208c97027b9824dbf3a.tar.gz
gdb-697a8fe872e62288c77e9208c97027b9824dbf3a.tar.bz2
* xcofflink.c (xcoff_link_add_symbols): Handle csects in the
absolute section.
Diffstat (limited to 'bfd/xcofflink.c')
-rw-r--r--bfd/xcofflink.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c
index 9674563..883bdfd 100644
--- a/bfd/xcofflink.c
+++ b/bfd/xcofflink.c
@@ -1319,9 +1319,10 @@ xcoff_link_add_symbols (abfd, info)
enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
if (enclosing == NULL)
goto error_return;
- if ((bfd_vma) sym.n_value < enclosing->vma
- || ((bfd_vma) sym.n_value + aux.x_csect.x_scnlen.l
- > enclosing->vma + enclosing->_raw_size))
+ if (! bfd_is_abs_section (enclosing)
+ && ((bfd_vma) sym.n_value < enclosing->vma
+ || ((bfd_vma) sym.n_value + aux.x_csect.x_scnlen.l
+ > enclosing->vma + enclosing->_raw_size)))
{
(*_bfd_error_handler)
("%s: csect `%s' not in enclosing section",
@@ -1362,32 +1363,36 @@ xcoff_link_add_symbols (abfd, info)
could do a binary search here. FIXME. (XCOFF
unfortunately does not require that symbols be sorted
by address, or this would be a simple merge). */
- rel = reloc_info[enclosing->target_index].relocs;
- rel_csect = reloc_info[enclosing->target_index].csects;
- for (relindx = 0;
- relindx < enclosing->reloc_count;
- relindx++, rel++, rel_csect++)
+ if (enclosing->owner == abfd)
{
- if (*rel_csect == NULL
- && rel->r_vaddr >= csect->vma
- && rel->r_vaddr < csect->vma + csect->_raw_size)
+ rel = reloc_info[enclosing->target_index].relocs;
+ rel_csect = reloc_info[enclosing->target_index].csects;
+ for (relindx = 0;
+ relindx < enclosing->reloc_count;
+ relindx++, rel++, rel_csect++)
{
- csect->rel_filepos = (enclosing->rel_filepos
- + relindx * bfd_coff_relsz (abfd));
- break;
+ if (*rel_csect == NULL
+ && rel->r_vaddr >= csect->vma
+ && rel->r_vaddr < csect->vma + csect->_raw_size)
+ {
+ csect->rel_filepos = (enclosing->rel_filepos
+ + (relindx
+ * bfd_coff_relsz (abfd)));
+ break;
+ }
+ }
+ while (relindx < enclosing->reloc_count
+ && *rel_csect == NULL
+ && rel->r_vaddr >= csect->vma
+ && rel->r_vaddr < csect->vma + csect->_raw_size)
+ {
+ *rel_csect = csect;
+ csect->flags |= SEC_RELOC;
+ ++csect->reloc_count;
+ ++relindx;
+ ++rel;
+ ++rel_csect;
}
- }
- while (relindx < enclosing->reloc_count
- && *rel_csect == NULL
- && rel->r_vaddr >= csect->vma
- && rel->r_vaddr < csect->vma + csect->_raw_size)
- {
- *rel_csect = csect;
- csect->flags |= SEC_RELOC;
- ++csect->reloc_count;
- ++relindx;
- ++rel;
- ++rel_csect;
}
/* There are a number of other fields and section flags