* coffcode.h (bfd_coff_backend_data): Add new field
_bfd_coff_print_aux. (bfd_coff_print_aux): New static function. (coff_pointerize_aux_hook (RS6000COFF_C version)): Pointerize the scnlen field of an XTY_LD csect aux entry. (coff_print_aux): New static function. (coff_slurp_symbol_table): Don't pointerize scnlen field; now done in coff_pointerize_aux_hook. (bfd_coff_std_swap_table): Initialize new field. * coffgen.c (coff_print_symbol): Call bfd_coff_print_aux. * libcoff.h: Rebuild. * coff-alpha.c (alpha_ecoff_backend_data): Initialize new field. * coff-mips.c (mips_ecoff_backend_data): Likewise.
This commit is contained in:
parent
7860fe3846
commit
0fc9ada91e
4 changed files with 115 additions and 26 deletions
|
@ -8,6 +8,20 @@ Fri Oct 6 12:24:47 1995 Michael Meissner <meissner@tiktok.cygnus.com>
|
|||
|
||||
Fri Oct 6 12:04:02 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
* coffcode.h (bfd_coff_backend_data): Add new field
|
||||
_bfd_coff_print_aux.
|
||||
(bfd_coff_print_aux): New static function.
|
||||
(coff_pointerize_aux_hook (RS6000COFF_C version)): Pointerize the
|
||||
scnlen field of an XTY_LD csect aux entry.
|
||||
(coff_print_aux): New static function.
|
||||
(coff_slurp_symbol_table): Don't pointerize scnlen field; now done
|
||||
in coff_pointerize_aux_hook.
|
||||
(bfd_coff_std_swap_table): Initialize new field.
|
||||
* coffgen.c (coff_print_symbol): Call bfd_coff_print_aux.
|
||||
* libcoff.h: Rebuild.
|
||||
* coff-alpha.c (alpha_ecoff_backend_data): Initialize new field.
|
||||
* coff-mips.c (mips_ecoff_backend_data): Likewise.
|
||||
|
||||
* coffcode.h (coff_write_object_contents): On AIX, clear F_RELFLG
|
||||
if there are symbols, for native AIX ld compatibility.
|
||||
|
||||
|
|
110
bfd/coffcode.h
110
bfd/coffcode.h
|
@ -265,7 +265,7 @@ CODE_FRAGMENT
|
|||
.unsigned int fix_end : 1;
|
||||
.
|
||||
. {* Should the x_csect.x_scnlen field be renumbered.
|
||||
. Created by coff_slurp_symbol_table. *}
|
||||
. Created by coff_pointerize_aux. *}
|
||||
.unsigned int fix_scnlen : 1;
|
||||
.
|
||||
. {* The container for the symbol structure as read and translated
|
||||
|
@ -655,6 +655,13 @@ dependent COFF routines:
|
|||
. combined_entry_type *symbol,
|
||||
. unsigned int indaux,
|
||||
. combined_entry_type *aux));
|
||||
. boolean (*_bfd_coff_print_aux) PARAMS ((
|
||||
. bfd *abfd,
|
||||
. FILE *file,
|
||||
. combined_entry_type *table_base,
|
||||
. combined_entry_type *symbol,
|
||||
. combined_entry_type *aux,
|
||||
. unsigned int indaux));
|
||||
. void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
|
||||
. bfd *abfd,
|
||||
. struct bfd_link_info *link_info,
|
||||
|
@ -775,6 +782,10 @@ dependent COFF routines:
|
|||
.#define bfd_coff_symname_in_debug(abfd, sym)\
|
||||
. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
|
||||
.
|
||||
.#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
|
||||
. ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
|
||||
. (abfd, file, base, symbol, aux, indaux))
|
||||
.
|
||||
.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
|
||||
. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
|
||||
. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
|
||||
|
@ -1177,8 +1188,7 @@ symname_in_debug_hook (abfd, sym)
|
|||
|
||||
#ifdef RS6000COFF_C
|
||||
|
||||
/* We don't want to pointerize the csect auxent of a C_EXT or C_HIDEXT
|
||||
symbol. */
|
||||
/* Handle the csect auxent of a C_EXT or C_HIDEXT symbol. */
|
||||
|
||||
static boolean coff_pointerize_aux_hook
|
||||
PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
|
||||
|
@ -1195,11 +1205,24 @@ coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
|
|||
{
|
||||
int class = symbol->u.syment.n_sclass;
|
||||
|
||||
/* Return true if we don't want to pointerize this aux entry, which
|
||||
is the case for the last aux entry for a C_EXT or C_HIDEXT
|
||||
symbol. */
|
||||
return ((class == C_EXT || class == C_HIDEXT)
|
||||
&& indaux + 1 == symbol->u.syment.n_numaux);
|
||||
if ((class == C_EXT || class == C_HIDEXT)
|
||||
&& indaux + 1 == symbol->u.syment.n_numaux)
|
||||
{
|
||||
if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
|
||||
{
|
||||
aux->u.auxent.x_csect.x_scnlen.p =
|
||||
table_base + aux->u.auxent.x_csect.x_scnlen.l;
|
||||
aux->fix_scnlen = 1;
|
||||
}
|
||||
|
||||
/* Return true to indicate that the caller should not do any
|
||||
further work on this auxent. */
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Return false to indicate that this auxent should be handled by
|
||||
the caller. */
|
||||
return false;
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -1232,6 +1255,59 @@ coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
|
|||
#endif /* ! I960 */
|
||||
#endif /* ! RS6000COFF_C */
|
||||
|
||||
/* Print an aux entry. This returns true if it has printed it. */
|
||||
|
||||
static boolean coff_print_aux
|
||||
PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
|
||||
combined_entry_type *, unsigned int));
|
||||
|
||||
static boolean
|
||||
coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
|
||||
bfd *abfd;
|
||||
FILE *file;
|
||||
combined_entry_type *table_base;
|
||||
combined_entry_type *symbol;
|
||||
combined_entry_type *aux;
|
||||
unsigned int indaux;
|
||||
{
|
||||
#ifdef RS6000COFF_C
|
||||
if ((symbol->u.syment.n_sclass == C_EXT
|
||||
|| symbol->u.syment.n_sclass == C_HIDEXT)
|
||||
&& indaux + 1 == symbol->u.syment.n_numaux)
|
||||
{
|
||||
/* This is a csect entry. */
|
||||
fprintf (file, "AUX ");
|
||||
if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
|
||||
{
|
||||
BFD_ASSERT (! aux->fix_scnlen);
|
||||
fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (file, "indx ");
|
||||
if (! aux->fix_scnlen)
|
||||
fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
|
||||
else
|
||||
fprintf (file, "%4ld",
|
||||
(long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
|
||||
}
|
||||
fprintf (file,
|
||||
" prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
|
||||
aux->u.auxent.x_csect.x_parmhash,
|
||||
(unsigned int) aux->u.auxent.x_csect.x_snhash,
|
||||
SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
|
||||
SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
|
||||
(unsigned int) aux->u.auxent.x_csect.x_smclas,
|
||||
aux->u.auxent.x_csect.x_stab,
|
||||
(unsigned int) aux->u.auxent.x_csect.x_snstab);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Return false to indicate that no special action was taken. */
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
SUBSUBSECTION
|
||||
Writing relocations
|
||||
|
@ -2400,22 +2476,6 @@ coff_slurp_symbol_table (abfd)
|
|||
/* A C_HIDEXT symbol is not global. */
|
||||
if (src->u.syment.n_sclass == C_HIDEXT)
|
||||
dst->symbol.flags = BSF_LOCAL;
|
||||
|
||||
/* If this symbol has a csect aux of type LD, the scnlen
|
||||
field is actually the index of the containing csect
|
||||
symbol. We need to pointerize it. */
|
||||
if (src->u.syment.n_numaux > 0)
|
||||
{
|
||||
combined_entry_type *aux;
|
||||
|
||||
aux = src + src->u.syment.n_numaux - 1;
|
||||
if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
|
||||
{
|
||||
aux->u.auxent.x_csect.x_scnlen.p =
|
||||
native_symbols + aux->u.auxent.x_csect.x_scnlen.l;
|
||||
aux->fix_scnlen = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
break;
|
||||
|
@ -2908,7 +2968,7 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
|
|||
coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
|
||||
coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
|
||||
coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
|
||||
coff_reloc16_extra_cases, coff_reloc16_estimate,
|
||||
coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
|
||||
coff_sym_is_global, coff_compute_section_file_positions,
|
||||
coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
|
||||
coff_adjust_symndx
|
||||
|
|
|
@ -1725,6 +1725,10 @@ coff_print_symbol (abfd, filep, symbol, how)
|
|||
tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
|
||||
|
||||
fprintf (file, "\n");
|
||||
|
||||
if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
|
||||
continue;
|
||||
|
||||
switch (combined->u.syment.n_sclass)
|
||||
{
|
||||
case C_FILE:
|
||||
|
|
|
@ -264,7 +264,7 @@ unsigned int fix_tag : 1;
|
|||
unsigned int fix_end : 1;
|
||||
|
||||
/* Should the x_csect.x_scnlen field be renumbered.
|
||||
Created by coff_slurp_symbol_table. */
|
||||
Created by coff_pointerize_aux. */
|
||||
unsigned int fix_scnlen : 1;
|
||||
|
||||
/* The container for the symbol structure as read and translated
|
||||
|
@ -406,6 +406,13 @@ typedef struct
|
|||
combined_entry_type *symbol,
|
||||
unsigned int indaux,
|
||||
combined_entry_type *aux));
|
||||
boolean (*_bfd_coff_print_aux) PARAMS ((
|
||||
bfd *abfd,
|
||||
FILE *file,
|
||||
combined_entry_type *table_base,
|
||||
combined_entry_type *symbol,
|
||||
combined_entry_type *aux,
|
||||
unsigned int indaux));
|
||||
void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
|
||||
bfd *abfd,
|
||||
struct bfd_link_info *link_info,
|
||||
|
@ -526,6 +533,10 @@ typedef struct
|
|||
#define bfd_coff_symname_in_debug(abfd, sym)\
|
||||
((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
|
||||
|
||||
#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
|
||||
((coff_backend_info (abfd)->_bfd_coff_print_aux)\
|
||||
(abfd, file, base, symbol, aux, indaux))
|
||||
|
||||
#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
|
||||
((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
|
||||
(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
|
||||
|
|
Loading…
Reference in a new issue