Add SHF_COMPRESSED section decompression to gold
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 12 Jul 2015 17:50:25 +0000 (10:50 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 12 Jul 2015 17:50:40 +0000 (10:50 -0700)
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<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.
* 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.

12 files changed:
gold/ChangeLog
gold/compressed_output.cc
gold/compressed_output.h
gold/dynobj.h
gold/layout.cc
gold/object.cc
gold/object.h
gold/plugin.h
gold/reloc.cc
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/gdb_index_test_2_gabi.sh [new file with mode: 0755]

index c308f3f..93b363a 100644 (file)
@@ -1,3 +1,46 @@
+2015-07-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+       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<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.
+       * 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  <shenhan@google.com>
 
        Use "gold_info" instead of "gold_warning" for erratum fix.
index 8c9fc1e..02d7821 100644 (file)
@@ -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
index b5fdbeb..616c80a 100644 (file)
@@ -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
index b7c60f8..c08c1de 100644 (file)
@@ -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*);
index 52f5551..142fd90 100644 (file)
@@ -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);
 
index 4e94f7e..316f8d4 100644 (file)
@@ -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());
 
index a3d5d0e..e8f74ac 100644 (file)
@@ -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
index f926879..3e094d7 100644 (file)
@@ -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*
index 3c9f7a9..b0f9b1c 100644 (file)
@@ -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());
         }
index 7669f27..9c28c9a 100644 (file)
@@ -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
index 3f8818d..1131512 100644 (file)
@@ -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 (executable)
index 0000000..def9bea
--- /dev/null
@@ -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