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.
+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.
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
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
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*);
// copied to the output section.
input_section_flags &= ~ (elfcpp::SHF_INFO_LINK
| elfcpp::SHF_GROUP
+ | elfcpp::SHF_COMPRESSED
| elfcpp::SHF_MERGE
| elfcpp::SHF_STRINGS);
// 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;
}
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)
{
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;
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()
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());
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;
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
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*
// 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());
}
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
$(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
@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 \
@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 \
# 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 \
@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
@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
@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
--- /dev/null
+#!/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