X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Fobj-aout.c;h=aee7c8180a28ad4de8dc997341f953261767c166;hb=6dbdab44e57d21c895ef60246d0e7aadb3c076a4;hp=6c1e100425b4ad801a52d27c4eedaf6f0fa5177e;hpb=fecd2382e77b89f12c9d630ed4e42e9a54ba6953;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/obj-aout.c b/gas/config/obj-aout.c index 6c1e100425..aee7c8180a 100644 --- a/gas/config/obj-aout.c +++ b/gas/config/obj-aout.c @@ -1,500 +1,358 @@ /* a.out object file format - Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc. + Copyright (C) 1989-2020 Free Software Foundation, Inc. -This file is part of GAS, the GNU Assembler. + This file is part of GAS, the GNU Assembler. -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 1, -or (at your option) any later version. + 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 3, + or (at your option) any later version. -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. + 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. -You should have received a copy of the GNU General Public -License along with GAS; see the file COPYING. If not, write -to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ -/* $Id$ */ +#define OBJ_HEADER "obj-aout.h" #include "as.h" +#undef NO_RELOC +#include "aout/aout64.h" -#include "obstack.h" - - /* in: segT out: N_TYPE bits */ -const short seg_N_TYPE[] = { - N_ABS, - N_TEXT, - N_DATA, - N_BSS, - N_UNDF, /* unknown */ - N_UNDF, /* absent */ - N_UNDF, /* pass1 */ - N_UNDF, /* error */ - N_UNDF, /* bignum/flonum */ - N_UNDF, /* difference */ - N_UNDF, /* debug */ - N_UNDF, /* ntv */ - N_UNDF, /* ptv */ - 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, -}; - -#ifdef __STDC__ -static void obj_aout_stab(int what); -static void obj_aout_line(void); -static void obj_aout_desc(void); -#else /* __STDC__ */ -static void obj_aout_desc(); -static void obj_aout_stab(); -static void obj_aout_line(); -#endif /* __STDC__ */ - -const pseudo_typeS obj_pseudo_table[] = { - { "line", obj_aout_line, 0 }, /* source code line number */ - { "ln", obj_aout_line, 0 }, /* source code line number */ - { "desc", obj_aout_desc, 0 }, /* def */ - { "stabd", obj_aout_stab, 'd' }, /* stabs */ - { "stabn", obj_aout_stab, 'n' }, /* stabs */ - { "stabs", obj_aout_stab, 's' }, /* stabs */ - - { NULL} /* end sentinel */ -}; /* obj_pseudo_table */ - - -/* Relocation. */ - -/* - * In: length of relocation (or of address) in chars: 1, 2 or 4. - * Out: GNU LD relocation length code: 0, 1, or 2. - */ - -static unsigned char -nbytes_r_length [] = { - 42, 0, 1, 42, 2 - }; - -/* - * emit_relocations() - * - * Crawl along a fixS chain. Emit the segment's relocations. - */ -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; +void +obj_aout_frob_symbol (symbolS *sym, int *punt ATTRIBUTE_UNUSED) { - struct reloc_info_generic ri; - register symbolS *symbolP; + flagword flags; + asection *sec; + int type; + + flags = symbol_get_bfdsym (sym)->flags; + type = aout_symbol (symbol_get_bfdsym (sym))->type; + sec = S_GET_SEGMENT (sym); + + /* Only frob simple symbols this way right now. */ + if (! (type & ~ (N_TYPE | N_EXT))) + { + if (type == (N_UNDF | N_EXT) + && sec == bfd_abs_section_ptr) + { + sec = bfd_und_section_ptr; + S_SET_SEGMENT (sym, sec); + } - /* If a machine dependent emitter is needed, call it instead. */ - if (md_emit_relocations) { - (*md_emit_relocations) (fixP, segment_address_in_file); - return; + if ((type & N_TYPE) != N_INDR + && (type & N_TYPE) != N_SETA + && (type & N_TYPE) != N_SETT + && (type & N_TYPE) != N_SETD + && (type & N_TYPE) != N_SETB + && type != N_WARNING + && (sec == bfd_abs_section_ptr + || sec == bfd_und_section_ptr)) + return; + if (flags & BSF_EXPORT) + type |= N_EXT; + + switch (type & N_TYPE) + { + case N_SETA: + case N_SETT: + case N_SETD: + case N_SETB: + /* Set the debugging flag for constructor symbols so that + BFD leaves them alone. */ + symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING; + + /* You can't put a common symbol in a set. The way a set + element works is that the symbol has a definition and a + name, and the linker adds the definition to the set of + that name. That does not work for a common symbol, + because the linker can't tell which common symbol the + user means. FIXME: Using as_bad here may be + inappropriate, since the user may want to force a + particular type without regard to the semantics of sets; + on the other hand, we certainly don't want anybody to be + mislead into thinking that their code will work. */ + if (S_IS_COMMON (sym)) + as_bad (_("Attempt to put a common symbol into set %s"), + S_GET_NAME (sym)); + /* Similarly, you can't put an undefined symbol in a set. */ + else if (! S_IS_DEFINED (sym)) + as_bad (_("Attempt to put an undefined symbol into set %s"), + S_GET_NAME (sym)); + + break; + case N_INDR: + /* Put indirect symbols in the indirect section. */ + S_SET_SEGMENT (sym, bfd_ind_section_ptr); + symbol_get_bfdsym (sym)->flags |= BSF_INDIRECT; + if (type & N_EXT) + { + symbol_get_bfdsym (sym)->flags |= BSF_EXPORT; + symbol_get_bfdsym (sym)->flags &=~ BSF_LOCAL; + } + break; + case N_WARNING: + /* Mark warning symbols. */ + symbol_get_bfdsym (sym)->flags |= BSF_WARNING; + break; } + } + else + symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING; - /* JF this is for paranoia */ - bzero((char *)&ri,sizeof(ri)); - for (; fixP; fixP = fixP->fx_next) { - if ((symbolP = fixP->fx_addsy) != 0) { - ri.r_bsr = fixP->fx_bsr; - ri.r_disp = fixP->fx_im_disp; - ri.r_callj = fixP->fx_callj; - ri.r_length = nbytes_r_length [fixP->fx_size]; - ri.r_pcrel = fixP->fx_pcrel; - ri.r_address = fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file; - - if (S_GET_TYPE(symbolP) == N_UNDF) { - ri.r_extern = 1; - ri.r_symbolnum = symbolP->sy_number; - } else { - ri.r_extern = 0; - ri.r_symbolnum = S_GET_TYPE(symbolP); - } - - /* Output the relocation information in machine-dependent form. */ - md_ri_to_chars(*where, &ri); - *where += md_reloc_size; - } /* if there is an add symbol */ - } /* for each fix */ + aout_symbol (symbol_get_bfdsym (sym))->type = type; - return; -} /* emit_relocations() */ + /* Double check weak symbols. */ + if (S_IS_WEAK (sym) && S_IS_COMMON (sym)) + as_bad (_("Symbol `%s' can not be both weak and common"), + S_GET_NAME (sym)); +} -/* Aout file generation & utilities */ -void obj_header_append(where, headers) -char **where; -object_headers *headers; -{ - tc_headers_hook(headers); - -#ifdef CROSS_ASSEMBLE - md_number_to_chars(*where, headers->header.a_info, sizeof(headers->header.a_info)); - *where += sizeof(headers->header.a_info); - 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); -#ifdef EXEC_MACHINE_TYPE - md_number_to_chars(*where, headers->header.a_machtype, sizeof(headers->header.a_machtype)); - *where += sizeof(headers->header.a_machtype); -#endif /* EXEC_MACHINE_TYPE */ -#ifdef EXEC_VERSION - md_number_to_chars(*where, headers->header.a_version, sizeof(headers->header.a_version)); - *where += sizeof(headers->header.a_version); -#endif /* EXEC_VERSION */ - -#else /* CROSS_ASSEMBLE */ - - append(where, (char *) &headers->header, sizeof(headers->header)); -#endif /* CROSS_ASSEMBLE */ +/* Relocation processing may require knowing the VMAs of the sections. + Writing to a section will cause the BFD back end to compute the + VMAs. This function also ensures that file size is large enough + to cover a_text and a_data should text or data be the last section + in the file. */ - return; -} /* obj_append_header() */ +void +obj_aout_frob_file_before_fix (void) +{ + asection *sec; + bfd_vma *sizep = NULL; + if ((sec = data_section)->size != 0) + sizep = &exec_hdr (stdoutput)->a_data; + else if ((sec = text_section)->size != 0) + sizep = &exec_hdr (stdoutput)->a_text; + if (sizep) + { + bfd_size_type size = sec->size; + bfd_byte b = 0; + + gas_assert (bfd_set_section_contents (stdoutput, sec, &b, size - 1, 1)); + + /* We don't know the aligned size until after VMAs and sizes are + set on the bfd_set_section_contents call. If that size is + larger than the section then write again to ensure the file + contents extend to cover the aligned size. */ + if (*sizep > size) + { + file_ptr pos = sec->filepos + *sizep; + + gas_assert (bfd_seek (stdoutput, pos - 1, SEEK_SET) == 0 + && bfd_bwrite (&b, 1, stdoutput) == 1); + } + } +} -void obj_symbol_to_chars(where, symbolP) -char **where; -symbolS *symbolP; +static void +obj_aout_line (int ignore ATTRIBUTE_UNUSED) { - 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))); - md_number_to_chars((char *)&(S_GET_VALUE(symbolP)), S_GET_VALUE(symbolP), sizeof(S_GET_VALUE(symbolP))); + /* 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 (); +} - append(where, (char *)&symbolP->sy_symbol, sizeof(obj_symbol_type)); -} /* obj_symbol_to_chars() */ +/* Handle .weak. This is a GNU extension. */ -void obj_emit_symbols(where, symbol_rootP) -char **where; -symbolS *symbol_rootP; +static void +obj_aout_weak (int ignore ATTRIBUTE_UNUSED) { - symbolS * symbolP; + char *name; + int c; + symbolS *symbolP; + + do + { + c = get_symbol_name (&name); + symbolP = symbol_find_or_make (name); + (void) restore_line_pointer (c); + SKIP_WHITESPACE (); + S_SET_WEAK (symbolP); + if (c == ',') + { + input_line_pointer++; + SKIP_WHITESPACE (); + if (*input_line_pointer == '\n') + c = '\n'; + } + } + while (c == ','); + demand_empty_rest_of_line (); +} - /* - * Emit all symbols left in the symbol chain. - */ - for(symbolP = symbol_rootP; symbolP; symbolP = symbol_next(symbolP)) { - /* Used to save the offset of the name. It is used to point - to the string in memory but must be a file offset. */ - register char *temp; +/* Handle .type. On {Net,Open}BSD, this is used to set the n_other field, + which is then apparently used when doing dynamic linking. Older + versions of gas ignored the .type pseudo-op, so we also ignore it if + we can't parse it. */ - temp = S_GET_NAME(symbolP); - S_SET_OFFSET(symbolP, symbolP->sy_name_offset); +static void +obj_aout_type (int ignore ATTRIBUTE_UNUSED) +{ + char *name; + int c; + symbolS *sym; + + c = get_symbol_name (&name); + sym = symbol_find_or_make (name); + (void) restore_line_pointer (c); + SKIP_WHITESPACE (); + if (*input_line_pointer == ',') + { + ++input_line_pointer; + SKIP_WHITESPACE (); + if (*input_line_pointer == '@') + { + ++input_line_pointer; + if (strncmp (input_line_pointer, "object", 6) == 0) + S_SET_OTHER (sym, 1); + else if (strncmp (input_line_pointer, "function", 8) == 0) + S_SET_OTHER (sym, 2); + } + } - /* 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); + /* Ignore everything else on the line. */ + s_ignore (0); +} - obj_symbol_to_chars(where, symbolP); - S_SET_NAME(symbolP,temp); - } -} /* emit_symbols() */ +/* Support for an AOUT emulation. */ -void obj_symbol_new_hook(symbolP) -symbolS *symbolP; +static void +aout_pop_insert (void) { - S_SET_OTHER(symbolP, 0); - S_SET_DESC(symbolP, 0); - return; -} /* obj_symbol_new_hook() */ - -static void obj_aout_line() { - /* 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_aout_line() */ - -/* - * stab() - * - * Handle .stabX directives, which used to be open-coded. - * So much creeping featurism overloaded the semantics that we decided - * to put all .stabX thinking in one place. Here. - * - * We try to make any .stabX directive legal. Other people's AS will often - * do assembly-time consistency checks: eg assigning meaning to n_type bits - * and "protecting" you from setting them to certain values. (They also zero - * certain bits before emitting symbols. Tut tut.) - * - * If an expression is not absolute we either gripe or use the relocation - * information. Other people's assemblers silently forget information they - * don't need and invent information they need that you didn't supply. - * - * .stabX directives always make a symbol table entry. It may be junk if - * the rest of your .stabX directive is malformed. - */ -static void obj_aout_stab(what) -int what; + pop_insert (aout_pseudo_table); +} + +static int +obj_aout_s_get_other (symbolS *sym) { - register symbolS * symbolP = 0; - register char * string; - int saved_type = 0; - int length; - int goof; /* TRUE if we have aborted. */ - long longint; - -/* - * Enter with input_line_pointer pointing past .stabX and any following - * whitespace. - */ - goof = 0; /* JF who forgot this?? */ - if (what == 's') { - string = demand_copy_C_string(& length); - SKIP_WHITESPACE(); - if (* input_line_pointer == ',') - input_line_pointer ++; - else { - as_bad("I need a comma after symbol's name"); - goof = 1; - } - } else - string = ""; - -/* - * Input_line_pointer->after ','. String->symbol name. - */ - if (! goof) { - symbolP = symbol_new(string, - SEG_UNKNOWN, - 0, - (struct frag *)0); - switch (what) { - case 'd': - S_SET_NAME(symbolP, NULL); /* .stabd feature. */ - S_SET_VALUE(symbolP, obstack_next_free(&frags) - frag_now->fr_literal); - symbolP->sy_frag = frag_now; - break; - - case 'n': - symbolP->sy_frag = &zero_address_frag; - break; - - case 's': - symbolP->sy_frag = & zero_address_frag; - break; - - default: - BAD_CASE(what); - break; - } - - if (get_absolute_expression_and_terminator(&longint) == ',') - symbolP->sy_symbol.n_type = saved_type = longint; - else { - as_bad("I want a comma after the n_type expression"); - goof = 1; - input_line_pointer --; /* Backup over a non-',' char. */ - } - } + return aout_symbol (symbol_get_bfdsym (sym))->other; +} - if (!goof) { - if (get_absolute_expression_and_terminator(&longint) == ',') - S_SET_OTHER(symbolP, longint); - else { - as_bad("I want a comma after the n_other expression"); - goof = 1; - input_line_pointer--; /* Backup over a non-',' char. */ - } - } +static void +obj_aout_s_set_other (symbolS *sym, int o) +{ + aout_symbol (symbol_get_bfdsym (sym))->other = o; +} - if (!goof) { - S_SET_DESC(symbolP, get_absolute_expression()); - if (what == 's' || what == 'n') { - if (*input_line_pointer != ',') { - as_bad("I want a comma after the n_desc expression"); - goof = 1; - } else { - input_line_pointer++; - } - } - } +static int +obj_aout_sec_sym_ok_for_reloc (asection *sec ATTRIBUTE_UNUSED) +{ + return obj_sec_sym_ok_for_reloc (sec); +} + +static void +obj_aout_process_stab (segT seg ATTRIBUTE_UNUSED, + int w, + const char *s, + int t, + int o, + int d) +{ + aout_process_stab (w, s, t, o, d); +} - if ((!goof) && (what=='s' || what=='n')) { - pseudo_set(symbolP); - symbolP->sy_symbol.n_type = saved_type; - } +static int +obj_aout_s_get_desc (symbolS *sym) +{ + return aout_symbol (symbol_get_bfdsym (sym))->desc; +} - if (goof) - ignore_rest_of_line(); - else - demand_empty_rest_of_line (); -} /* obj_aout_stab() */ - -static void obj_aout_desc() { - register char *name; - register char c; - register char *p; - register symbolS *symbolP; - register int temp; - - /* - * Frob invented at RMS' request. Set the n_desc of a symbol. - */ - name = input_line_pointer; - c = get_symbol_end(); - p = input_line_pointer; - * p = c; - SKIP_WHITESPACE(); - if (*input_line_pointer != ',') { - *p = 0; - as_bad("Expected comma after name \"%s\"", name); - *p = c; - ignore_rest_of_line(); - } else { - input_line_pointer ++; - temp = get_absolute_expression(); - *p = 0; - symbolP = symbol_find_or_make(name); - *p = c; - S_SET_DESC(symbolP,temp); - } - demand_empty_rest_of_line(); -} /* obj_aout_desc() */ +static void +obj_aout_s_set_desc (symbolS *sym, int d) +{ + aout_symbol (symbol_get_bfdsym (sym))->desc = d; +} -void obj_read_begin_hook() { - return; -} /* obj_read_begin_hook() */ +static int +obj_aout_s_get_type (symbolS *sym) +{ + return aout_symbol (symbol_get_bfdsym (sym))->type; +} -void obj_crawl_symbol_chain(headers) -object_headers *headers; +static void +obj_aout_s_set_type (symbolS *sym, int t) { - symbolS *symbolP; - symbolS **symbolPP; - int symbol_number = 0; - - /* JF deal with forward references first... */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next(symbolP)) { - if (symbolP->sy_forward) { - S_SET_VALUE(symbolP, S_GET_VALUE(symbolP) - + S_GET_VALUE(symbolP->sy_forward) - + symbolP->sy_forward->sy_frag->fr_address); - - symbolP->sy_forward=0; - } /* if it has a forward reference */ - } /* walk the symbol chain */ - - tc_crawl_symbol_chain(headers); - - symbolPP = &symbol_rootP; /*->last symbol chain link. */ - while ((symbolP = *symbolPP) != NULL) { - if (flagseen['R'] && (S_GET_SEGMENT(symbolP) == SEG_DATA)) { - S_SET_SEGMENT(symbolP, SEG_TEXT); - } /* if pusing data into text */ - - S_SET_VALUE(symbolP, S_GET_VALUE(symbolP) + symbolP->sy_frag->fr_address); - - /* OK, here is how we decide which symbols go out into the - brave new symtab. Symbols that do are: - - * symbols with no name (stabd's?) - * symbols with debug info in their N_TYPE - - 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. - - All other symbols are output. We complain if a deleted - symbol was marked external. */ - - - if (!S_IS_REGISTER(symbolP) - && (!S_GET_NAME(symbolP) - || S_IS_DEBUG(symbolP) -#ifdef TC_I960 - /* FIXME-SOON this ifdef seems highly dubious to me. xoxorich. */ - || !S_IS_DEFINED(symbolP) - || S_IS_EXTERNAL(symbolP) -#endif /* TC_I960 */ - || (S_GET_NAME(symbolP)[0] != '\001' && (flagseen ['L'] || ! S_LOCAL_NAME(symbolP))))) { - symbolP->sy_number = symbol_number++; - - /* The + 1 after strlen account for the \0 at the - end of each string */ - 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); + aout_symbol (symbol_get_bfdsym (sym))->type = t; +} - return; -} /* obj_crawl_symbol_chain() */ +static int +obj_aout_separate_stab_sections (void) +{ + return 0; +} -/* - * Find strings by crawling along symbol table chain. - */ +/* When changed, make sure these table entries match the single-format + definitions in obj-aout.h. */ -void obj_emit_strings(where) -char **where; +const struct format_ops aout_format_ops = { - symbolS *symbolP; - -#ifdef CROSS_ASSEMBLE - /* 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); -#else /* CROSS_ASSEMBLE */ - append (where, (char *)&string_byte_count, (unsigned long)sizeof(string_byte_count)); -#endif /* CROSS_ASSEMBLE */ - - for(symbolP = symbol_rootP; symbolP; symbolP = symbol_next(symbolP)) { - if(S_GET_NAME(symbolP)) - append(&next_object_file_charP, S_GET_NAME(symbolP), - (unsigned long)(strlen (S_GET_NAME(symbolP)) + 1)); - } /* walk symbol chain */ + bfd_target_aout_flavour, + 1, /* dfl_leading_underscore. */ + 0, /* emit_section_symbols. */ + 0, /* begin. */ + 0, /* app_file. */ + obj_aout_frob_symbol, + 0, /* frob_file. */ + 0, /* frob_file_before_adjust. */ + obj_aout_frob_file_before_fix, + 0, /* frob_file_after_relocs. */ + 0, /* s_get_size. */ + 0, /* s_set_size. */ + 0, /* s_get_align. */ + 0, /* s_set_align. */ + obj_aout_s_get_other, + obj_aout_s_set_other, + obj_aout_s_get_desc, + obj_aout_s_set_desc, + obj_aout_s_get_type, + obj_aout_s_set_type, + 0, /* copy_symbol_attributes. */ + 0, /* generate_asm_lineno. */ + obj_aout_process_stab, + obj_aout_separate_stab_sections, + 0, /* init_stab_section. */ + obj_aout_sec_sym_ok_for_reloc, + aout_pop_insert, + 0, /* ecoff_set_ext. */ + 0, /* read_begin_hook. */ + 0, /* symbol_new_hook. */ + 0, /* symbol_clone_hook. */ + 0 /* adjust_symtab. */ +}; - return; -} /* obj_emit_strings() */ +const pseudo_typeS aout_pseudo_table[] = +{ + {"line", obj_aout_line, 0}, /* Source code line number. */ + {"ln", obj_aout_line, 0}, /* COFF line number that we use anyway. */ -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ + {"weak", obj_aout_weak, 0}, /* Mark symbol as weak. */ -/* end of obj-aout.c */ + {"type", obj_aout_type, 0}, + + /* coff debug pseudos (ignored) */ + {"def", s_ignore, 0}, + {"dim", s_ignore, 0}, + {"endef", s_ignore, 0}, + {"ident", s_ignore, 0}, + {"line", s_ignore, 0}, + {"ln", s_ignore, 0}, + {"scl", s_ignore, 0}, + {"size", s_ignore, 0}, + {"tag", s_ignore, 0}, + {"val", s_ignore, 0}, + {"version", s_ignore, 0}, + + {"optim", s_ignore, 0}, /* For sun386i cc (?). */ + + /* other stuff */ + {"ABORT", s_abort, 0}, + + {NULL, NULL, 0} +};