diff options
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/coffcode.h | 25 | ||||
-rw-r--r-- | bfd/cofflink.c | 15 |
3 files changed, 42 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ba16b40..e708a19 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,15 @@ Wed May 21 17:15:50 1997 Ian Lance Taylor <ian@cygnus.com> + * coffcode.h (coff_slurp_symbol_table): If COFF_WITH_PE or + COFF_IMAGE_WITH_PE, don't subtract the section VMA from the symbol + value. + * coffgen.c (fixup_symbol_value): Add abfd parameter. Change all + callers. If PE file, don't add section VMA. + (coff_write_alien_symbol): If PE file, don't add section VMA. + * cofflink.c (_bfd_coff_link_input_bfd): Likewise. + (_bfd_coff_write_global_sym): Likewise. + (_bfd_coff_generic_relocate_section): Likewise. + * peicode.h: Add & 0xffffffff when using ImageBase in case bfd_vma is 64 bits. diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 941be95..633d31f 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -3408,8 +3408,15 @@ coff_slurp_symbol_table (abfd) section */ dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL; + +#if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE) + /* PE sets the symbol to a value relative to the + start of the section. */ + dst->symbol.value = src->u.syment.n_value; +#else dst->symbol.value = (src->u.syment.n_value - dst->symbol.section->vma); +#endif if (ISFCN ((src->u.syment.n_type))) { @@ -3448,8 +3455,16 @@ coff_slurp_symbol_table (abfd) /* Base the value as an index from the base of the section, if there is one. */ if (dst->symbol.section) - dst->symbol.value = (src->u.syment.n_value - - dst->symbol.section->vma); + { +#if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE) + /* PE sets the symbol to a value relative to the + start of the section. */ + dst->symbol.value = src->u.syment.n_value; +#else + dst->symbol.value = (src->u.syment.n_value + - dst->symbol.section->vma); +#endif + } else dst->symbol.value = src->u.syment.n_value; break; @@ -3545,10 +3560,16 @@ coff_slurp_symbol_table (abfd) case C_FCN: /* ".bf" or ".ef" */ case C_EFCN: /* physical end of function */ dst->symbol.flags = BSF_LOCAL; +#if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE) + /* PE sets the symbol to a value relative to the start + of the section. */ + dst->symbol.value = src->u.syment.n_value; +#else /* Base the value as an index from the base of the section. */ dst->symbol.value = (src->u.syment.n_value - dst->symbol.section->vma); +#endif break; case C_NULL: diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 7d1d505..c721bdf 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -1550,9 +1550,10 @@ _bfd_coff_link_input_bfd (finfo, input_bfd) if (isym.n_scnum > 0) { isym.n_scnum = (*secpp)->output_section->target_index; - isym.n_value += ((*secpp)->output_section->vma - + (*secpp)->output_offset - - (*secpp)->vma); + isym.n_value += (*secpp)->output_offset; + if (! obj_pe (finfo->output_bfd)) + isym.n_value += ((*secpp)->output_section->vma + - (*secpp)->vma); } /* The value of a C_FILE symbol is the symbol index of the @@ -2245,8 +2246,9 @@ _bfd_coff_write_global_sym (h, data) else isym.n_scnum = sec->target_index; isym.n_value = (h->root.u.def.value - + sec->vma + h->root.u.def.section->output_offset); + if (! obj_pe (finfo->output_bfd)) + isym.n_value += sec->vma; } break; @@ -2544,8 +2546,9 @@ _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd, sec = sections[symndx]; val = (sec->output_section->vma + sec->output_offset - + sym->n_value - - sec->vma); + + sym->n_value); + if (! obj_pe (output_bfd)) + val -= sec->vma; } } else |