From 480586639d6b814b2e87f6f106b8635cf7442b20 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 12 Jul 2015 10:50:25 -0700 Subject: [PATCH] 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. * layout.cc (Layout::get_output_section_flags): Also clear the SHF_COMPRESSED bit. * 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::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::write_sections): Likewise. * 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/ChangeLog | 43 +++++++++++++++++++++ gold/compressed_output.cc | 49 +++++++++++++++++++++++- gold/compressed_output.h | 2 +- gold/dynobj.h | 10 +++++ gold/layout.cc | 1 + gold/object.cc | 51 +++++++++++++++++-------- gold/object.h | 7 ++++ 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 +++++++++++++ 12 files changed, 237 insertions(+), 19 deletions(-) create mode 100755 gold/testsuite/gdb_index_test_2_gabi.sh diff --git a/gold/ChangeLog b/gold/ChangeLog index c308f3f827..93b363ae60 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,46 @@ +2015-07-12 H.J. Lu + + 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. + * layout.cc (Layout::get_output_section_flags): Also clear the + SHF_COMPRESSED bit. + * 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::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::write_sections): + Likewise. + * 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. + 2015-07-09 Han Shen Use "gold_info" instead of "gold_warning" for erratum fix. diff --git a/gold/compressed_output.cc b/gold/compressed_output.cc index 8c9fc1e96f..02d78212da 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 b5fdbeb7f6..616c80ac50 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 b7c60f82e5..c08c1dedcd 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/layout.cc b/gold/layout.cc index 52f55516b9..142fd900d2 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -913,6 +913,7 @@ Layout::get_output_section_flags(elfcpp::Elf_Xword input_section_flags) // copied to the output section. input_section_flags &= ~ (elfcpp::SHF_INFO_LINK | elfcpp::SHF_GROUP + | elfcpp::SHF_COMPRESSED | elfcpp::SHF_MERGE | elfcpp::SHF_STRINGS); diff --git a/gold/object.cc b/gold/object.cc index 4e94f7efd2..316f8d40aa 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -663,14 +663,12 @@ Sized_relobj_file::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 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::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( - 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( + 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 a3d5d0e62b..e8f74ac9bc 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 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/plugin.h b/gold/plugin.h index f926879897..3e094d7591 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 3c9f7a9e6d..b0f9b1c01a 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -866,7 +866,9 @@ Sized_relobj_file::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 7669f27931..9c28c9ae15 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 3f8818dde6..1131512f52 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 0000000000..def9bea4d0 --- /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 . +# Modified by H.J. Lu + +# 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