From: Alan Modra Date: Tue, 1 Mar 2005 00:43:58 +0000 (+0000) Subject: * configure.in (AC_C_BIGENDIAN): Invoke. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=44f2f9d2a3fca1612061a377f6c6f512be635fff;p=binutils-gdb.git * configure.in (AC_C_BIGENDIAN): Invoke. * configure: Regenerate. * write.c (write_object_file ): Don't use sizeof host variable to set string header size. * config/obj-aout.c (obj_header_append): Don't use host structs. (obj_symbol_to_chars): Likewise. (obj_emit_strings): Likewise. Use the passed in output pointer. * config/obj-aout.h (H_GET_FILE_SIZE): Include H_GET_LINENO_SIZE. * config/obj-bout.c (obj_emit_relocations): Use md_reloc_size, not sizeof host struct. (obj_header_append, obj_symbol_to_chars): Don't use host structs. (obj_emit_strings): Likewise. * config/obj-bout.h (EXEC_BYTES_SIZE): Define. (N_TXTOFF, H_GET_FILE_SIZE, H_GET_HEADER_SIZE): Use instead of sizeof host struct. (H_SET_SYMBOL_TABLE_SIZE): Hard code sym size rather than using sizeof host struct. (host_number_to_chars): Define. * config/obj-hp300.c (hp300_header_append): Don't use sizeof host internal struct to set header sizes. * config/tc-i960.c (md_number_to_field): Warning fix. (md_ri_to_chars): Use host byte order. (get_cdisp, md_apply_fix3): Warning fix. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 69b6cbc2e6f..a75c8ca373d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,29 @@ +2005-03-01 Alan Modra + + * configure.in (AC_C_BIGENDIAN): Invoke. + * configure: Regenerate. + * write.c (write_object_file ): Don't use sizeof + host variable to set string header size. + * config/obj-aout.c (obj_header_append): Don't use host structs. + (obj_symbol_to_chars): Likewise. + (obj_emit_strings): Likewise. Use the passed in output pointer. + * config/obj-aout.h (H_GET_FILE_SIZE): Include H_GET_LINENO_SIZE. + * config/obj-bout.c (obj_emit_relocations): Use md_reloc_size, + not sizeof host struct. + (obj_header_append, obj_symbol_to_chars): Don't use host structs. + (obj_emit_strings): Likewise. + * config/obj-bout.h (EXEC_BYTES_SIZE): Define. + (N_TXTOFF, H_GET_FILE_SIZE, H_GET_HEADER_SIZE): Use instead of + sizeof host struct. + (H_SET_SYMBOL_TABLE_SIZE): Hard code sym size rather than using + sizeof host struct. + (host_number_to_chars): Define. + * config/obj-hp300.c (hp300_header_append): Don't use sizeof + host internal struct to set header sizes. + * config/tc-i960.c (md_number_to_field): Warning fix. + (md_ri_to_chars): Use host byte order. + (get_cdisp, md_apply_fix3): Warning fix. + 2005-02-28 Ramana Radhakrishnan * doc/c-arc.texi: Update documentation about ARC's extension diff --git a/gas/config/obj-aout.c b/gas/config/obj-aout.c index 74e52a5f12d..6a47a9bd3e4 100644 --- a/gas/config/obj-aout.c +++ b/gas/config/obj-aout.c @@ -1,6 +1,6 @@ /* a.out object file format Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, - 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -265,36 +265,39 @@ obj_emit_relocations (where, fixP, segment_address_in_file) #ifndef obj_header_append /* Aout file generation & utilities */ + +/* An AOUT header on disk is laid out in target byte order. */ + void obj_header_append (where, headers) char **where; object_headers *headers; { - tc_headers_hook (headers); + char *p; -#ifdef CROSS_COMPILE - 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); - -#else /* CROSS_COMPILE */ - - append (where, (char *) &headers->header, sizeof (headers->header)); -#endif /* CROSS_COMPILE */ + tc_headers_hook (headers); +#ifdef __A_OUT_GNU_H__ +#define SIZEOF_HEADER(PIECE) (sizeof (((struct exec_bytes *) 0)->PIECE)) +#else +#define SIZEOF_HEADER(PIECE) 4 +#endif +#define DO(PIECE) \ + md_number_to_chars (p, headers->header.PIECE, SIZEOF_HEADER (PIECE)); \ + p += SIZEOF_HEADER (PIECE); + + p = *where; + DO (a_info); + DO (a_text); + DO (a_data); + DO (a_bss); + DO (a_syms); + DO (a_entry); + DO (a_trsize); + DO (a_drsize); + *where = p; +#undef DO +#undef SIZEOF_HEADER } #endif /* ! defined (obj_header_append) */ @@ -303,11 +306,17 @@ obj_symbol_to_chars (where, symbolP) char **where; symbolS *symbolP; { - 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 *) &(symbolP->sy_symbol.n_value), S_GET_VALUE (symbolP), sizeof (symbolP->sy_symbol.n_value)); - - append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type)); + char *p = *where; + md_number_to_chars (p, S_GET_OFFSET (symbolP), 4); + p += 4; + /* Can't use S_GET_TYPE here as it masks. */ + *p++ = symbolP->sy_symbol.n_type; + *p++ = symbolP->sy_symbol.n_other; + md_number_to_chars (p, S_GET_DESC (symbolP), 2); + p += 2; + md_number_to_chars (p, S_GET_VALUE (symbolP), 4); + p += 4; + *where = p; } void @@ -538,18 +547,13 @@ obj_emit_strings (where) { symbolS *symbolP; -#ifdef CROSS_COMPILE - /* 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_COMPILE */ - append (where, (char *) &string_byte_count, (unsigned long) sizeof (string_byte_count)); -#endif /* CROSS_COMPILE */ + md_number_to_chars (*where, string_byte_count, 4); + *where += 4; for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) { if (S_GET_NAME (symbolP)) - append (&next_object_file_charP, S_GET_NAME (symbolP), + append (where, S_GET_NAME (symbolP), (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1)); } /* walk symbol chain */ } diff --git a/gas/config/obj-aout.h b/gas/config/obj-aout.h index 23a2907acc5..271868691a5 100644 --- a/gas/config/obj-aout.h +++ b/gas/config/obj-aout.h @@ -1,6 +1,6 @@ /* obj-aout.h, a.out object file format for gas, the assembler. Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, - 2002, 2003 Free Software Foundation, Inc. + 2002, 2003, 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -177,9 +177,10 @@ extern void obj_aout_frob_file_before_fix PARAMS ((void)); #define H_GET_FILE_SIZE(h) (H_GET_HEADER_SIZE(h) \ + H_GET_TEXT_SIZE(h) \ + H_GET_DATA_SIZE(h) \ - + H_GET_SYMBOL_TABLE_SIZE(h) \ + H_GET_TEXT_RELOCATION_SIZE(h) \ + H_GET_DATA_RELOCATION_SIZE(h) \ + + H_GET_LINENO_SIZE(h) \ + + H_GET_SYMBOL_TABLE_SIZE(h) \ + H_GET_STRING_SIZE(h)) #define H_GET_HEADER_SIZE(h) (EXEC_BYTES_SIZE) diff --git a/gas/config/obj-bout.c b/gas/config/obj-bout.c index 88ea0f1c7c6..2163543f588 100644 --- a/gas/config/obj-bout.c +++ b/gas/config/obj-bout.c @@ -1,6 +1,6 @@ /* b.out object file format - Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 2000, 2001, 2002, + 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -105,7 +105,7 @@ obj_emit_relocations (where, fixP, segment_address_in_file) fixP->fx_addsy = sym; tc_bout_fix_to_chars (*where, fixP, segment_address_in_file); - *where += sizeof (struct relocation_info); + *where += md_reloc_size; } /* if there's a symbol */ } /* for each fixup */ } @@ -120,6 +120,7 @@ obj_header_append (where, headers) object_headers *headers; { /* Always leave in host byte order. */ + char *p; headers->header.a_talign = section_alignment[SEG_TEXT]; @@ -138,38 +139,32 @@ obj_header_append (where, headers) headers->header.a_relaxable = linkrelax; -#ifdef CROSS_COMPILE - 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); -#else /* ! CROSS_COMPILE */ - append (where, (char *) &headers->header, sizeof (headers->header)); -#endif /* ! CROSS_COMPILE */ + p = *where; + host_number_to_chars (p, headers->header.a_magic, 4); + p += 4; + host_number_to_chars (p, headers->header.a_text, 4); + p += 4; + host_number_to_chars (p, headers->header.a_data, 4); + p += 4; + host_number_to_chars (p, headers->header.a_bss, 4); + p += 4; + host_number_to_chars (p, headers->header.a_syms, 4); + p += 4; + host_number_to_chars (p, headers->header.a_entry, 4); + p += 4; + host_number_to_chars (p, headers->header.a_trsize, 4); + p += 4; + host_number_to_chars (p, headers->header.a_drsize, 4); + p += 4; + host_number_to_chars (p, headers->header.a_tload, 4); + p += 4; + host_number_to_chars (p, headers->header.a_dload, 4); + p += 4; + *p++ = headers->header.a_talign; + *p++ = headers->header.a_dalign; + *p++ = headers->header.a_balign; + *p++ = headers->header.a_relaxable; + *where = p; } void @@ -177,19 +172,17 @@ obj_symbol_to_chars (where, symbolP) char **where; symbolS *symbolP; { - 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 *) &symbolP->sy_symbol.n_value, - S_GET_VALUE (symbolP), - sizeof (symbolP->sy_symbol.n_value)); - - append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type)); + char *p = *where; + host_number_to_chars (p, S_GET_OFFSET (symbolP), 4); + p += 4; + /* Can't use S_GET_TYPE here as it masks. */ + *p++ = symbolP->sy_symbol.n_type; + *p++ = symbolP->sy_symbol.n_other; + host_number_to_chars (p, S_GET_DESC (symbolP), 2); + p += 2; + host_number_to_chars (p, S_GET_VALUE (symbolP), 4); + p += 4; + *where = p; } void @@ -336,14 +329,8 @@ obj_emit_strings (where) { symbolS *symbolP; -#ifdef CROSS_COMPILE - /* 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_COMPILE */ - append (where, (char *) &string_byte_count, - (unsigned long) sizeof (string_byte_count)); -#endif /* CROSS_COMPILE */ + md_number_to_chars (*where, string_byte_count, 4); + *where += 4; for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) { diff --git a/gas/config/obj-bout.h b/gas/config/obj-bout.h index aaa9d9beb7b..278fcc4a70f 100644 --- a/gas/config/obj-bout.h +++ b/gas/config/obj-bout.h @@ -1,6 +1,6 @@ /* b.out object file format Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, - 2002, 2003 Free Software Foundation, Inc. + 2002, 2003, 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -106,8 +106,10 @@ struct exec unsigned char a_relaxable; /* Contains enough info to relax */ }; +#define EXEC_BYTES_SIZE (10 * 4 + 4 * 1) + #define N_BADMAG(x) (((x).a_magic)!=BMAGIC) -#define N_TXTOFF(x) ( sizeof (struct exec) ) +#define N_TXTOFF(x) EXEC_BYTES_SIZE #define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) #define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) #define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize ) @@ -245,14 +247,14 @@ struct relocation_info /* File header macro and type definition */ -#define H_GET_FILE_SIZE(h) (sizeof (struct exec) + \ +#define H_GET_FILE_SIZE(h) (EXEC_BYTES_SIZE + \ H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ H_GET_SYMBOL_TABLE_SIZE(h) + \ H_GET_TEXT_RELOCATION_SIZE(h) + \ H_GET_DATA_RELOCATION_SIZE(h) + \ (h)->string_table_size) -#define H_GET_HEADER_SIZE(h) (sizeof (struct exec)) +#define H_GET_HEADER_SIZE(h) EXEC_BYTES_SIZE #define H_GET_TEXT_SIZE(h) ((h)->header.a_text) #define H_GET_DATA_SIZE(h) ((h)->header.a_data) #define H_GET_BSS_SIZE(h) ((h)->header.a_bss) @@ -280,8 +282,7 @@ struct relocation_info #define H_SET_TEXT_RELOCATION_SIZE(h,v) ((h)->header.a_trsize = (v)) #define H_SET_DATA_RELOCATION_SIZE(h,v) ((h)->header.a_drsize = (v)) -#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->header.a_syms = (v) * \ - sizeof (struct nlist)) +#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->header.a_syms = (v) * 12) #define H_SET_MAGIC_NUMBER(h,v) ((h)->header.a_magic = (v)) @@ -306,6 +307,12 @@ object_headers; #define OBJ_EMIT_LINENO(a, b, c) {;} #define obj_pre_write_hook(a) {;} +#if WORDS_BIGENDIAN +#define host_number_to_chars number_to_chars_bigendian +#else +#define host_number_to_chars number_to_chars_littleendian +#endif + #if __STDC__ struct fix; #endif diff --git a/gas/config/obj-hp300.c b/gas/config/obj-hp300.c index 2fc0f255929..0dc34351dbb 100644 --- a/gas/config/obj-hp300.c +++ b/gas/config/obj-hp300.c @@ -1,5 +1,5 @@ /* This file is obj-hp300.h - Copyright 1993, 2000 Free Software Foundation, Inc. + Copyright 1993, 2000, 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -30,8 +30,9 @@ hp300_header_append (where, headers) #define DO(FIELD) \ { \ - md_number_to_chars (*where, headers->header.FIELD, sizeof (headers->header.FIELD)); \ - *where += sizeof (headers->header.FIELD); \ + md_number_to_chars (*where, headers->header.FIELD, \ + sizeof (((struct exec_bytes *) 0)->FIELD)); \ + *where += sizeof (((struct exec_bytes *) 0)->FIELD); \ } DO (a_info); diff --git a/gas/config/tc-i960.c b/gas/config/tc-i960.c index 8b0a53898e1..1786afe2920 100644 --- a/gas/config/tc-i960.c +++ b/gas/config/tc-i960.c @@ -859,7 +859,7 @@ md_number_to_field (instrP, val, bfixP) /* Surprise! -- we stored the number of bits to be modified rather than a pointer to a structure. */ - numbits = (int) bfixP; + numbits = (int) (size_t) bfixP; if (numbits == 1) { /* This is a no-op, stuck here by reloc_callj() */ @@ -1116,9 +1116,6 @@ md_estimate_size_before_relax (fragP, segment_type) executable code is actually downloaded to the i80960). Therefore, we leave it in host byte order. - The above comment is no longer true. This routine now really - does do the reordering (Ian Taylor 28 Aug 92). - *************************************************************************** */ static void md_ri_to_chars PARAMS ((char *, struct relocation_info *)); @@ -1127,17 +1124,25 @@ md_ri_to_chars (where, ri) char *where; struct relocation_info *ri; { - md_number_to_chars (where, ri->r_address, - sizeof (ri->r_address)); - where[4] = ri->r_index & 0x0ff; - where[5] = (ri->r_index >> 8) & 0x0ff; - where[6] = (ri->r_index >> 16) & 0x0ff; - where[7] = ((ri->r_pcrel << 0) - | (ri->r_length << 1) - | (ri->r_extern << 3) - | (ri->r_bsr << 4) - | (ri->r_disp << 5) - | (ri->r_callj << 6)); + host_number_to_chars (where, ri->r_address, 4); + host_number_to_chars (where + 4, ri->r_index, 3); +#if WORDS_BIGENDIAN + where[7] = (ri->r_pcrel << 7 + | ri->r_length << 5 + | ri->r_extern << 4 + | ri->r_bsr << 3 + | ri->r_disp << 2 + | ri->r_callj << 1 + | ri->nuthin << 0); +#else + where[7] = (ri->r_pcrel << 0 + | ri->r_length << 1 + | ri->r_extern << 3 + | ri->r_bsr << 4 + | ri->r_disp << 5 + | ri->r_callj << 6 + | ri->nuthin << 7); +#endif } #endif /* defined(OBJ_AOUT) | defined(OBJ_BOUT) */ @@ -1508,7 +1513,7 @@ get_cdisp (dispP, ifmtP, instr, numbits, var_frag, callj) * bit_fix structure. So we're going to lie and store * the number of bits affected instead of a pointer. */ - fixP->fx_bit_fixP = (bit_fixS *) numbits; + fixP->fx_bit_fixP = (bit_fixS *) (size_t) numbits; } } else @@ -2832,7 +2837,7 @@ md_apply_fix3 (fixP, valP, seg) md_number_to_imm (place, val, fixP->fx_size); } - else if ((int) fixP->fx_bit_fixP == 13 + else if ((int) (size_t) fixP->fx_bit_fixP == 13 && fixP->fx_addsy != NULL && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section) { diff --git a/gas/configure b/gas/configure index 47c8a867780..9092d4bd997 100755 --- a/gas/configure +++ b/gas/configure @@ -4129,6 +4129,238 @@ case "${host}" in esac +#We need this for the host. BOUT header is in host order. +echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 +if test "${ac_cv_c_bigendian+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # See if sys/param.h defines the BYTE_ORDER macro. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # It does; now see whether it defined to BIG_ENDIAN or not. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_bigendian=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +# It does not; compile a test program. +if test "$cross_compiling" = yes; then + # try to guess the endianness by grepping values into an object file + ac_cv_c_bigendian=unknown + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } +short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +int +main () +{ + _ascii (); _ebcdic (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then + ac_cv_c_bigendian=yes +fi +if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi +fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +main () +{ + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6 +case $ac_cv_c_bigendian in + yes) + +cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF + ;; + no) + ;; + *) + { { echo "$as_me:$LINENO: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +echo "$as_me: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; +esac + + te_file=generic # Makefile target for installing gas in $(tooldir)/bin. diff --git a/gas/configure.in b/gas/configure.in index 3296f8c0f05..3bc5a999317 100644 --- a/gas/configure.in +++ b/gas/configure.in @@ -86,6 +86,9 @@ case "${host}" in esac AC_SUBST(GDBINIT) +#We need this for the host. BOUT header is in host order. +AC_C_BIGENDIAN + te_file=generic # Makefile target for installing gas in $(tooldir)/bin. diff --git a/gas/write.c b/gas/write.c index f6a1c7e53b1..c0749e87604 100644 --- a/gas/write.c +++ b/gas/write.c @@ -1569,11 +1569,11 @@ write_object_file (void) Count the number of string-table chars we will emit. Put this info into the headers as appropriate. */ know (zero_address_frag.fr_address == 0); - string_byte_count = sizeof (string_byte_count); + string_byte_count = 4; obj_crawl_symbol_chain (&headers); - if (string_byte_count == sizeof (string_byte_count)) + if (string_byte_count == 4) string_byte_count = 0; H_SET_STRING_SIZE (&headers, string_byte_count);