1991-04-05 02:19:53 +08:00
|
|
|
/* b.out object file format
|
1996-02-08 03:36:48 +08:00
|
|
|
Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 1996
|
|
|
|
Free Software Foundation, Inc.
|
1992-11-24 04:42:33 +08:00
|
|
|
|
1992-02-13 16:33:54 +08:00
|
|
|
This file is part of GAS, the GNU Assembler.
|
1992-11-24 04:42:33 +08:00
|
|
|
|
1992-02-13 16:33:54 +08:00
|
|
|
GAS is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as
|
|
|
|
published by the Free Software Foundation; either version 2,
|
|
|
|
or (at your option) any later version.
|
1992-11-24 04:42:33 +08:00
|
|
|
|
1992-02-13 16:33:54 +08:00
|
|
|
GAS is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
|
|
|
the GNU General Public License for more details.
|
1992-11-24 04:42:33 +08:00
|
|
|
|
1992-02-13 16:33:54 +08:00
|
|
|
You should have received a copy of the GNU General Public
|
|
|
|
License along with GAS; see the file COPYING. If not, write
|
1995-07-07 05:18:08 +08:00
|
|
|
to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
1991-04-05 02:19:53 +08:00
|
|
|
|
|
|
|
#include "as.h"
|
|
|
|
#include "obstack.h"
|
1992-11-24 04:42:33 +08:00
|
|
|
const short /* in: segT out: N_TYPE bits */
|
|
|
|
seg_N_TYPE[] =
|
|
|
|
{
|
|
|
|
N_ABS,
|
|
|
|
N_TEXT,
|
|
|
|
N_DATA,
|
|
|
|
N_BSS,
|
|
|
|
N_UNDF, /* unknown */
|
|
|
|
N_UNDF, /* error */
|
* Extensive changes to permit symbols to contain any expression
type and to delay the computation of the expression until the
value is actually needed. This permits setting symbols to values
calculated based on object code size. Expressions were changed to
no longer be in a section, to stop the overloading of segment and
expression type that previously occurred.
* as.c (big_section, pass1_section, diff_section, absent_section):
Removed.
(expr_section): Added (used for dummy symbols which hold
intermediate expression values).
(perform_an_assembly_pass): Create expr_section, do not create the
sections now removed.
* as.h (segT): Removed SEG_ABSENT, SEG_PASS1, SEG_BIG, and
SEG_DIFFERENCE. Added SEG_EXPR.
(SEG_NORMAL): Corresponding changes.
* subsegs.c (seg_name, subsegs_begin): Changed accordingly.
* write.c (write_object_file): Ditto.
* config/obj-aout.c (seg_N_TYPE): Ditto.
* config/obj-bout.c (seg_N_TYPE): Ditto.
* config/obj-coff.c (seg_N_TYPE): Ditto.
* config/obj-coffbfd.c (seg_N_TYPE): Ditto.
* config/obj-vms.c (seg_N_TYPE): Ditto.
* expr.h (operatorT): Moved in from expr.c, added some values.
(expressionS): Added X_op field, removed X_seg field; renamed
X_subtract_symbol to X_op_symbol.
* expr.c: Extensive changes to assign expression types rather than
sections and to simplify the parsing.
* write.c (fix_new_internal): New static function.
(fix_new): Removed sub_symbol argument.
(fix_new_exp): New function, takes expression argument.
* write.h: Prototype changes for fix_new and fix_new_exp.
* cond.c (s_if): Changed accordingly.
* read.c (s_lsym, pseudo_set, emit_expr, parse_bitfield_cons,
parse_repeat_cons, get_segmented_expression,
get_known_segmented_expression, get_absolute_expression): Ditto.
* symbols.c (resolve_symbol_value, S_GET_VALUE, S_SET_VALUE):
Ditto.
* write.c (write_object_file): Ditto.
* config/obj-coff.c (obj_coff_def, obj_coff_val): Ditto.
* config/obj-coffbfd.c (obj_coff_def, obj_coff_val,
obj_coff_endef, yank_symbols): Ditto.
* config/obj-elf.c (obj_elf_stab_generic, obj_elf_size): Ditto.
* config/tc-a29k.c (md_assemble, parse_operand, machine_ip,
print_insn, md_operand): Ditto.
* config/tc-h8300.c (parse_exp, colonmod24, check_operand,
do_a_fix_imm, build_bytes): Ditto.
* config/tc-h8500.c (parse_exp, skip_colonthing, parse_reglist,
get_specific, check, insert, md_convert_frag): Ditto.
* config/tc-hppa.c (the_insn, fix_new_hppa, cons_fix_new_hppa,
md_assemble, pa_ip, getExpression, getAbsoluteExpression,
evaluateAbsolute, pa_build_unwind_subspace, pa_entry,
process_exit): Ditto.
* config/tc-hppa.h (STAB_FIXUP, is_DP_relative, is_PC_relative,
is_complex): Ditto.
* config/tc-i386.c (pe, md_assemble, i386_operand,
md_estimate_size_before_relax, md_create_long_jump): Ditto.
* config/tc-i860.c (md_assemble, getExpression, print_insn):
Ditto.
* config/tc-i960.c (parse_expr, subs, segs, md_convert_frag,
get_cdisp, mem_fmt, parse_ldconst, relax_cobr, s_sysproc,
i960_handle_align): Ditto.
* config/tc-m68k.c (struct m68k_exp, struct m68k_it, seg, op,
subs, add_fix, isvar, m68k_ip, md_assemble, md_convert_frag_1,
md_estimate_size_before_relax, md_create_long_jump, get_num):
Ditto.
* config/tc-m88k.c (md_assemble, get_imm16, get_pcr,
md_create_short_jump, md_create_long_jump): Ditto.
* config/tc-mips.c (md_assemble, append_insn, gp_reference,
macro_build, macro, my_getExpression): Ditto. Also removed
get_optional_absolute_expression; just use get_absolute_expression
instead.
* config/tc-ns32k.c (get_addr_mode, evaluate_expr, convert_iif,
fix_new_ns32k, fix_new_ns32k_exp, cons_fix_new_ns32k): Ditto.
* config/tc-ns32k.h (fix_new_ns32k prototype): Ditto.
* config/tc-sh.c (parse_exp, check, insert, md_convert_frag):
Ditto.
* config/tc-sparc.c (md_assemble, sparc_ip, getExpression,
print_insn): Ditto.
* config/tc-tahoe.c (struct top, md_estimate_size_before_relax,
tip_op, md_assemble): Ditto.
* config/tc-vax.c (seg_of_operand, md_assemble,
md_estimate_size_before_relax, md_create_long_jump): Ditto.
* config/tc-z8k.c (parse_exp, check_operand, newfix): Ditto.
1993-07-21 08:41:42 +08:00
|
|
|
N_UNDF, /* expression */
|
|
|
|
N_UNDF, /* debug */
|
|
|
|
N_UNDF, /* ntv */
|
|
|
|
N_UNDF, /* ptv */
|
1992-11-24 04:42:33 +08:00
|
|
|
N_REGISTER, /* register */
|
|
|
|
};
|
|
|
|
|
|
|
|
const segT N_TYPE_seg[N_TYPE + 2] =
|
|
|
|
{ /* N_TYPE == 0x1E = 32-2 */
|
|
|
|
SEG_UNKNOWN, /* N_UNDF == 0 */
|
|
|
|
SEG_GOOF,
|
|
|
|
SEG_ABSOLUTE, /* N_ABS == 2 */
|
|
|
|
SEG_GOOF,
|
|
|
|
SEG_TEXT, /* N_TEXT == 4 */
|
|
|
|
SEG_GOOF,
|
|
|
|
SEG_DATA, /* N_DATA == 6 */
|
|
|
|
SEG_GOOF,
|
|
|
|
SEG_BSS, /* N_BSS == 8 */
|
|
|
|
SEG_GOOF,
|
|
|
|
SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
|
|
|
|
SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
|
|
|
|
SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
|
|
|
|
SEG_REGISTER, /* dummy N_REGISTER for regs = 30 */
|
|
|
|
SEG_GOOF,
|
1991-04-05 02:19:53 +08:00
|
|
|
};
|
|
|
|
|
Some more gcc lint, and:
* read.c (change_to_section): Removed. This is now done by
subseg_new.
(get_stab_string_offset): Rearranged somewhat. Create the section
using subseg_new. Store the string index in seg_info, rather than
in a static variable. Force the first string to be empty. Use
frag_more rather than FRAG_APPEND_1_CHAR.
(s_stab_generic): Rewrote.
* subsegs.h (segment_info_type): Added stabu union.
* subsegs.c (subseg_new): Initialize stab_string_size to 0.
* config/obj-aout.c: Don't include aout/stab_gnu.h.
(obj_aout_stab, obj_aout_desc): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-bout.c: Same changes as config/obj-aout.c.
* config/obj-bout.h (S_SET_TYPE): Define.
(tc_bout_fix_to_chars): Declare.
* config/obj-coff.c (obj_coff_stab): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define.
* config/obj-coffbfd.c (current_stab_symbol): Removed.
* config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type,
n_other, n_desc and n_value fields.
(S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed.
(MAKE_STAB_SYMBOL): Removed.
* config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab.
Changed arguments and removed parsing code.
(obj_pseudo_table): Removed stabX entries.
* config/obj-ecoff.h (ecoff_stab): Declare.
(OBJ_PROCESS_STAB): Define.
* config/obj-elf.c: Don't include aout/stab_gnu.h.
(obj_elf_stab, obj_elf_xstab, obj_elf_desc,
elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic):
Removed.
(obj_pseudo_table): Removed desc, stabX and xstabs entries.
(obj_elf_version): Use subseg_new, not bfd_make_section. Don't
set SEC_LOAD for .note section.
(adjust_stab_sections): Get frag pointer from seg_info, rather
than looking through frags.
* config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed.
(SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB):
Define.
* config/obj-vms.c (obj_aout_stab): Removed.
(obj_pseudo_table): Removed stabX entries.
* config/obj-vms.h (S_SET_TYPE): Define.
1993-09-15 01:58:35 +08:00
|
|
|
static void obj_bout_line PARAMS ((int));
|
1991-04-05 02:19:53 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
const pseudo_typeS obj_pseudo_table[] =
|
|
|
|
{
|
|
|
|
{"line", obj_bout_line, 0}, /* source code line number */
|
|
|
|
|
|
|
|
/* coff debugging directives. Currently ignored silently */
|
|
|
|
{"def", s_ignore, 0},
|
|
|
|
{"dim", s_ignore, 0},
|
|
|
|
{"endef", s_ignore, 0},
|
|
|
|
{"ln", s_ignore, 0},
|
|
|
|
{"scl", s_ignore, 0},
|
|
|
|
{"size", s_ignore, 0},
|
|
|
|
{"tag", s_ignore, 0},
|
|
|
|
{"type", s_ignore, 0},
|
|
|
|
{"val", s_ignore, 0},
|
|
|
|
|
|
|
|
/* other stuff we don't handle */
|
|
|
|
{"ABORT", s_ignore, 0},
|
|
|
|
{"ident", s_ignore, 0},
|
|
|
|
|
|
|
|
{NULL} /* end sentinel */
|
|
|
|
}; /* obj_pseudo_table */
|
1991-04-05 02:19:53 +08:00
|
|
|
|
|
|
|
/* Relocation. */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* emit_relocations()
|
|
|
|
*
|
|
|
|
* Crawl along a fixS chain. Emit the segment's relocations.
|
|
|
|
*/
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_emit_relocations (where, fixP, segment_address_in_file)
|
|
|
|
char **where;
|
|
|
|
fixS *fixP; /* Fixup chain for this segment. */
|
|
|
|
relax_addressT segment_address_in_file;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
for (; fixP; fixP = fixP->fx_next)
|
|
|
|
{
|
* as.h: If __GNUC__ and inline are both undefined, define inline away.
* write.c (cvt_frag_to_fill): Don't assume that fr_var for rs_align or rs_org
frags will be 1.
(relax_segment): For rs_align, if fr_var is not 1, complain if
required padding is not a multiple of the size of the pad pattern.
(fixup_segment): Leave gp-relative relocations alone. For pcrel relocations
referring to the same segment, clear fx_pcrel when clearing fx_addsy.
* as.h: Adjust comments on rs_align.
* write.c, config/obj-{aout,bout,coff*}.c, config/tc-sparc.c: Query the fx_done
field instead of fx_addsy to see if the fixup still needs to be applied. Set
fx_done and clear fx_addsy both, for now. If TC_HANDLES_FX_DONE isn't defined,
assume md_apply_fix will only clear fx_addsy, and set fx_done accordingly after
returning.
* config/tc-sparc.h (TC_HANDLES_FX_DONE): Define.
* config/obj-coff.c (dot_text_symbol, dot_data_symbol, dot_bss_symbol): Defined
here, static.
* config/obj-aout.c [BFD_ASSEMBLER]: Undef NO_RELOC before including aout/aout64.h.
* write.c (write_object_file): If EMIT_SECTION_SYMBOLS is false, don't write
out a section symbol even if it's used in a relocation; assume relocations will
handle section numbers somehow. Rename "punt_it" label to "punt_it_if_unused"
to reflect it's true use.
(EMIT_SECTION_SYMBOLS): Default to 1.
(adjust_reloc_syms): Don't create a new symbol for an absolute
reference; just use the absolute section symbol.
(write_relocs): Make printout of reloc values dependent on flag DEBUG3, not
DEBUG2.
* config/obj-aout.h (EMIT_SECTION_SYMBOLS): Define as 0.
* config/obj-ecoff.h (EMIT_SECTION_SYMBOLS): Ditto.
1994-01-28 09:21:53 +08:00
|
|
|
if (fixP->fx_done == 0
|
1992-11-24 04:42:33 +08:00
|
|
|
|| fixP->fx_r_type != NO_RELOC)
|
|
|
|
{
|
1996-02-03 01:46:05 +08:00
|
|
|
symbolS *sym;
|
|
|
|
|
|
|
|
sym = fixP->fx_addsy;
|
|
|
|
while (sym->sy_value.X_op == O_symbol
|
|
|
|
&& (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
|
|
|
|
sym = sym->sy_value.X_add_symbol;
|
|
|
|
fixP->fx_addsy = sym;
|
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
tc_bout_fix_to_chars (*where, fixP, segment_address_in_file);
|
|
|
|
*where += sizeof (struct relocation_info);
|
|
|
|
} /* if there's a symbol */
|
|
|
|
} /* for each fixup */
|
|
|
|
|
|
|
|
} /* emit_relocations() */
|
1991-04-05 02:19:53 +08:00
|
|
|
|
|
|
|
/* Aout file generation & utilities */
|
|
|
|
|
|
|
|
/* Convert a lvalue to machine dependent data */
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_header_append (where, headers)
|
|
|
|
char **where;
|
|
|
|
object_headers *headers;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
/* Always leave in host byte order */
|
|
|
|
|
|
|
|
headers->header.a_talign = section_alignment[SEG_TEXT];
|
|
|
|
|
|
|
|
if (headers->header.a_talign < 2)
|
|
|
|
{
|
|
|
|
headers->header.a_talign = 2;
|
|
|
|
} /* force to at least 2 */
|
|
|
|
|
|
|
|
headers->header.a_dalign = section_alignment[SEG_DATA];
|
|
|
|
headers->header.a_balign = section_alignment[SEG_BSS];
|
|
|
|
|
|
|
|
headers->header.a_tload = 0;
|
|
|
|
headers->header.a_dload = md_section_align (SEG_DATA, H_GET_TEXT_SIZE (headers));
|
|
|
|
|
|
|
|
headers->header.a_relaxable = linkrelax;
|
1992-07-16 23:22:26 +08:00
|
|
|
|
1992-08-29 08:16:47 +08:00
|
|
|
#ifdef CROSS_COMPILE
|
1992-11-24 04:42:33 +08:00
|
|
|
md_number_to_chars (*where, headers->header.a_magic, sizeof (headers->header.a_magic));
|
|
|
|
*where += sizeof (headers->header.a_magic);
|
|
|
|
md_number_to_chars (*where, headers->header.a_text, sizeof (headers->header.a_text));
|
|
|
|
*where += sizeof (headers->header.a_text);
|
|
|
|
md_number_to_chars (*where, headers->header.a_data, sizeof (headers->header.a_data));
|
|
|
|
*where += sizeof (headers->header.a_data);
|
|
|
|
md_number_to_chars (*where, headers->header.a_bss, sizeof (headers->header.a_bss));
|
|
|
|
*where += sizeof (headers->header.a_bss);
|
|
|
|
md_number_to_chars (*where, headers->header.a_syms, sizeof (headers->header.a_syms));
|
|
|
|
*where += sizeof (headers->header.a_syms);
|
|
|
|
md_number_to_chars (*where, headers->header.a_entry, sizeof (headers->header.a_entry));
|
|
|
|
*where += sizeof (headers->header.a_entry);
|
|
|
|
md_number_to_chars (*where, headers->header.a_trsize, sizeof (headers->header.a_trsize));
|
|
|
|
*where += sizeof (headers->header.a_trsize);
|
|
|
|
md_number_to_chars (*where, headers->header.a_drsize, sizeof (headers->header.a_drsize));
|
|
|
|
*where += sizeof (headers->header.a_drsize);
|
|
|
|
md_number_to_chars (*where, headers->header.a_tload, sizeof (headers->header.a_tload));
|
|
|
|
*where += sizeof (headers->header.a_tload);
|
|
|
|
md_number_to_chars (*where, headers->header.a_dload, sizeof (headers->header.a_dload));
|
|
|
|
*where += sizeof (headers->header.a_dload);
|
|
|
|
md_number_to_chars (*where, headers->header.a_talign, sizeof (headers->header.a_talign));
|
|
|
|
*where += sizeof (headers->header.a_talign);
|
|
|
|
md_number_to_chars (*where, headers->header.a_dalign, sizeof (headers->header.a_dalign));
|
|
|
|
*where += sizeof (headers->header.a_dalign);
|
|
|
|
md_number_to_chars (*where, headers->header.a_balign, sizeof (headers->header.a_balign));
|
|
|
|
*where += sizeof (headers->header.a_balign);
|
|
|
|
md_number_to_chars (*where, headers->header.a_relaxable, sizeof (headers->header.a_relaxable));
|
|
|
|
*where += sizeof (headers->header.a_relaxable);
|
1992-08-29 08:16:47 +08:00
|
|
|
#else /* ! CROSS_COMPILE */
|
1992-11-24 04:42:33 +08:00
|
|
|
append (where, (char *) &headers->header, sizeof (headers->header));
|
1992-08-29 08:16:47 +08:00
|
|
|
#endif /* ! CROSS_COMPILE */
|
1992-11-24 04:42:33 +08:00
|
|
|
} /* a_header_append() */
|
1991-04-05 02:19:53 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_symbol_to_chars (where, symbolP)
|
|
|
|
char **where;
|
|
|
|
symbolS *symbolP;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
md_number_to_chars ((char *) &(S_GET_OFFSET (symbolP)), S_GET_OFFSET (symbolP), sizeof (S_GET_OFFSET (symbolP)));
|
|
|
|
md_number_to_chars ((char *) &(S_GET_DESC (symbolP)), S_GET_DESC (symbolP), sizeof (S_GET_DESC (symbolP)));
|
* Changes to keep a full expression as the value of a symbol, not
just a longword:
* struc-symbol.h: New field sy_value.
* as.h: Include expr.h before struc-symbol.h.
* expr.h: Use struct symbol rather than symbolS.
* symbols.c (S_GET_VALUE, S_SET_VALUE): Rewrote to retrieve value
of sy_value field; compile unconditionally, not just if
BFD_ASSEMBLER.
* symbols.h: Compile S_{SG}ET_VALUE prototypes unconditionally.
* write.c (write_object_file): Set BFD symbol value to gas symbol
value.
* config/obj-aout.h, config/obj-bout.h, config/obj-coff.h,
config/obj-coffbfd.h, config/obj-generic.h, config/obj-vms.h
(S_GET_VALUE, S_SET_VALUE): Removed macro definitions.
* config/obj-ieee.c (S_GET_VALUE, S_SET_VALUE): Removed.
* config/obj-coff.h, obj-coffbfd.h: Rewrote several macros to use
S_GET_VALUE rather than ost_entry.n_value.
* config/obj-aout.c (obj_symbol_to_chars), config/obj-bout.c
(obj_symbol_to_chars), config/obj-coff.c (obj_symbol_to_chars),
config/obj-coffbfd.c (symbol_to_chars): Get value to write out
using S_GET_VALUE--don't assume it is already set.
* config/obj-ieee.c (do_symbols): Set BFD symbol value to gas
symbol value.
* config/obj-vms.c (various): Don't assign directly to
S_GET_VALUE; use S_SET_VALUE instead.
1993-07-15 03:35:45 +08:00
|
|
|
md_number_to_chars ((char *) &symbolP->sy_symbol.n_value, S_GET_VALUE (symbolP), sizeof (symbolP->sy_symbol.n_value));
|
1992-08-29 08:16:47 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type));
|
|
|
|
} /* obj_symbol_to_chars() */
|
1991-04-05 02:19:53 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_emit_symbols (where, symbol_rootP)
|
|
|
|
char **where;
|
|
|
|
symbolS *symbol_rootP;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
symbolS *symbolP;
|
|
|
|
|
|
|
|
/*
|
1992-02-13 16:33:54 +08:00
|
|
|
* Emit all symbols left in the symbol chain.
|
|
|
|
*/
|
1992-11-24 04:42:33 +08:00
|
|
|
for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
|
|
|
|
{
|
|
|
|
/* Used to save the offset of the name. It is used to point
|
1992-02-13 16:33:54 +08:00
|
|
|
to the string in memory but must be a file offset. */
|
1992-11-24 04:42:33 +08:00
|
|
|
char *temp;
|
|
|
|
|
|
|
|
temp = S_GET_NAME (symbolP);
|
|
|
|
S_SET_OFFSET (symbolP, symbolP->sy_name_offset);
|
|
|
|
|
|
|
|
/* Any symbol still undefined and is not a dbg symbol is made N_EXT. */
|
|
|
|
if (!S_IS_DEBUG (symbolP) && !S_IS_DEFINED (symbolP))
|
|
|
|
S_SET_EXTERNAL (symbolP);
|
1991-04-05 02:19:53 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
obj_symbol_to_chars (where, symbolP);
|
|
|
|
S_SET_NAME (symbolP, temp);
|
|
|
|
}
|
|
|
|
} /* emit_symbols() */
|
|
|
|
|
|
|
|
void
|
|
|
|
obj_symbol_new_hook (symbolP)
|
|
|
|
symbolS *symbolP;
|
|
|
|
{
|
|
|
|
S_SET_OTHER (symbolP, 0);
|
|
|
|
S_SET_DESC (symbolP, 0);
|
1993-12-17 05:31:22 +08:00
|
|
|
}
|
1992-11-24 04:42:33 +08:00
|
|
|
|
|
|
|
static void
|
Some more gcc lint, and:
* read.c (change_to_section): Removed. This is now done by
subseg_new.
(get_stab_string_offset): Rearranged somewhat. Create the section
using subseg_new. Store the string index in seg_info, rather than
in a static variable. Force the first string to be empty. Use
frag_more rather than FRAG_APPEND_1_CHAR.
(s_stab_generic): Rewrote.
* subsegs.h (segment_info_type): Added stabu union.
* subsegs.c (subseg_new): Initialize stab_string_size to 0.
* config/obj-aout.c: Don't include aout/stab_gnu.h.
(obj_aout_stab, obj_aout_desc): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-bout.c: Same changes as config/obj-aout.c.
* config/obj-bout.h (S_SET_TYPE): Define.
(tc_bout_fix_to_chars): Declare.
* config/obj-coff.c (obj_coff_stab): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define.
* config/obj-coffbfd.c (current_stab_symbol): Removed.
* config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type,
n_other, n_desc and n_value fields.
(S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed.
(MAKE_STAB_SYMBOL): Removed.
* config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab.
Changed arguments and removed parsing code.
(obj_pseudo_table): Removed stabX entries.
* config/obj-ecoff.h (ecoff_stab): Declare.
(OBJ_PROCESS_STAB): Define.
* config/obj-elf.c: Don't include aout/stab_gnu.h.
(obj_elf_stab, obj_elf_xstab, obj_elf_desc,
elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic):
Removed.
(obj_pseudo_table): Removed desc, stabX and xstabs entries.
(obj_elf_version): Use subseg_new, not bfd_make_section. Don't
set SEC_LOAD for .note section.
(adjust_stab_sections): Get frag pointer from seg_info, rather
than looking through frags.
* config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed.
(SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB):
Define.
* config/obj-vms.c (obj_aout_stab): Removed.
(obj_pseudo_table): Removed stabX entries.
* config/obj-vms.h (S_SET_TYPE): Define.
1993-09-15 01:58:35 +08:00
|
|
|
obj_bout_line (ignore)
|
|
|
|
int ignore;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
/* Assume delimiter is part of expression. */
|
|
|
|
/* BSD4.2 as fails with delightful bug, so we */
|
|
|
|
/* are not being incompatible here. */
|
|
|
|
new_logical_line ((char *) NULL, (int) (get_absolute_expression ()));
|
|
|
|
demand_empty_rest_of_line ();
|
|
|
|
} /* obj_bout_line() */
|
1991-04-05 02:19:53 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_read_begin_hook ()
|
|
|
|
{
|
1993-12-17 05:31:22 +08:00
|
|
|
}
|
1991-04-05 02:19:53 +08:00
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_crawl_symbol_chain (headers)
|
|
|
|
object_headers *headers;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
symbolS **symbolPP;
|
|
|
|
symbolS *symbolP;
|
|
|
|
int symbol_number = 0;
|
|
|
|
|
|
|
|
tc_crawl_symbol_chain (headers);
|
|
|
|
|
|
|
|
symbolPP = &symbol_rootP; /*->last symbol chain link. */
|
|
|
|
while ((symbolP = *symbolPP) != NULL)
|
|
|
|
{
|
* as.h: Replace flagseen with separate variables.
* as.c (parse_args): Set them. Don't accept -1 option, or -v
explicitly (it's a synonym for --version).
* as.c, input-scrub.c, messages.c, read.c, symbols.c, write.c,
config/obj-aout.c, config/obj-aout.h, config/obj-bout.c,
config/obj-bout.h, config/obj-coff.c, config/obj-coff.h,
config/obj-vms.c, config/tc-hppa.c, config/tc-i386.c,
config/tc-i960.c, config/tc-m68k.c, config/tc-mips.c,
config/tc-vax.c: Use the new flag variables instead of flagseen.
* config/tc-vax.c [OBJ_VMS]: Recognize -+, -1, -v, and document in
usage.
1994-06-04 04:59:20 +08:00
|
|
|
if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_DATA))
|
1992-11-24 04:42:33 +08:00
|
|
|
{
|
|
|
|
S_SET_SEGMENT (symbolP, SEG_TEXT);
|
|
|
|
} /* if pusing data into text */
|
|
|
|
|
1993-07-15 06:21:25 +08:00
|
|
|
resolve_symbol_value (symbolP);
|
1992-11-24 04:42:33 +08:00
|
|
|
|
1996-02-03 01:46:05 +08:00
|
|
|
/* Skip symbols which were equated to undefined or common
|
|
|
|
symbols. */
|
|
|
|
if (symbolP->sy_value.X_op == O_symbol
|
|
|
|
&& (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP)))
|
|
|
|
{
|
|
|
|
*symbolPP = symbol_next (symbolP);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
/* OK, here is how we decide which symbols go out into the
|
Some more gcc lint, and:
* read.c (change_to_section): Removed. This is now done by
subseg_new.
(get_stab_string_offset): Rearranged somewhat. Create the section
using subseg_new. Store the string index in seg_info, rather than
in a static variable. Force the first string to be empty. Use
frag_more rather than FRAG_APPEND_1_CHAR.
(s_stab_generic): Rewrote.
* subsegs.h (segment_info_type): Added stabu union.
* subsegs.c (subseg_new): Initialize stab_string_size to 0.
* config/obj-aout.c: Don't include aout/stab_gnu.h.
(obj_aout_stab, obj_aout_desc): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-bout.c: Same changes as config/obj-aout.c.
* config/obj-bout.h (S_SET_TYPE): Define.
(tc_bout_fix_to_chars): Declare.
* config/obj-coff.c (obj_coff_stab): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define.
* config/obj-coffbfd.c (current_stab_symbol): Removed.
* config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type,
n_other, n_desc and n_value fields.
(S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed.
(MAKE_STAB_SYMBOL): Removed.
* config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab.
Changed arguments and removed parsing code.
(obj_pseudo_table): Removed stabX entries.
* config/obj-ecoff.h (ecoff_stab): Declare.
(OBJ_PROCESS_STAB): Define.
* config/obj-elf.c: Don't include aout/stab_gnu.h.
(obj_elf_stab, obj_elf_xstab, obj_elf_desc,
elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic):
Removed.
(obj_pseudo_table): Removed desc, stabX and xstabs entries.
(obj_elf_version): Use subseg_new, not bfd_make_section. Don't
set SEC_LOAD for .note section.
(adjust_stab_sections): Get frag pointer from seg_info, rather
than looking through frags.
* config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed.
(SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB):
Define.
* config/obj-vms.c (obj_aout_stab): Removed.
(obj_pseudo_table): Removed stabX entries.
* config/obj-vms.h (S_SET_TYPE): Define.
1993-09-15 01:58:35 +08:00
|
|
|
brave new symtab. Symbols that do are:
|
1992-11-24 04:42:33 +08:00
|
|
|
|
Some more gcc lint, and:
* read.c (change_to_section): Removed. This is now done by
subseg_new.
(get_stab_string_offset): Rearranged somewhat. Create the section
using subseg_new. Store the string index in seg_info, rather than
in a static variable. Force the first string to be empty. Use
frag_more rather than FRAG_APPEND_1_CHAR.
(s_stab_generic): Rewrote.
* subsegs.h (segment_info_type): Added stabu union.
* subsegs.c (subseg_new): Initialize stab_string_size to 0.
* config/obj-aout.c: Don't include aout/stab_gnu.h.
(obj_aout_stab, obj_aout_desc): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-bout.c: Same changes as config/obj-aout.c.
* config/obj-bout.h (S_SET_TYPE): Define.
(tc_bout_fix_to_chars): Declare.
* config/obj-coff.c (obj_coff_stab): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define.
* config/obj-coffbfd.c (current_stab_symbol): Removed.
* config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type,
n_other, n_desc and n_value fields.
(S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed.
(MAKE_STAB_SYMBOL): Removed.
* config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab.
Changed arguments and removed parsing code.
(obj_pseudo_table): Removed stabX entries.
* config/obj-ecoff.h (ecoff_stab): Declare.
(OBJ_PROCESS_STAB): Define.
* config/obj-elf.c: Don't include aout/stab_gnu.h.
(obj_elf_stab, obj_elf_xstab, obj_elf_desc,
elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic):
Removed.
(obj_pseudo_table): Removed desc, stabX and xstabs entries.
(obj_elf_version): Use subseg_new, not bfd_make_section. Don't
set SEC_LOAD for .note section.
(adjust_stab_sections): Get frag pointer from seg_info, rather
than looking through frags.
* config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed.
(SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB):
Define.
* config/obj-vms.c (obj_aout_stab): Removed.
(obj_pseudo_table): Removed stabX entries.
* config/obj-vms.h (S_SET_TYPE): Define.
1993-09-15 01:58:35 +08:00
|
|
|
* symbols with no name (stabd's?)
|
|
|
|
* symbols with debug info in their N_TYPE
|
1992-11-24 04:42:33 +08:00
|
|
|
|
Some more gcc lint, and:
* read.c (change_to_section): Removed. This is now done by
subseg_new.
(get_stab_string_offset): Rearranged somewhat. Create the section
using subseg_new. Store the string index in seg_info, rather than
in a static variable. Force the first string to be empty. Use
frag_more rather than FRAG_APPEND_1_CHAR.
(s_stab_generic): Rewrote.
* subsegs.h (segment_info_type): Added stabu union.
* subsegs.c (subseg_new): Initialize stab_string_size to 0.
* config/obj-aout.c: Don't include aout/stab_gnu.h.
(obj_aout_stab, obj_aout_desc): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-bout.c: Same changes as config/obj-aout.c.
* config/obj-bout.h (S_SET_TYPE): Define.
(tc_bout_fix_to_chars): Declare.
* config/obj-coff.c (obj_coff_stab): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define.
* config/obj-coffbfd.c (current_stab_symbol): Removed.
* config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type,
n_other, n_desc and n_value fields.
(S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed.
(MAKE_STAB_SYMBOL): Removed.
* config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab.
Changed arguments and removed parsing code.
(obj_pseudo_table): Removed stabX entries.
* config/obj-ecoff.h (ecoff_stab): Declare.
(OBJ_PROCESS_STAB): Define.
* config/obj-elf.c: Don't include aout/stab_gnu.h.
(obj_elf_stab, obj_elf_xstab, obj_elf_desc,
elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic):
Removed.
(obj_pseudo_table): Removed desc, stabX and xstabs entries.
(obj_elf_version): Use subseg_new, not bfd_make_section. Don't
set SEC_LOAD for .note section.
(adjust_stab_sections): Get frag pointer from seg_info, rather
than looking through frags.
* config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed.
(SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB):
Define.
* config/obj-vms.c (obj_aout_stab): Removed.
(obj_pseudo_table): Removed stabX entries.
* config/obj-vms.h (S_SET_TYPE): Define.
1993-09-15 01:58:35 +08:00
|
|
|
Symbols that don't are:
|
|
|
|
* symbols that are registers
|
|
|
|
* symbols with \1 as their 3rd character (numeric labels)
|
|
|
|
* "local labels" as defined by S_LOCAL_NAME(name)
|
|
|
|
if the -L switch was passed to gas.
|
1992-11-24 04:42:33 +08:00
|
|
|
|
Some more gcc lint, and:
* read.c (change_to_section): Removed. This is now done by
subseg_new.
(get_stab_string_offset): Rearranged somewhat. Create the section
using subseg_new. Store the string index in seg_info, rather than
in a static variable. Force the first string to be empty. Use
frag_more rather than FRAG_APPEND_1_CHAR.
(s_stab_generic): Rewrote.
* subsegs.h (segment_info_type): Added stabu union.
* subsegs.c (subseg_new): Initialize stab_string_size to 0.
* config/obj-aout.c: Don't include aout/stab_gnu.h.
(obj_aout_stab, obj_aout_desc): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-bout.c: Same changes as config/obj-aout.c.
* config/obj-bout.h (S_SET_TYPE): Define.
(tc_bout_fix_to_chars): Declare.
* config/obj-coff.c (obj_coff_stab): Removed.
(obj_pseudo_table): Removed desc and stabX entries.
* config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define.
* config/obj-coffbfd.c (current_stab_symbol): Removed.
* config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type,
n_other, n_desc and n_value fields.
(S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed.
(MAKE_STAB_SYMBOL): Removed.
* config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab.
Changed arguments and removed parsing code.
(obj_pseudo_table): Removed stabX entries.
* config/obj-ecoff.h (ecoff_stab): Declare.
(OBJ_PROCESS_STAB): Define.
* config/obj-elf.c: Don't include aout/stab_gnu.h.
(obj_elf_stab, obj_elf_xstab, obj_elf_desc,
elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic):
Removed.
(obj_pseudo_table): Removed desc, stabX and xstabs entries.
(obj_elf_version): Use subseg_new, not bfd_make_section. Don't
set SEC_LOAD for .note section.
(adjust_stab_sections): Get frag pointer from seg_info, rather
than looking through frags.
* config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed.
(SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB):
Define.
* config/obj-vms.c (obj_aout_stab): Removed.
(obj_pseudo_table): Removed stabX entries.
* config/obj-vms.h (S_SET_TYPE): Define.
1993-09-15 01:58:35 +08:00
|
|
|
All other symbols are output. We complain if a deleted
|
|
|
|
symbol was marked external. */
|
1992-11-24 04:42:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
if (1
|
|
|
|
&& !S_IS_REGISTER (symbolP)
|
|
|
|
&& (!S_GET_NAME (symbolP)
|
|
|
|
|| S_IS_DEBUG (symbolP)
|
1991-04-05 02:19:53 +08:00
|
|
|
#ifdef TC_I960
|
1992-11-24 04:42:33 +08:00
|
|
|
/* FIXME-SOON this ifdef seems highly dubious to me. xoxorich. */
|
|
|
|
|| !S_IS_DEFINED (symbolP)
|
|
|
|
|| S_IS_EXTERNAL (symbolP)
|
1991-04-05 02:19:53 +08:00
|
|
|
#endif /* TC_I960 */
|
* as.h: Replace flagseen with separate variables.
* as.c (parse_args): Set them. Don't accept -1 option, or -v
explicitly (it's a synonym for --version).
* as.c, input-scrub.c, messages.c, read.c, symbols.c, write.c,
config/obj-aout.c, config/obj-aout.h, config/obj-bout.c,
config/obj-bout.h, config/obj-coff.c, config/obj-coff.h,
config/obj-vms.c, config/tc-hppa.c, config/tc-i386.c,
config/tc-i960.c, config/tc-m68k.c, config/tc-mips.c,
config/tc-vax.c: Use the new flag variables instead of flagseen.
* config/tc-vax.c [OBJ_VMS]: Recognize -+, -1, -v, and document in
usage.
1994-06-04 04:59:20 +08:00
|
|
|
|| (S_GET_NAME (symbolP)[0] != '\001' && (flag_keep_locals || !S_LOCAL_NAME (symbolP)))))
|
1992-11-24 04:42:33 +08:00
|
|
|
{
|
|
|
|
symbolP->sy_number = symbol_number++;
|
|
|
|
|
|
|
|
/* The + 1 after strlen account for the \0 at the
|
1991-04-05 02:19:53 +08:00
|
|
|
end of each string */
|
1992-11-24 04:42:33 +08:00
|
|
|
if (!S_IS_STABD (symbolP))
|
|
|
|
{
|
|
|
|
/* Ordinary case. */
|
|
|
|
symbolP->sy_name_offset = string_byte_count;
|
|
|
|
string_byte_count += strlen (S_GET_NAME (symbolP)) + 1;
|
|
|
|
}
|
|
|
|
else /* .Stabd case. */
|
|
|
|
symbolP->sy_name_offset = 0;
|
|
|
|
symbolPP = &(symbol_next (symbolP));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP))
|
|
|
|
{
|
|
|
|
as_bad ("Local symbol %s never defined", S_GET_NAME (symbolP));
|
|
|
|
} /* oops. */
|
|
|
|
|
|
|
|
/* Unhook it from the chain */
|
|
|
|
*symbolPP = symbol_next (symbolP);
|
|
|
|
} /* if this symbol should be in the output */
|
|
|
|
} /* for each symbol */
|
|
|
|
|
|
|
|
H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number);
|
1993-12-17 05:31:22 +08:00
|
|
|
}
|
1991-04-05 02:19:53 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Find strings by crawling along symbol table chain.
|
|
|
|
*/
|
|
|
|
|
1992-11-24 04:42:33 +08:00
|
|
|
void
|
|
|
|
obj_emit_strings (where)
|
|
|
|
char **where;
|
1991-04-05 02:19:53 +08:00
|
|
|
{
|
1992-11-24 04:42:33 +08:00
|
|
|
symbolS *symbolP;
|
|
|
|
|
1991-04-08 23:49:47 +08:00
|
|
|
#ifdef CROSS_COMPILE
|
1992-11-24 04:42:33 +08:00
|
|
|
/* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
|
|
|
|
md_number_to_chars (*where, string_byte_count, sizeof (string_byte_count));
|
|
|
|
*where += sizeof (string_byte_count);
|
1991-04-08 23:49:47 +08:00
|
|
|
#else /* CROSS_COMPILE */
|
1992-11-24 04:42:33 +08:00
|
|
|
append (where, (char *) &string_byte_count, (unsigned long) sizeof (string_byte_count));
|
1991-04-08 23:49:47 +08:00
|
|
|
#endif /* CROSS_COMPILE */
|
1992-11-24 04:42:33 +08:00
|
|
|
|
|
|
|
for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
|
|
|
|
{
|
|
|
|
if (S_GET_NAME (symbolP))
|
|
|
|
append (where, S_GET_NAME (symbolP), (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1));
|
|
|
|
} /* walk symbol chain */
|
1993-12-17 05:31:22 +08:00
|
|
|
}
|
1991-04-05 02:19:53 +08:00
|
|
|
|
|
|
|
/* end of obj-bout.c */
|