| From 223d6ac4831ab29a65022b837caf05942ef25d71 Mon Sep 17 00:00:00 2001 |
| From: "H.J. Lu" <hjl.tools@gmail.com> |
| Date: Wed, 18 Mar 2015 06:50:18 -0700 |
| Subject: [PATCH 1/2] Add SHF_COMPRESSED section decompression to gold |
| |
| This patch adds SHF_COMPRESSED section decompression to gold. |
| |
| PR gold/18321 |
| * compressed_output.h (decompress_input_section): Add arguments |
| for ELF class, big endian and sh_flags. |
| * compressed_output.cc (decompress_input_section): Likewise. |
| Support the SHF_COMPRESSED section. |
| * dynobj.h (Dynobj): Add elfsize and is_big_endian member |
| functions. |
| * plugin.h (Pluginobj): Likewise. |
| * object.h (Compressed_section_info): Add flag to store sh_flags. |
| (Object): Add pure virtual elfsize and is_big_endian member |
| functions. |
| * object.cc (need_decompressed_section): Don't skip the ".zdebug" |
| prefix here. |
| (build_compressed_section_map): Check SHF_COMPRESSED for |
| uncompressed size. Store sh_flags in Compressed_section_info. |
| Pass size, big_endian and sh_flags to decompress_input_section. |
| Skip the ".debug"/".zdebug" prefix when passing section name to |
| need_decompressed_section. |
| (Sized_relobj_file<size, big_endian>::do_find_special_section): |
| Don't check ".zdebug_*" sections. |
| (Object::decompressed_section_contents): Pass ELF class, big |
| endian and sh_flags to decompress_input_section. |
| * reloc.cc (Sized_relobj_file<size, big_endian>::write_sections): |
| Likewise. |
| * output.cc (Output_section::Output_section): Clear the |
| SHF_COMPRESSED bit. |
| * testsuite/Makefile.am (check_DATA): Add |
| debug_msg_cdebug_gabi.err and gdb_index_test_2_gabi.stdout. |
| (MOSTLYCLEANFILES): Add debug_msg_cdebug_gabi.err and |
| gdb_index_test_2_gabi.stdout. |
| (debug_msg_cdebug_gabi.o): New. |
| (odr_violation1_cdebug_gabi.o): Likewise. |
| (odr_violation2_cdebug_gabi.o): Likewise. |
| (debug_msg_cdebug_gabi.err): Likewise. |
| (check_SCRIPTS): Add gdb_index_test_2_gabi.sh. |
| (gdb_index_test_cdebug_gabi.o): Likewise. |
| (gdb_index_test_2_gabi): Likewise. |
| (gdb_index_test_2_gabi.stdout): Likewise. |
| * testsuite/gdb_index_test_2_gabi.sh: New file. |
| * testsuite/Makefile.in: Regenerated. |
| --- |
| gold/compressed_output.cc | 49 ++++++++++++++++++++++++++++++- |
| gold/compressed_output.h | 2 +- |
| gold/dynobj.h | 10 +++++++ |
| gold/object.cc | 51 ++++++++++++++++++++++----------- |
| gold/object.h | 7 +++++ |
| gold/output.cc | 4 ++- |
| gold/plugin.h | 10 +++++++ |
| gold/reloc.cc | 4 ++- |
| gold/testsuite/Makefile.am | 25 ++++++++++++++++ |
| gold/testsuite/Makefile.in | 28 ++++++++++++++++++ |
| gold/testsuite/gdb_index_test_2_gabi.sh | 26 +++++++++++++++++ |
| 11 files changed, 196 insertions(+), 20 deletions(-) |
| create mode 100755 gold/testsuite/gdb_index_test_2_gabi.sh |
| |
| diff --git a/gold/compressed_output.cc b/gold/compressed_output.cc |
| index 8c9fc1e..02d7821 100644 |
| --- a/gold/compressed_output.cc |
| +++ b/gold/compressed_output.cc |
| @@ -143,8 +143,55 @@ bool |
| decompress_input_section(const unsigned char* compressed_data, |
| unsigned long compressed_size, |
| unsigned char* uncompressed_data, |
| - unsigned long uncompressed_size) |
| + unsigned long uncompressed_size, |
| + int size, |
| + bool big_endian, |
| + elfcpp::Elf_Xword sh_flags) |
| { |
| + if ((sh_flags & elfcpp::SHF_COMPRESSED) != 0) |
| + { |
| + unsigned int compression_header_size; |
| + if (size == 32) |
| + { |
| + compression_header_size = elfcpp::Elf_sizes<32>::chdr_size; |
| + if (big_endian) |
| + { |
| + elfcpp::Chdr<32, true> chdr(compressed_data); |
| + if (chdr.get_ch_type() != elfcpp::ELFCOMPRESS_ZLIB) |
| + return false; |
| + } |
| + else |
| + { |
| + elfcpp::Chdr<32, false> chdr(compressed_data); |
| + if (chdr.get_ch_type() != elfcpp::ELFCOMPRESS_ZLIB) |
| + return false; |
| + } |
| + } |
| + else if (size == 64) |
| + { |
| + compression_header_size = elfcpp::Elf_sizes<64>::chdr_size; |
| + if (big_endian) |
| + { |
| + elfcpp::Chdr<64, true> chdr(compressed_data); |
| + if (chdr.get_ch_type() != elfcpp::ELFCOMPRESS_ZLIB) |
| + return false; |
| + } |
| + else |
| + { |
| + elfcpp::Chdr<64, false> chdr(compressed_data); |
| + if (chdr.get_ch_type() != elfcpp::ELFCOMPRESS_ZLIB) |
| + return false; |
| + } |
| + } |
| + else |
| + gold_unreachable(); |
| + |
| + return zlib_decompress(compressed_data + compression_header_size, |
| + compressed_size - compression_header_size, |
| + uncompressed_data, |
| + uncompressed_size); |
| + } |
| + |
| const unsigned int zlib_header_size = 12; |
| |
| /* Verify the compression header. Currently, we support only zlib |
| diff --git a/gold/compressed_output.h b/gold/compressed_output.h |
| index b5fdbeb..616c80a 100644 |
| --- a/gold/compressed_output.h |
| +++ b/gold/compressed_output.h |
| @@ -47,7 +47,7 @@ get_uncompressed_size(const unsigned char*, section_size_type); |
| |
| extern bool |
| decompress_input_section(const unsigned char*, unsigned long, unsigned char*, |
| - unsigned long); |
| + unsigned long, int, bool, elfcpp::Elf_Xword); |
| |
| // This is used for a section whose data should be compressed. It is |
| // a regular Output_section which computes its contents into a buffer |
| diff --git a/gold/dynobj.h b/gold/dynobj.h |
| index b7c60f8..c08c1de 100644 |
| --- a/gold/dynobj.h |
| +++ b/gold/dynobj.h |
| @@ -72,6 +72,16 @@ class Dynobj : public Object |
| this->unknown_needed_ = set ? UNKNOWN_NEEDED_TRUE : UNKNOWN_NEEDED_FALSE; |
| } |
| |
| + // Return the word size of the object file. |
| + int |
| + elfsize() const |
| + { gold_unreachable(); } |
| + |
| + // Return TRUE if this is a big-endian object file. |
| + bool |
| + is_big_endian() const |
| + { gold_unreachable(); } |
| + |
| // Compute the ELF hash code for a string. |
| static uint32_t |
| elf_hash(const char*); |
| diff --git a/gold/object.cc b/gold/object.cc |
| index 4e94f7e..316f8d4 100644 |
| --- a/gold/object.cc |
| +++ b/gold/object.cc |
| @@ -663,14 +663,12 @@ Sized_relobj_file<size, big_endian>::find_eh_frame( |
| |
| // Return TRUE if this is a section whose contents will be needed in the |
| // Add_symbols task. This function is only called for sections that have |
| -// already passed the test in is_compressed_debug_section(), so we know |
| -// that the section name begins with ".zdebug". |
| +// already passed the test in is_compressed_debug_section() and the debug |
| +// section name prefix, ".debug"/".zdebug", has been skipped. |
| |
| static bool |
| need_decompressed_section(const char* name) |
| { |
| - // Skip over the ".zdebug" and a quick check for the "_". |
| - name += 7; |
| if (*name++ != '_') |
| return false; |
| |
| @@ -741,14 +739,33 @@ build_compressed_section_map( |
| } |
| |
| const char* name = names + shdr.get_sh_name(); |
| - if (is_compressed_debug_section(name)) |
| + bool is_compressed = ((shdr.get_sh_flags() |
| + & elfcpp::SHF_COMPRESSED) != 0); |
| + bool is_zcompressed = (!is_compressed |
| + && is_compressed_debug_section(name)); |
| + |
| + if (is_zcompressed || is_compressed) |
| { |
| section_size_type len; |
| const unsigned char* contents = |
| obj->section_contents(i, &len, false); |
| - uint64_t uncompressed_size = get_uncompressed_size(contents, len); |
| + uint64_t uncompressed_size; |
| + if (is_zcompressed) |
| + { |
| + // Skip over the ".zdebug" prefix. |
| + name += 7; |
| + uncompressed_size = get_uncompressed_size(contents, len); |
| + } |
| + else |
| + { |
| + // Skip over the ".debug" prefix. |
| + name += 6; |
| + elfcpp::Chdr<size, big_endian> chdr(contents); |
| + uncompressed_size = chdr.get_ch_size(); |
| + } |
| Compressed_section_info info; |
| info.size = convert_to_section_size_type(uncompressed_size); |
| + info.flag = shdr.get_sh_flags(); |
| info.contents = NULL; |
| if (uncompressed_size != -1ULL) |
| { |
| @@ -758,7 +775,9 @@ build_compressed_section_map( |
| uncompressed_data = new unsigned char[uncompressed_size]; |
| if (decompress_input_section(contents, len, |
| uncompressed_data, |
| - uncompressed_size)) |
| + uncompressed_size, |
| + size, big_endian, |
| + shdr.get_sh_flags())) |
| info.contents = uncompressed_data; |
| else |
| delete[] uncompressed_data; |
| @@ -786,14 +805,11 @@ Sized_relobj_file<size, big_endian>::do_find_special_sections( |
| if (this->find_eh_frame(pshdrs, names, sd->section_names_size)) |
| this->has_eh_frame_ = true; |
| |
| - if (memmem(names, sd->section_names_size, ".zdebug_", 8) != NULL) |
| - { |
| - Compressed_section_map* compressed_sections = |
| - build_compressed_section_map<size, big_endian>( |
| - pshdrs, this->shnum(), names, sd->section_names_size, this, true); |
| - if (compressed_sections != NULL) |
| - this->set_compressed_sections(compressed_sections); |
| - } |
| + Compressed_section_map* compressed_sections = |
| + build_compressed_section_map<size, big_endian>( |
| + pshdrs, this->shnum(), names, sd->section_names_size, this, true); |
| + if (compressed_sections != NULL) |
| + this->set_compressed_sections(compressed_sections); |
| |
| return (this->has_eh_frame_ |
| || (!parameters->options().relocatable() |
| @@ -2899,7 +2915,10 @@ Object::decompressed_section_contents( |
| if (!decompress_input_section(buffer, |
| buffer_size, |
| uncompressed_data, |
| - uncompressed_size)) |
| + uncompressed_size, |
| + elfsize(), |
| + is_big_endian(), |
| + p->second.flag)) |
| this->error(_("could not decompress section %s"), |
| this->do_section_name(shndx).c_str()); |
| |
| diff --git a/gold/object.h b/gold/object.h |
| index a3d5d0e..e8f74ac 100644 |
| --- a/gold/object.h |
| +++ b/gold/object.h |
| @@ -320,6 +320,7 @@ class Got_offset_list |
| struct Compressed_section_info |
| { |
| section_size_type size; |
| + elfcpp::Elf_Xword flag; |
| const unsigned char* contents; |
| }; |
| typedef std::map<unsigned int, Compressed_section_info> Compressed_section_map; |
| @@ -380,6 +381,12 @@ class Object |
| is_dynamic() const |
| { return this->is_dynamic_; } |
| |
| + // Return the word size of the object file. |
| + virtual int elfsize() const = 0; |
| + |
| + // Return TRUE if this is a big-endian object file. |
| + virtual bool is_big_endian() const = 0; |
| + |
| // Return whether this object is needed--true if it is a dynamic |
| // object which defines some symbol referenced by a regular object. |
| // We keep the flag here rather than in Dynobj for convenience when |
| diff --git a/gold/output.cc b/gold/output.cc |
| index 5cc3629..5d8b8b5 100644 |
| --- a/gold/output.cc |
| +++ b/gold/output.cc |
| @@ -2265,7 +2265,9 @@ Output_section::Output_section(const char* name, elfcpp::Elf_Word type, |
| info_symndx_(NULL), |
| info_(0), |
| type_(type), |
| - flags_(flags), |
| + // Clear the elfcpp::SHF_COMPRESSED bit. It will be set by |
| + // --compress-debug-sections=zlib-gabi. |
| + flags_(flags & ~elfcpp::SHF_COMPRESSED), |
| order_(ORDER_INVALID), |
| out_shndx_(-1U), |
| symtab_index_(0), |
| diff --git a/gold/plugin.h b/gold/plugin.h |
| index f926879..3e094d7 100644 |
| --- a/gold/plugin.h |
| +++ b/gold/plugin.h |
| @@ -433,6 +433,16 @@ class Pluginobj : public Object |
| filesize() |
| { return this->filesize_; } |
| |
| + // Return the word size of the object file. |
| + int |
| + elfsize() const |
| + { gold_unreachable(); } |
| + |
| + // Return TRUE if this is a big-endian object file. |
| + bool |
| + is_big_endian() const |
| + { gold_unreachable(); } |
| + |
| protected: |
| // Return TRUE if this is an object claimed by a plugin. |
| virtual Pluginobj* |
| diff --git a/gold/reloc.cc b/gold/reloc.cc |
| index 3c9f7a9..b0f9b1c 100644 |
| --- a/gold/reloc.cc |
| +++ b/gold/reloc.cc |
| @@ -866,7 +866,9 @@ Sized_relobj_file<size, big_endian>::write_sections(const Layout* layout, |
| // Read and decompress the section. |
| section_size_type len; |
| const unsigned char* p = this->section_contents(i, &len, false); |
| - if (!decompress_input_section(p, len, view, view_size)) |
| + if (!decompress_input_section(p, len, view, view_size, |
| + size, big_endian, |
| + shdr.get_sh_flags())) |
| this->error(_("could not decompress section %s"), |
| this->section_name(i).c_str()); |
| } |
| diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am |
| index 7669f27..9c28c9a 100644 |
| --- a/gold/testsuite/Makefile.am |
| +++ b/gold/testsuite/Makefile.am |
| @@ -1239,6 +1239,22 @@ debug_msg_cdebug.err: debug_msg_cdebug.o odr_violation1_cdebug.o odr_violation2_ |
| rm -f $@; \ |
| exit 1; \ |
| fi |
| +check_DATA += debug_msg_cdebug_gabi.err |
| +MOSTLYCLEANFILES += debug_msg_cdebug_gabi.err |
| +debug_msg_cdebug_gabi.o: debug_msg.cc gcctestdir/as |
| + $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -Wa,--compress-debug-sections=zlib-gabi -c -w -o $@ $(srcdir)/debug_msg.cc |
| +odr_violation1_cdebug_gabi.o: odr_violation1.cc gcctestdir/as |
| + $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -Wa,--compress-debug-sections=zlib-gabi -c -w -o $@ $(srcdir)/odr_violation1.cc |
| +odr_violation2_cdebug_gabi.o: odr_violation2.cc gcctestdir/as |
| + $(CXXCOMPILE) -Bgcctestdir/ -O2 -g -Wa,--compress-debug-sections=zlib-gabi -c -w -o $@ $(srcdir)/odr_violation2.cc |
| +debug_msg_cdebug_gabi.err: debug_msg_cdebug_gabi.o odr_violation1_cdebug_gabi.o odr_violation2_cdebug_gabi.o gcctestdir/ld |
| + @echo $(CXXLINK) -Bgcctestdir/ -Wl,--detect-odr-violations -o debug_msg_cdebug debug_msg_cdebug_gabi.o odr_violation1_cdebug_gabi.o odr_violation2_cdebug_gabi.o "2>$@" |
| + @if $(CXXLINK) -Bgcctestdir/ -Wl,--detect-odr-violations -o debug_msg_cdebug_gabi debug_msg_cdebug_gabi.o odr_violation1_cdebug_gabi.o odr_violation2_cdebug_gabi.o 2>$@; \ |
| + then \ |
| + echo 1>&2 "Link of debug_msg_cdebug_gabi should have failed"; \ |
| + rm -f $@; \ |
| + exit 1; \ |
| + fi |
| |
| # See if we can also detect problems when we're linking .so's, not .o's. |
| check_DATA += debug_msg_so.err |
| @@ -2400,6 +2416,15 @@ gdb_index_test_2: gdb_index_test_cdebug.o gcctestdir/ld |
| $(CXXLINK) -Bgcctestdir/ -Wl,--gdb-index $< |
| gdb_index_test_2.stdout: gdb_index_test_2 |
| $(TEST_READELF) --debug-dump=gdb_index $< > $@ |
| +check_SCRIPTS += gdb_index_test_2_gabi.sh |
| +check_DATA += gdb_index_test_2_gabi.stdout |
| +MOSTLYCLEANFILES += gdb_index_test_2.stdout gdb_index_test_2 |
| +gdb_index_test_cdebug_gabi.o: gdb_index_test.cc |
| + $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -Wa,--compress-debug-sections=zlib-gabi -c -o $@ $< |
| +gdb_index_test_2_gabi: gdb_index_test_cdebug_gabi.o gcctestdir/ld |
| + $(CXXLINK) -Bgcctestdir/ -Wl,--gdb-index $< |
| +gdb_index_test_2_gabi.stdout: gdb_index_test_2_gabi |
| + $(TEST_READELF) --debug-dump=gdb_index $< > $@ |
| |
| # Another simple C test (DW_AT_high_pc encoding) for --gdb-index. |
| check_SCRIPTS += gdb_index_test_3.sh |
| diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in |
| index 3f8818d..1131512 100644 |
| --- a/gold/testsuite/Makefile.in |
| +++ b/gold/testsuite/Makefile.in |
| @@ -274,6 +274,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ missing_key_func.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_cdebug.err \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_cdebug_gabi.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_so.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_ndebug.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ undef_symbol.err \ |
| @@ -347,6 +348,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_36 = debug_msg.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ missing_key_func.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_cdebug.err \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_cdebug_gabi.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_so.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_ndebug.err \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ undef_symbol.err \ |
| @@ -599,16 +601,20 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ |
| # Test that --gdb-index functions correctly with gcc-generated pubnames. |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@am__append_65 = gdb_index_test_1.sh \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2.sh \ |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2_gabi.sh \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_3.sh \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_4.sh |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@am__append_66 = gdb_index_test_1.stdout \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2.stdout \ |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2_gabi.stdout \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_3.stdout \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_4.stdout |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@am__append_67 = gdb_index_test_1.stdout \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_1 \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2.stdout \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2 \ |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2.stdout \ |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_2 \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_3.stdout \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_3 \ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ gdb_index_test_4.stdout \ |
| @@ -4412,6 +4418,8 @@ gdb_index_test_1.sh.log: gdb_index_test_1.sh |
| @p='gdb_index_test_1.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) |
| gdb_index_test_2.sh.log: gdb_index_test_2.sh |
| @p='gdb_index_test_2.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) |
| +gdb_index_test_2_gabi.sh.log: gdb_index_test_2_gabi.sh |
| + @p='gdb_index_test_2_gabi.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) |
| gdb_index_test_3.sh.log: gdb_index_test_3.sh |
| @p='gdb_index_test_3.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) |
| gdb_index_test_4.sh.log: gdb_index_test_4.sh |
| @@ -5456,6 +5464,20 @@ uninstall-am: |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f $@; \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ exit 1; \ |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ fi |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@debug_msg_cdebug_gabi.o: debug_msg.cc gcctestdir/as |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -Wa,--compress-debug-sections=zlib-gabi -c -w -o $@ $(srcdir)/debug_msg.cc |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@odr_violation1_cdebug_gabi.o: odr_violation1.cc gcctestdir/as |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -Wa,--compress-debug-sections=zlib-gabi -c -w -o $@ $(srcdir)/odr_violation1.cc |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@odr_violation2_cdebug_gabi.o: odr_violation2.cc gcctestdir/as |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -Bgcctestdir/ -O2 -g -Wa,--compress-debug-sections=zlib-gabi -c -w -o $@ $(srcdir)/odr_violation2.cc |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@debug_msg_cdebug_gabi.err: debug_msg_cdebug_gabi.o odr_violation1_cdebug_gabi.o odr_violation2_cdebug_gabi.o gcctestdir/ld |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ @echo $(CXXLINK) -Bgcctestdir/ -Wl,--detect-odr-violations -o debug_msg_cdebug debug_msg_cdebug_gabi.o odr_violation1_cdebug_gabi.o odr_violation2_cdebug_gabi.o "2>$@" |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ @if $(CXXLINK) -Bgcctestdir/ -Wl,--detect-odr-violations -o debug_msg_cdebug_gabi debug_msg_cdebug_gabi.o odr_violation1_cdebug_gabi.o odr_violation2_cdebug_gabi.o 2>$@; \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ then \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo 1>&2 "Link of debug_msg_cdebug_gabi should have failed"; \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f $@; \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ exit 1; \ |
| +@GCC_TRUE@@NATIVE_LINKER_TRUE@ fi |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@debug_msg.so: debug_msg.cc gcctestdir/ld |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -shared -fPIC -w -o $@ $(srcdir)/debug_msg.cc |
| @GCC_TRUE@@NATIVE_LINKER_TRUE@odr_violation1.so: odr_violation1.cc gcctestdir/ld |
| @@ -6043,6 +6065,12 @@ uninstall-am: |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--gdb-index $< |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@gdb_index_test_2.stdout: gdb_index_test_2 |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_READELF) --debug-dump=gdb_index $< > $@ |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@gdb_index_test_cdebug_gabi.o: gdb_index_test.cc |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -Bgcctestdir/ -O0 -g -Wa,--compress-debug-sections=zlib-gabi -c -o $@ $< |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@gdb_index_test_2_gabi: gdb_index_test_cdebug_gabi.o gcctestdir/ld |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--gdb-index $< |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@gdb_index_test_2_gabi.stdout: gdb_index_test_2_gabi |
| +@GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_READELF) --debug-dump=gdb_index $< > $@ |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@gdb_index_test_3.o: gdb_index_test_3.c |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -O0 -g -c -o $@ $< |
| @GCC_TRUE@@HAVE_PUBNAMES_TRUE@@NATIVE_LINKER_TRUE@gdb_index_test_3: gdb_index_test_3.o gcctestdir/ld |
| diff --git a/gold/testsuite/gdb_index_test_2_gabi.sh b/gold/testsuite/gdb_index_test_2_gabi.sh |
| new file mode 100755 |
| index 0000000..def9bea |
| --- /dev/null |
| +++ b/gold/testsuite/gdb_index_test_2_gabi.sh |
| @@ -0,0 +1,26 @@ |
| +#!/bin/sh |
| + |
| +# gdb_index_test_2gabi.sh -- a test case for the --gdb-index option. |
| + |
| +# Copyright (C) 2015 Free Software Foundation, Inc. |
| +# Written by Cary Coutant <ccoutant@google.com>. |
| +# Modified by H.J. Lu <hongjiu.lu@intel.com> |
| + |
| +# This file is part of gold. |
| + |
| +# This program 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 of the License, or |
| +# (at your option) any later version. |
| + |
| +# This program 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 this program; if not, write to the Free Software |
| +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| +# MA 02110-1301, USA. |
| + |
| +exec ${srcdir}/gdb_index_test_comm.sh gdb_index_test_2_gabi.stdout |
| -- |
| 2.1.0 |
| |