possible bug in coffcode.h
Nick Clifton
nickc@cambridge.redhat.com
Thu Mar 14 02:42:00 GMT 2002
Hi Guy,
> There seems to be a bug in bfd/coffcode.h, in v2.12 and previous
> versions. If you compile the following program on a generic COFF
> target:
(Which COFF target are you using ? The ones I tried did not support
the weak attribute).
> The problem seems to be with line 4455 in coffcode.h:
>
> dst->symbol.flags = BSF_WEAK;
>
> This over-writes the BSF_NOT_AT_END | BSF_FUNCTION flags set at line
> 4404. Consequently, symbol _f2 gets moved when it shouldn't.
>
> To correct the problem, change line 4455 to OR in the BSF_WEAK flag.
I agree that this does appear to be the case. Since I cannot
reproduce this bug myself, please could try applying the patch below
to your sources and then rebuilding the linker and see if it really
does fix the problem. If it does, let me know, and I will check it
in.
Cheers
Nick
Index: bfd/coffcode.h
===================================================================
RCS file: /cvs/src/src/bfd/coffcode.h,v
retrieving revision 1.69
diff -c -3 -p -w -r1.69 coffcode.h
*** coffcode.h 2002/02/06 16:29:28 1.69
--- coffcode.h 2002/03/14 10:38:54
*************** coff_slurp_symbol_table (abfd)
*** 4443,4458 ****
#ifdef COFF_WITH_PE
if (src->u.syment.n_sclass == C_NT_WEAK)
! dst->symbol.flags = BSF_WEAK;
if (src->u.syment.n_sclass == C_SECTION
&& src->u.syment.n_scnum > 0)
- {
dst->symbol.flags = BSF_LOCAL;
- }
#endif
-
if (src->u.syment.n_sclass == C_WEAKEXT)
! dst->symbol.flags = BSF_WEAK;
break;
--- 4443,4456 ----
#ifdef COFF_WITH_PE
if (src->u.syment.n_sclass == C_NT_WEAK)
! dst->symbol.flags |= BSF_WEAK;
!
if (src->u.syment.n_sclass == C_SECTION
&& src->u.syment.n_scnum > 0)
dst->symbol.flags = BSF_LOCAL;
#endif
if (src->u.syment.n_sclass == C_WEAKEXT)
! dst->symbol.flags |= BSF_WEAK;
break;
More information about the Binutils
mailing list