Turn a weak symbol into an external symbol for a non-shared, non-relocatable
link.
This commit is contained in:
parent
289c596cac
commit
e42026815e
@ -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.
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user