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;
@ -1833,12 +1841,8 @@ _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. */
@ -2548,18 +2552,23 @@ _bfd_coff_write_global_sym (h, data)
/* If doing task linking and this is the pass where we convert /* If doing task linking and this is the pass where we convert
defined globals to statics, then do that conversion now. If the defined globals to statics, then do that conversion now. If the
symbol is not being converted, just ignore it and it will be symbol is not being converted, just ignore it and it will be
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 return true;
&& (! obj_pe (output_bfd) || isym.n_sclass != C_NT_WEAK))
{
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);