[PATCH] Prevent local labels from showing on the symbol table in arm coff targets.
Pedro Alves
pedro_alves@portugalmail.pt
Mon Oct 23 02:14:00 GMT 2006
Hi guys,
(Sorry for the big message, ChangeLog at the end.)
All arm coff based targets are currently putting local labels in the
symbol table,
provided there is a reloc against them.
Ex, arm-coff (local label prefix == ""):
$cat local_label.s
.text
Lused_label:
.word Lused_label
$arm-unknown-coff-as local_label.s -o local_label.o
$arm-unknown-coff-nm local_label.o
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 t Lused_label
The problem is that when gas attempts to convert symbol relocs into
section symbol relocs, in write.c:adjust_reloc_syms,
arm_fix_adjustable in tc-arm.c for coff is too restrictive:
#ifdef OBJ_COFF
bfd_boolean
arm_fix_adjustable (fixS * fixP)
{
(void)fixP;
/* This is a little hack to help the gas/arm/adrl.s test. It prevents
local labels from being added to the output symbol table when they
are used with the ADRL pseudo op. The ADRL relocation should always
be resolved before the binbary is emitted, so it is safe to say that
it is adjustable. */
if (fixP->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
return 1;
/* This is a hack for the gas/all/redef2.s test. This test causes
symbols
to be cloned, and without this test relocs would still be generated
against the original, pre-cloned symbol. Such symbols would not
appear
in the symbol table however, and so a valid reloc could not be
generated. So check to see if the fixup is against a symbol which has
been removed from the symbol chain, and if it is, then allow it to be
adjusted into a reloc against a section symbol. */
if (fixP->fx_addsy != NULL
&& ! S_IS_LOCAL (fixP->fx_addsy)
&& symbol_next (fixP->fx_addsy) == NULL
&& symbol_next (fixP->fx_addsy) == symbol_previous (fixP->fx_addsy))
return 1;
return 0;
}
#endif
If I disable those two hacks that return 1, and just return 0 always, I
don't see
the failures the comments mention, in arm-coff, arm-pe, arm-wince-pe,
and arm-epoc-pe, so presumably, something must have removed the need for
those hacks.
The elf version of arm_fix_adjustable takes the reverse approach. It
returns 1
for all but a few cases:
bfd_boolean
arm_fix_adjustable (fixS * fixP)
{
if (fixP->fx_addsy == NULL)
return 1;
/* Preserve relocations against symbols with function type. */
if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
return 0;
if (THUMB_IS_FUNC (fixP->fx_addsy)
&& fixP->fx_subsy == NULL)
return 0;
/* We need the symbol name for the VTABLE entries. */
if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
|| fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
return 0;
/* Don't allow symbols to be discarded on GOT related relocs. */
if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
|| fixP->fx_r_type == BFD_RELOC_ARM_GOT32
|| fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
|| fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
|| fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
|| fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
|| fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
|| fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
|| fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
return 0;
/* Similarly for group relocations. */
if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
&& fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
|| fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
return 0;
return 1;
}
The attached proposed patch makes coff use the elf version too. I tested on
arm-coff, arm-pe, arm-wince-pe, arm-epoc-pe, and arm-none-eabi, and built a
ratter big app (c++) that uses dlls on wince with a fully rebuilt
arm-wince toolchain.
I don't use thumb, though.
No regressions showed up, and it fixes the problem of local labels
cluttering
the symbol table. Eg, after patch applied:
$arm-unknown-coff-nm local_label.o
00000000 b .bss
00000000 d .data
00000000 t .text
I didn't wrap the got related relocs and the group relocation relocs
in OBJ_ELF, as I have the impression that binutils is moving in the
direction of moving away from conditionally compiled code to runtime checks.
The separate test for Windows CE, is because local labels are prefixed
with "."
like on elf (if my previous patch is committed), but the section symbols
are left
on the symbol table, unlike elf.
Please review and commit.
Cheers,
Pedro Alves
---
gas/ChangeLog
2006-10-22 Pedro Alves <pedro_alves@portugalmail.pt>
* config/tc-arm.c (arm_fix_adjustable) [OBJ_COFF]: Delete.
(arm_fix_adjustable) [OBJ_ELF]: Use it on coff targets too.
gas/testsuite/ChangeLog
2006-10-22 Pedro Alves <pedro_alves@portugalmail.pt>
* gas/arm/local_label_coff.s: New test.
* gas/arm/local_label_coff.d: New test.
* gas/arm/local_label_elf.s: New test.
* gas/arm/local_label_elf.d: New test.
* gas/arm/local_label_wince.s: New test.
* gas/arm/local_label_wince.d: New test.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: gas.diff
URL: <https://sourceware.org/pipermail/binutils/attachments/20061023/c2659461/attachment.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: testsuite.diff
URL: <https://sourceware.org/pipermail/binutils/attachments/20061023/c2659461/attachment-0001.ksh>
More information about the Binutils
mailing list