diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/NEWS | 7 | ||||
-rw-r--r-- | gas/as.c | 19 | ||||
-rw-r--r-- | gas/as.h | 3 | ||||
-rw-r--r-- | gas/config.in | 4 | ||||
-rwxr-xr-x | gas/configure | 27 | ||||
-rw-r--r-- | gas/configure.ac | 19 | ||||
-rw-r--r-- | gas/doc/as.texinfo | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/common3.s | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/common3a.d | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/common3b.d | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/common4.s | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/common4a.d | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/common4b.d | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/elf.exp | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/dw2-compress-3a.d (renamed from gas/testsuite/gas/i386/dw2-compressed-3.d) | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/dw2-compress-3b.d (renamed from gas/testsuite/gas/i386/dw2-compress-3.d) | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/dw2-compressed-3a.d | 104 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/dw2-compressed-3b.d | 104 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 6 | ||||
-rw-r--r-- | gas/write.c | 5 |
20 files changed, 342 insertions, 8 deletions
@@ -1,4 +1,11 @@ -*- text -*- +* Add a configure option --enable-elf-stt-common to decide whether ELF + assembler should generate common symbols with the STT_COMMON type by + default. Default to no. + +* New command line option --elf-stt-common= for ELF targets to control + whether to generate common symbols with the STT_COMMON type. + * Add ability to set section flags and types via numeric values for ELF based targets. @@ -96,6 +96,10 @@ int debug_memory = 0; /* Enable verbose mode. */ int verbose = 0; +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF +int flag_use_elf_stt_common = DEFAULT_GENERATE_ELF_STT_COMMON; +#endif + /* Keep the output file. */ static int keep_it = 0; @@ -300,6 +304,9 @@ Options:\n\ --size-check=[error|warning]\n\ ELF .size directive check (default --size-check=error)\n")); fprintf (stream, _("\ + --elf-stt-common=[no|yes]\n\ + generate ELF common symbols with STT_COMMON type\n")); + fprintf (stream, _("\ --sectname-subst enable section name substitution sequences\n")); #endif fprintf (stream, _("\ @@ -464,6 +471,7 @@ parse_args (int * pargc, char *** pargv) OPTION_EXECSTACK, OPTION_NOEXECSTACK, OPTION_SIZE_CHECK, + OPTION_ELF_STT_COMMON, OPTION_SECTNAME_SUBST, OPTION_ALTERNATE, OPTION_AL, @@ -499,6 +507,7 @@ parse_args (int * pargc, char *** pargv) ,{"execstack", no_argument, NULL, OPTION_EXECSTACK} ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK} ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK} + ,{"elf-stt-common", required_argument, NULL, OPTION_ELF_STT_COMMON} ,{"sectname-subst", no_argument, NULL, OPTION_SECTNAME_SUBST} #endif ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL} @@ -868,6 +877,16 @@ This program has absolutely no warranty.\n")); as_fatal (_("Invalid --size-check= option: `%s'"), optarg); break; + case OPTION_ELF_STT_COMMON: + if (strcasecmp (optarg, "no") == 0) + flag_use_elf_stt_common = 0; + else if (strcasecmp (optarg, "yes") == 0) + flag_use_elf_stt_common = 1; + else + as_fatal (_("Invalid --elf-stt-common= option: `%s'"), + optarg); + break; + case OPTION_SECTNAME_SUBST: flag_sectname_subst = 1; break; @@ -592,6 +592,9 @@ COMMON enum } flag_size_check; +/* If we should generate ELF common symbols with the STT_COMMON type. */ +extern int flag_use_elf_stt_common; + /* If section name substitution sequences should be honored */ COMMON int flag_sectname_subst; #endif diff --git a/gas/config.in b/gas/config.in index 8b040fc..e06f160 100644 --- a/gas/config.in +++ b/gas/config.in @@ -39,6 +39,10 @@ /* Define if you want compressed debug sections by default. */ #undef DEFAULT_FLAG_COMPRESS_DEBUG +/* Define to 1 if you want to generate ELF common symbols with the STT_COMMON + type by default. */ +#undef DEFAULT_GENERATE_ELF_STT_COMMON + /* Define to 1 if you want to generate x86 relax relocations by default. */ #undef DEFAULT_GENERATE_X86_RELAX_RELOCATIONS diff --git a/gas/configure b/gas/configure index cd7182f..bc5a1ba 100755 --- a/gas/configure +++ b/gas/configure @@ -766,6 +766,7 @@ enable_targets enable_checking enable_compressed_debug_sections enable_x86_relax_relocations +enable_elf_stt_common enable_werror enable_build_warnings enable_nls @@ -1418,6 +1419,8 @@ Optional Features: compress debug sections by default --enable-x86-relax-relocations generate x86 relax relocations by default + --enable-elf-stt-common generate ELF common symbols with STT_COMMON type by + default --enable-werror treat compile warnings as errors --enable-build-warnings enable build-time compiler warnings --disable-nls do not use Native Language Support @@ -10975,7 +10978,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10978 "configure" +#line 10981 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11081,7 +11084,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11084 "configure" +#line 11087 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11694,6 +11697,17 @@ if test "${enable_x86_relax_relocations+set}" = set; then : esac fi +# Decide if ELF assembler should generate common symbols with the +# STT_COMMON type. +ac_default_elf_stt_common=unset +# Provide a configure time option to override our default. +# Check whether --enable-elf_stt_common was given. +if test "${enable_elf_stt_common+set}" = set; then : + enableval=$enable_elf_stt_common; case "${enableval}" in + yes) ac_default_elf_stt_common=1 ;; +esac +fi + using_cgen=no @@ -12539,6 +12553,15 @@ cat >>confdefs.h <<_ACEOF _ACEOF +if test ${ac_default_elf_stt_common} = unset; then + ac_default_elf_stt_common=0 +fi + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_GENERATE_ELF_STT_COMMON $ac_default_elf_stt_common +_ACEOF + + if test x$ac_default_compressed_debug_sections = xyes ; then $as_echo "#define DEFAULT_FLAG_COMPRESS_DEBUG 1" >>confdefs.h diff --git a/gas/configure.ac b/gas/configure.ac index 377526e..8f71825 100644 --- a/gas/configure.ac +++ b/gas/configure.ac @@ -88,6 +88,17 @@ AC_ARG_ENABLE(x86_relax_relocations, no) ac_default_x86_relax_relocations=0 ;; esac])dnl +# Decide if ELF assembler should generate common symbols with the +# STT_COMMON type. +ac_default_elf_stt_common=unset +# Provide a configure time option to override our default. +AC_ARG_ENABLE(elf_stt_common, + AS_HELP_STRING([--enable-elf-stt-common], + [generate ELF common symbols with STT_COMMON type by default]), +[case "${enableval}" in + yes) ac_default_elf_stt_common=1 ;; +esac])dnl + using_cgen=no AM_BINUTILS_WARNINGS @@ -578,6 +589,14 @@ AC_DEFINE_UNQUOTED(DEFAULT_GENERATE_X86_RELAX_RELOCATIONS, $ac_default_x86_relax_relocations, [Define to 1 if you want to generate x86 relax relocations by default.]) +if test ${ac_default_elf_stt_common} = unset; then + ac_default_elf_stt_common=0 +fi +AC_DEFINE_UNQUOTED(DEFAULT_GENERATE_ELF_STT_COMMON, + $ac_default_elf_stt_common, + [Define to 1 if you want to generate ELF common symbols with the + STT_COMMON type by default.]) + if test x$ac_default_compressed_debug_sections = xyes ; then AC_DEFINE(DEFAULT_FLAG_COMPRESS_DEBUG, 1, [Define if you want compressed debug sections by default.]) fi diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 055e2f7..a0584d3 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -242,6 +242,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. [@b{-W}] [@b{--warn}] [@b{--fatal-warnings}] [@b{-w}] [@b{-x}] [@b{-Z}] [@b{@@@var{FILE}}] [@b{--sectname-subst}] [@b{--size-check=[error|warning]}] + [@b{--elf-stt-common=[no|yes]}] [@b{--target-help}] [@var{target-options}] [@b{--}|@var{files} @dots{}] @c @@ -712,10 +713,18 @@ will have its dwarf line number information placed into a section called then debug line section will still be called just @var{.debug_line} without any suffix. +@ifset ELF @item --size-check=error @itemx --size-check=warning Issue an error or warning for invalid ELF .size directive. +@item --elf-stt-common=no +@itemx --elf-stt-common=yes +These options control whether the ELF assembler should generate common +symbols with the @code{STT_COMMON} type. The default can be controlled +by a configure option @option{--enable-elf-stt-common}. +@end ifset + @item --help Print a summary of the command line options and exit. diff --git a/gas/testsuite/gas/elf/common3.s b/gas/testsuite/gas/elf/common3.s new file mode 100644 index 0000000..f684da4 --- /dev/null +++ b/gas/testsuite/gas/elf/common3.s @@ -0,0 +1 @@ + .comm foobar,30,4 diff --git a/gas/testsuite/gas/elf/common3a.d b/gas/testsuite/gas/elf/common3a.d new file mode 100644 index 0000000..fa9d5ce --- /dev/null +++ b/gas/testsuite/gas/elf/common3a.d @@ -0,0 +1,7 @@ +#source: common3.s +#as: --elf-stt-common=yes +#readelf: -s -W + +#... + +[0-9]+: +0+4 +30 +COMMON +GLOBAL +DEFAULT +COM +foobar +#pass diff --git a/gas/testsuite/gas/elf/common3b.d b/gas/testsuite/gas/elf/common3b.d new file mode 100644 index 0000000..9481d13 --- /dev/null +++ b/gas/testsuite/gas/elf/common3b.d @@ -0,0 +1,7 @@ +#source: common3.s +#as: --elf-stt-common=no +#readelf: -s -W + +#... + +[0-9]+: +0+4 +30 +OBJECT +GLOBAL +DEFAULT +COM +foobar +#pass diff --git a/gas/testsuite/gas/elf/common4.s b/gas/testsuite/gas/elf/common4.s new file mode 100644 index 0000000..bf2c26c --- /dev/null +++ b/gas/testsuite/gas/elf/common4.s @@ -0,0 +1 @@ + .tls_common foobar,30,4 diff --git a/gas/testsuite/gas/elf/common4a.d b/gas/testsuite/gas/elf/common4a.d new file mode 100644 index 0000000..fceb01b --- /dev/null +++ b/gas/testsuite/gas/elf/common4a.d @@ -0,0 +1,7 @@ +#source: common4.s +#as: --elf-stt-common=yes +#readelf: -s -W + +#... + +[0-9]+: +0+4 +30 +TLS +GLOBAL +DEFAULT +COM +foobar +#pass diff --git a/gas/testsuite/gas/elf/common4b.d b/gas/testsuite/gas/elf/common4b.d new file mode 100644 index 0000000..c18284e --- /dev/null +++ b/gas/testsuite/gas/elf/common4b.d @@ -0,0 +1,7 @@ +#source: common4.s +#as: --elf-stt-common=no +#readelf: -s -W + +#... + +[0-9]+: +0+4 +30 +TLS +GLOBAL +DEFAULT +COM +foobar +#pass diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index a2a86dd..fb5619d 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -218,6 +218,10 @@ if { [is_elf_format] } then { if { ![istarget "*-*-hpux*"] } then { run_dump_test "common1" run_dump_test "common2" + run_dump_test "common3a" + run_dump_test "common3b" + run_dump_test "common4a" + run_dump_test "common4b" } run_dump_test "strtab" diff --git a/gas/testsuite/gas/i386/dw2-compressed-3.d b/gas/testsuite/gas/i386/dw2-compress-3a.d index bd2818b..fe19884 100644 --- a/gas/testsuite/gas/i386/dw2-compressed-3.d +++ b/gas/testsuite/gas/i386/dw2-compress-3a.d @@ -1,7 +1,7 @@ #source: dw2-compress-3.s -#as: --compress-debug-sections=zlib-gabi +#as: --compress-debug-sections --elf-stt-common=no #readelf: -w -#name: DWARF2 debugging information 3 with SHF_COMPRESSED +#name: DWARF2 debugging information 3 w/o STT_COMMON Contents of the .debug_info section: diff --git a/gas/testsuite/gas/i386/dw2-compress-3.d b/gas/testsuite/gas/i386/dw2-compress-3b.d index d2aa8ef..aa0651e 100644 --- a/gas/testsuite/gas/i386/dw2-compress-3.d +++ b/gas/testsuite/gas/i386/dw2-compress-3b.d @@ -1,6 +1,7 @@ -#as: --compress-debug-sections +#source: dw2-compress-3.s +#as: --compress-debug-sections --elf-stt-common=yes #readelf: -w -#name: DWARF2 debugging information 3 +#name: DWARF2 debugging information 3 with STT_COMMON Contents of the .debug_info section: diff --git a/gas/testsuite/gas/i386/dw2-compressed-3a.d b/gas/testsuite/gas/i386/dw2-compressed-3a.d new file mode 100644 index 0000000..a0d16c7 --- /dev/null +++ b/gas/testsuite/gas/i386/dw2-compressed-3a.d @@ -0,0 +1,104 @@ +#source: dw2-compress-3.s +#as: --compress-debug-sections=zlib-gabi --elf-stt-common=no +#readelf: -w +#name: DWARF2 debugging information 3 with SHF_COMPRESSED w/o STT_COMMON + +Contents of the .debug_info section: + + Compilation Unit @ offset 0x0: + Length: 0x32 \(32-bit\) + Version: 4 + Abbrev Offset: 0x0 + Pointer Size: 4 + <0><b>: Abbrev Number: 1 \(DW_TAG_compile_unit\) + <c> DW_AT_producer : \(indirect string, offset: 0x2\): GNU C 4.8.3 + <10> DW_AT_language : 1 \(ANSI C\) + <11> DW_AT_name : \(indirect string, offset: 0xe\): dw2-compress-3.c + <15> DW_AT_comp_dir : \(indirect string, offset: 0x0\): . + <19> DW_AT_stmt_list : 0x0 + <1><1d>: Abbrev Number: 2 \(DW_TAG_variable\) + <1e> DW_AT_name : foo + <22> DW_AT_decl_file : 1 + <23> DW_AT_decl_line : 1 + <24> DW_AT_type : <0x2e> + <28> DW_AT_external : 1 + <28> DW_AT_location : 5 byte block: 3 4 0 0 0 \(DW_OP_addr: 4\) + <1><2e>: Abbrev Number: 3 \(DW_TAG_base_type\) + <2f> DW_AT_byte_size : 4 + <30> DW_AT_encoding : 5 \(signed\) + <31> DW_AT_name : int + <1><35>: Abbrev Number: 0 + +Contents of the .debug_abbrev section: + + Number TAG \(0x0\) + 1 DW_TAG_compile_unit \[has children\] + DW_AT_producer DW_FORM_strp + DW_AT_language DW_FORM_data1 + DW_AT_name DW_FORM_strp + DW_AT_comp_dir DW_FORM_strp + DW_AT_stmt_list DW_FORM_sec_offset + DW_AT value: 0 DW_FORM value: 0 + 2 DW_TAG_variable \[no children\] + DW_AT_name DW_FORM_string + DW_AT_decl_file DW_FORM_data1 + DW_AT_decl_line DW_FORM_data1 + DW_AT_type DW_FORM_ref4 + DW_AT_external DW_FORM_flag_present + DW_AT_location DW_FORM_exprloc + DW_AT value: 0 DW_FORM value: 0 + 3 DW_TAG_base_type \[no children\] + DW_AT_byte_size DW_FORM_data1 + DW_AT_encoding DW_FORM_data1 + DW_AT_name DW_FORM_string + DW_AT value: 0 DW_FORM value: 0 + +Contents of the .debug_aranges section: + + Length: 20 + Version: 2 + Offset into .debug_info: 0x0 + Pointer Size: 4 + Segment Size: 0 + + Address Length + 00000000 00000000 + +Raw dump of debug contents of section .debug_line: + + Offset: 0x0 + Length: 45 + DWARF Version: 2 + Prologue Length: 39 + Minimum Instruction Length: 1 + Initial value of 'is_stmt': 1 + Line Base: -5 + Line Range: 14 + Opcode Base: 13 + + Opcodes: + Opcode 1 has 0 args + Opcode 2 has 1 args + Opcode 3 has 1 args + Opcode 4 has 1 args + Opcode 5 has 1 args + Opcode 6 has 0 args + Opcode 7 has 0 args + Opcode 8 has 0 args + Opcode 9 has 1 args + Opcode 10 has 0 args + Opcode 11 has 0 args + Opcode 12 has 1 args + + The Directory Table is empty. + + The File Name Table \(offset 0x1c\): + Entry Dir Time Size Name + 1 0 0 0 dw2-compress-3.c + + No Line Number Statements. +Contents of the .debug_str section: + + 0x00000000 2e00474e 55204320 342e382e 33006477 ..GNU C 4.8.3.dw + 0x00000010 322d636f 6d707265 73732d33 2e6300 2-compress-3.c. + diff --git a/gas/testsuite/gas/i386/dw2-compressed-3b.d b/gas/testsuite/gas/i386/dw2-compressed-3b.d new file mode 100644 index 0000000..6469ca9 --- /dev/null +++ b/gas/testsuite/gas/i386/dw2-compressed-3b.d @@ -0,0 +1,104 @@ +#source: dw2-compress-3.s +#as: --compress-debug-sections=zlib-gabi --elf-stt-common=yes +#readelf: -w +#name: DWARF2 debugging information 3 with SHF_COMPRESSED with STT_COMMON + +Contents of the .debug_info section: + + Compilation Unit @ offset 0x0: + Length: 0x32 \(32-bit\) + Version: 4 + Abbrev Offset: 0x0 + Pointer Size: 4 + <0><b>: Abbrev Number: 1 \(DW_TAG_compile_unit\) + <c> DW_AT_producer : \(indirect string, offset: 0x2\): GNU C 4.8.3 + <10> DW_AT_language : 1 \(ANSI C\) + <11> DW_AT_name : \(indirect string, offset: 0xe\): dw2-compress-3.c + <15> DW_AT_comp_dir : \(indirect string, offset: 0x0\): . + <19> DW_AT_stmt_list : 0x0 + <1><1d>: Abbrev Number: 2 \(DW_TAG_variable\) + <1e> DW_AT_name : foo + <22> DW_AT_decl_file : 1 + <23> DW_AT_decl_line : 1 + <24> DW_AT_type : <0x2e> + <28> DW_AT_external : 1 + <28> DW_AT_location : 5 byte block: 3 4 0 0 0 \(DW_OP_addr: 4\) + <1><2e>: Abbrev Number: 3 \(DW_TAG_base_type\) + <2f> DW_AT_byte_size : 4 + <30> DW_AT_encoding : 5 \(signed\) + <31> DW_AT_name : int + <1><35>: Abbrev Number: 0 + +Contents of the .debug_abbrev section: + + Number TAG \(0x0\) + 1 DW_TAG_compile_unit \[has children\] + DW_AT_producer DW_FORM_strp + DW_AT_language DW_FORM_data1 + DW_AT_name DW_FORM_strp + DW_AT_comp_dir DW_FORM_strp + DW_AT_stmt_list DW_FORM_sec_offset + DW_AT value: 0 DW_FORM value: 0 + 2 DW_TAG_variable \[no children\] + DW_AT_name DW_FORM_string + DW_AT_decl_file DW_FORM_data1 + DW_AT_decl_line DW_FORM_data1 + DW_AT_type DW_FORM_ref4 + DW_AT_external DW_FORM_flag_present + DW_AT_location DW_FORM_exprloc + DW_AT value: 0 DW_FORM value: 0 + 3 DW_TAG_base_type \[no children\] + DW_AT_byte_size DW_FORM_data1 + DW_AT_encoding DW_FORM_data1 + DW_AT_name DW_FORM_string + DW_AT value: 0 DW_FORM value: 0 + +Contents of the .debug_aranges section: + + Length: 20 + Version: 2 + Offset into .debug_info: 0x0 + Pointer Size: 4 + Segment Size: 0 + + Address Length + 00000000 00000000 + +Raw dump of debug contents of section .debug_line: + + Offset: 0x0 + Length: 45 + DWARF Version: 2 + Prologue Length: 39 + Minimum Instruction Length: 1 + Initial value of 'is_stmt': 1 + Line Base: -5 + Line Range: 14 + Opcode Base: 13 + + Opcodes: + Opcode 1 has 0 args + Opcode 2 has 1 args + Opcode 3 has 1 args + Opcode 4 has 1 args + Opcode 5 has 1 args + Opcode 6 has 0 args + Opcode 7 has 0 args + Opcode 8 has 0 args + Opcode 9 has 1 args + Opcode 10 has 0 args + Opcode 11 has 0 args + Opcode 12 has 1 args + + The Directory Table is empty. + + The File Name Table \(offset 0x1c\): + Entry Dir Time Size Name + 1 0 0 0 dw2-compress-3.c + + No Line Number Statements. +Contents of the .debug_str section: + + 0x00000000 2e00474e 55204320 342e382e 33006477 ..GNU C 4.8.3.dw + 0x00000010 322d636f 6d707265 73732d33 2e6300 2-compress-3.c. + diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 22aca23..f1e7611 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -448,9 +448,11 @@ if [expr [istarget "i*86-*-*"] || [istarget "x86_64-*-*"]] then { run_list_test_stdin "list-2" "-al" run_list_test_stdin "list-3" "-al" run_dump_test "dw2-compress-1" - run_dump_test "dw2-compress-3" + run_dump_test "dw2-compress-3a" + run_dump_test "dw2-compress-3b" run_dump_test "dw2-compressed-1" - run_dump_test "dw2-compressed-3" + run_dump_test "dw2-compressed-3a" + run_dump_test "dw2-compressed-3b" } } diff --git a/gas/write.c b/gas/write.c index f623b00..24cd6ca 100644 --- a/gas/write.c +++ b/gas/write.c @@ -2209,6 +2209,11 @@ write_object_file (void) obj_frob_file_after_relocs (); #endif +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF + if (IS_ELF && flag_use_elf_stt_common) + stdoutput->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON; +#endif + /* Once all relocations have been written, we can compress the contents of the debug sections. This needs to be done before we start writing any sections, because it will affect the file |