diff options
-rw-r--r-- | bfd/ChangeLog | 3 | ||||
-rw-r--r-- | bfd/coffcode.h | 12 |
2 files changed, 13 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e358175..df32dda 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -12,6 +12,9 @@ function symbols. * syms.c (BSF_DEBUGGING_RELOC): Define. + * coffcode.h (coff_slurp_symbol_table): If PE, set BSF_DEBUGGING + for C_FCN/C_EFCN symbols, and set BSF_DEBUGGING_RELOC for such + symbols named .bf. * coffgen.c (fixup_symbol_value): Relocate a symbol which has BSF_DEBUGGING_RELOC set. * bfd-in2.h: Rebuild. diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 36bf3e7..eac8e84 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -4139,16 +4139,24 @@ coff_slurp_symbol_table (abfd) #endif case C_BLOCK: /* ".bb" or ".eb" */ - case C_FCN: /* ".bf" or ".ef" */ + case C_FCN: /* ".bf" or ".ef" (or PE ".lf") */ case C_EFCN: /* physical end of function */ - dst->symbol.flags = BSF_LOCAL; #if defined COFF_WITH_PE /* PE sets the symbol to a value relative to the start of the section. */ dst->symbol.value = src->u.syment.n_value; + if (strcmp (dst->symbol.name, ".bf") != 0) + { + /* PE uses funny values for .ef and .lf; don't + relocate them. */ + dst->symbol.flags = BSF_DEBUGGING; + } + else + dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC; #else /* Base the value as an index from the base of the section. */ + dst->symbol.flags = BSF_LOCAL; dst->symbol.value = (src->u.syment.n_value - dst->symbol.section->vma); #endif |