Turn a weak symbol into an external symbol for a non-shared, non-relocatable

link.
This commit is contained in:
Nick Clifton 2000-07-03 18:45:18 +00:00
parent 289c596cac
commit e42026815e
2 changed files with 36 additions and 15 deletions

View File

@ -1,3 +1,15 @@
2000-07-03 Mark Elbrecht <snowball3@bigfoot.com>
* cofflink.c (_bfd_coff_write_global_sym): Turn a weak symbol into
an external symbol for a non-shared, non-relocatable link.
2000-07-03 Nick Clifton <nickc@redhat.com>
(IS_EXTERNAL): New macro: Return true if the symbol is an external
symbol.
(IS_WEAK_EXTERNAL): New macro: Return true if the symbol is a weak
external symbol.
2000-07-03 Kazu Hirata <kazu@hxi.com> 2000-07-03 Kazu Hirata <kazu@hxi.com>
* reloc16.c: Fix formatting. * reloc16.c: Fix formatting.

View File

@ -40,6 +40,15 @@ static int process_embedded_commands
PARAMS ((bfd *, struct bfd_link_info *, bfd *)); PARAMS ((bfd *, struct bfd_link_info *, bfd *));
static void mark_relocs PARAMS ((struct coff_final_link_info *, bfd *)); static void mark_relocs PARAMS ((struct coff_final_link_info *, bfd *));
/* Return true if SYM is a weak, external symbol. */
#define IS_WEAK_EXTERNAL(abfd, sym) \
((sym).n_sclass == C_WEAKEXT \
|| (obj_pe (abfd) && (sym).n_sclass == C_NT_WEAK))
/* Return true if SYM is an external symbol. */
#define IS_EXTERNAL(abfd, sym) \
((sym).n_sclass == C_EXT || IS_WEAK_EXTERNAL (abfd, sym))
/* Define macros so that the ISFCN, et. al., macros work correctly. /* Define macros so that the ISFCN, et. al., macros work correctly.
These macros are defined in include/coff/internal.h in terms of These macros are defined in include/coff/internal.h in terms of
N_TMASK, etc. These definitions require a user to define local N_TMASK, etc. These definitions require a user to define local
@ -395,8 +404,7 @@ coff_link_add_symbols (abfd, info)
break; break;
} }
if (sym.n_sclass == C_WEAKEXT if (IS_WEAK_EXTERNAL (abfd, sym))
|| (obj_pe (abfd) && sym.n_sclass == C_NT_WEAK))
flags = BSF_WEAK; flags = BSF_WEAK;
addit = true; addit = true;
@ -1834,11 +1842,7 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
/* If doing task linking, convert normal global function symbols to /* If doing task linking, convert normal global function symbols to
static functions. */ static functions. */
if (finfo->info->task_link && IS_EXTERNAL (input_bfd, isym))
if (finfo->info->task_link
&& (isym.n_sclass == C_EXT
|| isym.n_sclass == C_WEAKEXT
|| (obj_pe (input_bfd) && isym.n_sclass == C_NT_WEAK)))
isym.n_sclass = C_STAT; isym.n_sclass = C_STAT;
/* Output the symbol. */ /* Output the symbol. */
@ -2551,15 +2555,20 @@ _bfd_coff_write_global_sym (h, data)
output during a later pass. */ output during a later pass. */
if (finfo->global_to_static) if (finfo->global_to_static)
{ {
if (isym.n_sclass != C_EXT if (! IS_EXTERNAL (output_bfd, isym))
&& isym.n_sclass != C_WEAKEXT
&& (! obj_pe (output_bfd) || isym.n_sclass != C_NT_WEAK))
{
return true; return true;
}
isym.n_sclass = C_STAT; isym.n_sclass = C_STAT;
} }
/* When a weak symbol is not overriden by a strong one,
turn it into an external symbol when not building a
shared or relocateable object. */
if (! finfo->info->shared
&& ! finfo->info->relocateable
&& IS_WEAK_EXTERNAL (finfo->output_bfd, isym))
isym.n_sclass = C_EXT;
isym.n_numaux = h->numaux; isym.n_numaux = h->numaux;
bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) finfo->outsyms); bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) finfo->outsyms);