aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-02-22 09:18:52 -0800
committerH.J. Lu <hjl.tools@gmail.com>2016-02-26 05:01:34 -0800
commitb8871f357fdfa9c0c06d2d3e5600391d8c994f37 (patch)
tree0430589d93fe3bf39d5f16f6e58d8c3de88e8f38 /gas
parentaec6b87e0b66d707ead62ca40d220ee78b4cf5a5 (diff)
downloadgdb-b8871f357fdfa9c0c06d2d3e5600391d8c994f37.zip
gdb-b8871f357fdfa9c0c06d2d3e5600391d8c994f37.tar.gz
gdb-b8871f357fdfa9c0c06d2d3e5600391d8c994f37.tar.bz2
Properly implement STT_COMMON
The BFD configure option, --enable-elf-stt-common, can't be to used to verify STT_COMMON implementation with the normal binutils build. Instead, this patch removes it from BFD. It adds --elf-stt-common=[no|yes] to ELF assembler/objcopy and adds -z common/-z nocommon to ld. A configure option, --enable-elf-stt-common, is added to gas to specify whether ELF assembler should generate common symbols with the STT_COMMON type by default. Since BSF_KEEP_G is never used, it is renamed to BSF_ELF_COMMON for ELF common symbols. bfd/ PR ld/19645 * bfd.c (bfd): Change flags to 20 bits. (BFD_CONVERT_ELF_COMMON): New. (BFD_USE_ELF_STT_COMMON): Likewise. (BFD_FLAGS_SAVED): Add BFD_CONVERT_ELF_COMMON and BFD_USE_ELF_STT_COMMON. (BFD_FLAGS_FOR_BFD_USE_MASK): Likewise. * configure.ac: Remove --enable-elf-stt-common. * elf.c (swap_out_syms): Choose STT_COMMON or STT_OBJECT for common symbol depending on BFD_CONVERT_ELF_COMMON and BFD_USE_ELF_STT_COMMON. * elfcode.h (elf_slurp_symbol_table): Set BSF_ELF_COMMON for STT_COMMON. * elflink.c (bfd_elf_link_mark_dynamic_symbol): Also check STT_COMMON. (elf_link_convert_common_type): New function. (elf_link_output_extsym): Choose STT_COMMON or STT_OBJECT for common symbol depending on BFD_CONVERT_ELF_COMMON and BFD_USE_ELF_STT_COMMON. Set sym.st_info after sym.st_shndx. * elfxx-target.h (TARGET_BIG_SYM): Add BFD_CONVERT_ELF_COMMON and BFD_USE_ELF_STT_COMMON to object_flags. (TARGET_LITTLE_SYM): Likewise. * syms.c (BSF_KEEP_G): Renamed to ... (BSF_ELF_COMMON): This. * bfd-in2.h: Regenerated. * config.in: Likewise. * configure: Likewise. binutils/ PR ld/19645 * NEWS: Mention --elf-stt-common= for objcopy. * doc/binutils.texi: Document --elf-stt-common= for objcopy. * objcopy.c (do_elf_stt_common): New. (command_line_switch): Add OPTION_ELF_STT_COMMON. (copy_options): Add --elf-stt-common=. (copy_usage): Add --elf-stt-common=. (copy_object): Also check do_elf_stt_common for ELF targets. (copy_file): Handle do_elf_stt_common. (copy_main): Handle OPTION_ELF_STT_COMMON. * readelf.c (apply_relocations): Support STT_COMMON. * testsuite/binutils-all/common-1.s: New file. * testsuite/binutils-all/common-1a.d: Likewise. * testsuite/binutils-all/common-1b.d: Likewise. * testsuite/binutils-all/common-1c.d: Likewise. * testsuite/binutils-all/common-1d.d: Likewise. * testsuite/binutils-all/common-1e.d: Likewise. * testsuite/binutils-all/common-1f.d: Likewise. * testsuite/binutils-all/common-2.s: Likewise. * testsuite/binutils-all/common-2a.d: Likewise. * testsuite/binutils-all/common-2b.d: Likewise. * testsuite/binutils-all/common-2c.d: Likewise. * testsuite/binutils-all/common-2d.d: Likewise. * testsuite/binutils-all/common-2e.d: Likewise. * testsuite/binutils-all/common-2f.d: Likewise. * testsuite/binutils-all/objcopy.exp (objcopy_test_elf_common_symbols): New proc. Run objcopy_test_elf_common_symbols for ELF targets gas/ PR ld/19645 * NEWS: Mention --enable-elf-stt-common and --elf-stt-common= for ELF assemblers. * as.c (flag_use_elf_stt_common): New. (show_usage): Add --elf-stt-common=. (option_values): Add OPTION_ELF_STT_COMMON. (std_longopts): Add --elf-stt-common=. (parse_args): Handle --elf-stt-common=. * as.h (flag_use_elf_stt_common): New. * config.in: Regenerated. * configure: Likewise. * configure.ac: Add --enable-elf-stt-common and define DEFAULT_GENERATE_ELF_STT_COMMON. * gas/write.c (write_object_file): Set BFD_CONVERT_ELF_COMMON and BFD_USE_ELF_STT_COMMON if flag_use_elf_stt_common is set. * doc/as.texinfo: Document --elf-stt-common=. * testsuite/gas/elf/common3.s: New file. * testsuite/gas/elf/common3a.d: Likewise. * testsuite/gas/elf/common3b.d: Likewise. * testsuite/gas/elf/common4.s: Likewise. * testsuite/gas/elf/common4a.d: Likewise. * testsuite/gas/elf/common4b.d: Likewise. * testsuite/gas/i386/dw2-compress-3b.d: Likewise. * testsuite/gas/i386/dw2-compressed-3b.d: Likewise. * testsuite/gas/elf/elf.exp: Run common3a, common3b, common4a and common4b. * testsuite/gas/i386/dw2-compress-3.d: Renamed to ... * testsuite/gas/i386/dw2-compress-3a.d: This. Pass --elf-stt-common=no to as. * testsuite/gas/i386/dw2-compressed-3.d: Renamed to ... * testsuite/gas/i386/dw2-compressed-3a.d: This. Pass --elf-stt-common=no to as. * testsuite/gas/i386/i386.exp: Run dw2-compress-3a, dw2-compress-3b, dw2-compressed-3a and dw2-compressed-3b instead of dw2-compress-3 and dw2-compressed-3. include/ PR ld/19645 * bfdlink.h (bfd_link_elf_stt_common): New enum. (bfd_link_info): Add elf_stt_common. ld/ PR ld/19645 * NEWS: Mention -z common/-z nocommon for ELF targets. * emultempl/elf32.em (gld${EMULATION_NAME}_handle_option): Handle -z common and -z nocommon. * ld.texinfo: Document -z common/-z nocommon. * lexsup.c (elf_shlib_list_options): Add -z common/-z nocommon. * testsuite/ld-elf/tls_common.exp: Test --elf-stt-common=no and --elf-stt-common=yes with assembler. * testsuite/ld-elfcomm/common-1.s: New file. * testsuite/ld-elfcomm/common-1a.d: Likewise. * testsuite/ld-elfcomm/common-1b.d: Likewise. * testsuite/ld-elfcomm/common-1c.d: Likewise. * testsuite/ld-elfcomm/common-1d.d: Likewise. * testsuite/ld-elfcomm/common-1e.d: Likewise. * testsuite/ld-elfcomm/common-1f.d: Likewise. * testsuite/ld-elfcomm/common-2.s: Likewise. * testsuite/ld-elfcomm/common-2a.d: Likewise. * testsuite/ld-elfcomm/common-2b.d: Likewise. * testsuite/ld-elfcomm/common-2c.d: Likewise. * testsuite/ld-elfcomm/common-2d.d: Likewise. * testsuite/ld-elfcomm/common-2e.d: Likewise. * testsuite/ld-elfcomm/common-2f.d: Likewise. * testsuite/ld-elfcomm/common-3a.rd: Likewise. * testsuite/ld-elfcomm/common-3b.rd: Likewise. * testsuite/ld-i386/pr19645.d: Likewise. * testsuite/ld-i386/pr19645.s: Likewise. * testsuite/ld-x86-64/largecomm-1.s: Likewise. * testsuite/ld-x86-64/largecomm-1a.d: Likewise. * testsuite/ld-x86-64/largecomm-1b.d: Likewise. * testsuite/ld-x86-64/largecomm-1c.d: Likewise. * testsuite/ld-x86-64/largecomm-1d.d: Likewise. * testsuite/ld-x86-64/largecomm-1e.d: Likewise. * testsuite/ld-x86-64/largecomm-1f.d: Likewise. * testsuite/ld-x86-64/pr19645.d: Likewise. * testsuite/ld-x86-64/pr19645.s: Likewise. * testsuite/ld-elfcomm/elfcomm.exp: Test --elf-stt-common=yes with assembler. (assembler_generates_commons): Removed. Run -z common/-z nocommon tests. Run *.d tests. * testsuite/ld-i386/i386.exp: Run pr19645. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-x86-64/dwarfreloc.exp: Test --elf-stt-common with assembler. Test STT_COMMON with readelf.
Diffstat (limited to 'gas')
-rw-r--r--gas/NEWS7
-rw-r--r--gas/as.c19
-rw-r--r--gas/as.h3
-rw-r--r--gas/config.in4
-rwxr-xr-xgas/configure27
-rw-r--r--gas/configure.ac19
-rw-r--r--gas/doc/as.texinfo9
-rw-r--r--gas/testsuite/gas/elf/common3.s1
-rw-r--r--gas/testsuite/gas/elf/common3a.d7
-rw-r--r--gas/testsuite/gas/elf/common3b.d7
-rw-r--r--gas/testsuite/gas/elf/common4.s1
-rw-r--r--gas/testsuite/gas/elf/common4a.d7
-rw-r--r--gas/testsuite/gas/elf/common4b.d7
-rw-r--r--gas/testsuite/gas/elf/elf.exp4
-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.d104
-rw-r--r--gas/testsuite/gas/i386/dw2-compressed-3b.d104
-rw-r--r--gas/testsuite/gas/i386/i386.exp6
-rw-r--r--gas/write.c5
20 files changed, 342 insertions, 8 deletions
diff --git a/gas/NEWS b/gas/NEWS
index dd34a9f..a627028 100644
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -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.
diff --git a/gas/as.c b/gas/as.c
index 55214f4..14980b9 100644
--- a/gas/as.c
+++ b/gas/as.c
@@ -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;
diff --git a/gas/as.h b/gas/as.h
index bf1206f..4e5601b 100644
--- a/gas/as.h
+++ b/gas/as.h
@@ -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