diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-02-22 09:18:52 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-02-26 05:01:34 -0800 |
commit | b8871f357fdfa9c0c06d2d3e5600391d8c994f37 (patch) | |
tree | 0430589d93fe3bf39d5f16f6e58d8c3de88e8f38 /gas/testsuite | |
parent | aec6b87e0b66d707ead62ca40d220ee78b4cf5a5 (diff) | |
download | gdb-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/testsuite')
-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 |
12 files changed, 251 insertions, 6 deletions
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" } } |