diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-10-28 05:51:49 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-10-28 05:51:49 +0000 |
commit | 697a8fe872e62288c77e9208c97027b9824dbf3a (patch) | |
tree | 58ffbef961e74151937eb22c101e973ecf2aa5a3 /bfd/xcofflink.c | |
parent | df72d2a57686b1c4f91cf8c0a01e758119438bae (diff) | |
download | gdb-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.c | 57 |
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 |