From: Ian Lance Taylor Date: Wed, 4 Mar 2009 06:46:27 +0000 (+0000) Subject: PR 9918 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=031cdbed18938f96e4607b717e864928bbb4643e;p=binutils-gdb.git PR 9918 * target-reloc.h (relocate_section): Pass output_section to relocate. * i386.cc (Target_i386::should_apply_static_reloc): Add output_section parameter. Change all callers. (Target_i386::Relocate::relocate): Add output_section parameter. * x86_64.cc (Target_x86_64::Relocate::relocate): Likewise. * sparc.cc (Target_sparc::Relocate::relocate): Likewise. * powerpc.cc (Target_powerpc::Relocate::relocate): Likewise. * testsuite/two_file_shared.sh: New script. * testsuite/Makefile.am (check_SCRIPTS): Add two_file_shared.sh. (check_DATA): Add two_file_shared.dbg. (two_file_shared.dbg): New target. * testsuite/Makefile.in: Rebuild. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index e351dbaa744..1a7705f8e69 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,20 @@ +2009-03-03 Ian Lance Taylor + + PR 9918 + * target-reloc.h (relocate_section): Pass output_section to + relocate. + * i386.cc (Target_i386::should_apply_static_reloc): Add + output_section parameter. Change all callers. + (Target_i386::Relocate::relocate): Add output_section parameter. + * x86_64.cc (Target_x86_64::Relocate::relocate): Likewise. + * sparc.cc (Target_sparc::Relocate::relocate): Likewise. + * powerpc.cc (Target_powerpc::Relocate::relocate): Likewise. + * testsuite/two_file_shared.sh: New script. + * testsuite/Makefile.am (check_SCRIPTS): Add two_file_shared.sh. + (check_DATA): Add two_file_shared.dbg. + (two_file_shared.dbg): New target. + * testsuite/Makefile.in: Rebuild. + 2009-03-01 Ian Lance Taylor * configure.ac: Check for byteswap.h. diff --git a/gold/i386.cc b/gold/i386.cc index e033d34382a..3beacaa28ca 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -214,13 +214,14 @@ class Target_i386 : public Sized_target<32, false> inline bool should_apply_static_reloc(const Sized_symbol<32>* gsym, int ref_flags, - bool is_32bit); + bool is_32bit, + Output_section* output_section); // Do a relocation. Return false if the caller should not issue // any warnings about this relocation. inline bool - relocate(const Relocate_info<32, false>*, Target_i386*, size_t relnum, - const elfcpp::Rel<32, false>&, + relocate(const Relocate_info<32, false>*, Target_i386*, Output_section*, + size_t relnum, const elfcpp::Rel<32, false>&, unsigned int r_type, const Sized_symbol<32>*, const Symbol_value<32>*, unsigned char*, elfcpp::Elf_types<32>::Elf_Addr, @@ -1595,8 +1596,15 @@ Target_i386::do_finalize_sections(Layout* layout) inline bool Target_i386::Relocate::should_apply_static_reloc(const Sized_symbol<32>* gsym, int ref_flags, - bool is_32bit) + bool is_32bit, + Output_section* output_section) { + // If the output section is not allocated, then we didn't call + // scan_relocs, we didn't create a dynamic reloc, and we must apply + // the reloc here. + if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0) + return true; + // For local symbols, we will have created a non-RELATIVE dynamic // relocation only if (a) the output is position independent, // (b) the relocation is absolute (not pc- or segment-relative), and @@ -1622,6 +1630,7 @@ Target_i386::Relocate::should_apply_static_reloc(const Sized_symbol<32>* gsym, inline bool Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, Target_i386* target, + Output_section *output_section, size_t relnum, const elfcpp::Rel<32, false>& rel, unsigned int r_type, @@ -1697,7 +1706,8 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, break; case elfcpp::R_386_32: - if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true)) + if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true, + output_section)) Relocate_functions<32, false>::rel32(view, object, psymval); break; @@ -1706,13 +1716,14 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, int ref_flags = Symbol::NON_PIC_REF; if (gsym != NULL && gsym->type() == elfcpp::STT_FUNC) ref_flags |= Symbol::FUNCTION_CALL; - if (should_apply_static_reloc(gsym, ref_flags, true)) + if (should_apply_static_reloc(gsym, ref_flags, true, output_section)) Relocate_functions<32, false>::pcrel32(view, object, psymval, address); } break; case elfcpp::R_386_16: - if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false)) + if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false, + output_section)) Relocate_functions<32, false>::rel16(view, object, psymval); break; @@ -1721,13 +1732,14 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, int ref_flags = Symbol::NON_PIC_REF; if (gsym != NULL && gsym->type() == elfcpp::STT_FUNC) ref_flags |= Symbol::FUNCTION_CALL; - if (should_apply_static_reloc(gsym, ref_flags, false)) + if (should_apply_static_reloc(gsym, ref_flags, false, output_section)) Relocate_functions<32, false>::pcrel16(view, object, psymval, address); } break; case elfcpp::R_386_8: - if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false)) + if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false, + output_section)) Relocate_functions<32, false>::rel8(view, object, psymval); break; @@ -1736,7 +1748,8 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, int ref_flags = Symbol::NON_PIC_REF; if (gsym != NULL && gsym->type() == elfcpp::STT_FUNC) ref_flags |= Symbol::FUNCTION_CALL; - if (should_apply_static_reloc(gsym, ref_flags, false)) + if (should_apply_static_reloc(gsym, ref_flags, false, + output_section)) Relocate_functions<32, false>::pcrel8(view, object, psymval, address); } break; diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 8eac78366ed..3e8cd75ff21 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -214,7 +214,8 @@ class Target_powerpc : public Sized_target // any warnings about this relocation. inline bool relocate(const Relocate_info*, Target_powerpc*, - size_t relnum, const elfcpp::Rela&, + Output_section*, size_t relnum, + const elfcpp::Rela&, unsigned int r_type, const Sized_symbol*, const Symbol_value*, unsigned char*, @@ -1578,6 +1579,7 @@ inline bool Target_powerpc::Relocate::relocate( const Relocate_info* relinfo, Target_powerpc* target, + Output_section*, size_t relnum, const elfcpp::Rela& rela, unsigned int r_type, diff --git a/gold/reloc.cc b/gold/reloc.cc index 669d87be8d9..b6394a56ec9 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -279,7 +279,9 @@ Sized_relobj::do_read_relocs(Read_relocs_data* rd) // PLT sections. Relocations for sections which are not // allocated (typically debugging sections) should not add new // GOT and PLT entries. So we skip them unless this is a - // relocatable link or we need to emit relocations. + // relocatable link or we need to emit relocations. FIXME: What + // should we do if a linker script maps a section with SHF_ALLOC + // clear to a section with SHF_ALLOC set? typename This::Shdr secshdr(pshdrs + shndx * This::shdr_size); bool is_section_allocated = ((secshdr.get_sh_flags() & elfcpp::SHF_ALLOC) != 0); diff --git a/gold/sparc.cc b/gold/sparc.cc index 476aa3286d6..794cab924db 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -232,7 +232,8 @@ class Target_sparc : public Sized_target // any warnings about this relocation. inline bool relocate(const Relocate_info*, Target_sparc*, - size_t relnum, const elfcpp::Rela&, + Output_section*, size_t relnum, + const elfcpp::Rela&, unsigned int r_type, const Sized_symbol*, const Symbol_value*, unsigned char*, @@ -2356,6 +2357,7 @@ inline bool Target_sparc::Relocate::relocate( const Relocate_info* relinfo, Target_sparc* target, + Output_section*, size_t relnum, const elfcpp::Rela& rela, unsigned int r_type, diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 3e788e1bc9c..4fcbfa33e9e 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -268,8 +268,9 @@ relocate_section( psymval = &symval; } - if (!relocate.relocate(relinfo, target, i, reloc, r_type, sym, psymval, - view + offset, view_address + offset, view_size)) + if (!relocate.relocate(relinfo, target, output_section, i, reloc, + r_type, sym, psymval, view + offset, + view_address + offset, view_size)) continue; if (offset < 0 || static_cast(offset) >= view_size) diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 1ba7c9dd393..9ea4f9542da 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -226,6 +226,11 @@ two_file_relocatable_test_LDADD = two_file_relocatable.o two_file_relocatable.o: gcctestdir/ld two_file_test_1.o two_file_test_1b.o two_file_test_2.o gcctestdir/ld -r -o $@ two_file_test_1.o two_file_test_1b.o two_file_test_2.o +check_SCRIPTS += two_file_shared.sh +check_DATA += two_file_shared.dbg +two_file_shared.dbg: two_file_shared.so + $(TEST_READELF) -w $< >$@ 2>/dev/null + # The nonpic tests will fail on platforms which can not put non-PIC # code into shared libraries, so we just don't run them in that case. if FN_PTRS_IN_SO_WITHOUT_PIC diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 9f0cfcbbfb0..031de7e8ee5 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -102,16 +102,53 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) \ @NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) +# Test --detect-odr-violations + +# Similar to --detect-odr-violations: check for undefined symbols in .so's + +# Test --dynamic-list, --dynamic-list-data, --dynamic-list-cpp-new, +# and --dynamic-list-cpp-typeinfo +@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_2 = two_file_shared.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_plt.sh debug_msg.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ undef_symbol.sh ver_test_1.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_2.sh ver_test_4.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_5.sh ver_test_7.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_10.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_matching_test.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_3.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_4.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_5.sh dynamic_list.sh + +# Create the data files that debug_msg.sh analyzes. + +# See if we can also detect problems when we're linking .so's, not .o's. + +# We also want to make sure we do something reasonable when there's no +# debug info available. For the best test, we use .so's. +@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_3 = two_file_shared.dbg \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_plt_shared.so debug_msg.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 ver_test_1.syms \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_2.syms ver_test_4.syms \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_5.syms ver_test_7.syms \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_10.syms \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_matching_test.stdout \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_3.stdout \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_4.stdout \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_5.stdout \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ dynamic_list.stdout + # The nonpic tests will fail on platforms which can not put non-PIC # code into shared libraries, so we just don't run them in that case. -@FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_2 = two_file_shared_1_nonpic_test \ +@FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_4 = two_file_shared_1_nonpic_test \ @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_shared_2_nonpic_test \ @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_same_shared_nonpic_test \ @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_separate_shared_12_nonpic_test \ @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_separate_shared_21_nonpic_test \ @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_mixed_shared_test \ @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_mixed_2_shared_test -@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_3 = two_file_strip_test \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_5 = two_file_strip_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_same_shared_strip_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ common_test_1 exception_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ exception_static_test \ @@ -155,44 +192,9 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) \ @NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) \ @NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) -@FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_4 = weak_undef_nonpic_test -@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_5 = weak_alias_test weak_plt \ +@FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_6 = weak_undef_nonpic_test +@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_7 = weak_alias_test weak_plt \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ copy_test - -# Test --detect-odr-violations - -# Similar to --detect-odr-violations: check for undefined symbols in .so's - -# Test --dynamic-list, --dynamic-list-data, --dynamic-list-cpp-new, -# and --dynamic-list-cpp-typeinfo -@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_6 = weak_plt.sh debug_msg.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ undef_symbol.sh ver_test_1.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_2.sh ver_test_4.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_5.sh ver_test_7.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_10.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_matching_test.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_3.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_4.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_5.sh dynamic_list.sh - -# Create the data files that debug_msg.sh analyzes. - -# See if we can also detect problems when we're linking .so's, not .o's. - -# We also want to make sure we do something reasonable when there's no -# debug info available. For the best test, we use .so's. -@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_7 = weak_plt_shared.so \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg.err debug_msg_so.err \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg_ndebug.err \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ undef_symbol.err ver_test_1.syms \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_2.syms ver_test_4.syms \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_5.syms ver_test_7.syms \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_10.syms \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_matching_test.stdout \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_3.stdout \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_4.stdout \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_5.stdout \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ dynamic_list.stdout @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@am__append_8 = tls_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@ tls_pic_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@ tls_shared_test \ @@ -1154,8 +1156,8 @@ MOSTLYCLEANFILES = *.so $(am__append_16) $(am__append_23) # We will add to these later, for each individual test. Note # that we add each test under check_SCRIPTS or check_PROGRAMS; # the TESTS variable is automatically populated from these. -check_SCRIPTS = $(am__append_6) $(am__append_21) -check_DATA = $(am__append_7) $(am__append_22) +check_SCRIPTS = $(am__append_2) $(am__append_21) +check_DATA = $(am__append_3) $(am__append_22) BUILT_SOURCES = $(am__append_14) TESTS = $(check_SCRIPTS) $(check_PROGRAMS) @@ -2205,6 +2207,8 @@ uninstall-am: uninstall-info-am @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared two_file_test_1_pic.o two_file_test_1b_pic.o two_file_test_2_pic.o @GCC_TRUE@@NATIVE_LINKER_TRUE@two_file_relocatable.o: gcctestdir/ld two_file_test_1.o two_file_test_1b.o two_file_test_2.o @GCC_TRUE@@NATIVE_LINKER_TRUE@ gcctestdir/ld -r -o $@ two_file_test_1.o two_file_test_1b.o two_file_test_2.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@two_file_shared.dbg: two_file_shared.so +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_READELF) -w $< >$@ 2>/dev/null @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@two_file_shared_1_nonpic.so: two_file_test_1.o gcctestdir/ld @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared two_file_test_1.o two_file_test_1b.o @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@two_file_shared_2_nonpic.so: two_file_test_2.o gcctestdir/ld diff --git a/gold/testsuite/two_file_shared.sh b/gold/testsuite/two_file_shared.sh new file mode 100755 index 00000000000..624031146be --- /dev/null +++ b/gold/testsuite/two_file_shared.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +# two_file_shared.sh -- check that debug info gets symbol addresses + +# Copyright 2009 Free Software Foundation, Inc. +# Written by Ian Lance Taylor . + +# 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. + +addrs=`grep DW_OP_addr two_file_shared.dbg | fgrep '(DW_OP_addr: 0)'` +if test -n "$addrs"; then + echo "Found variables with address zero" + echo $addrs + exit 1 +fi diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 4dfe75b1526..85d69c3b5bd 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -227,8 +227,8 @@ class Target_x86_64 : public Sized_target<64, false> // Do a relocation. Return false if the caller should not issue // any warnings about this relocation. inline bool - relocate(const Relocate_info<64, false>*, Target_x86_64*, size_t relnum, - const elfcpp::Rela<64, false>&, + relocate(const Relocate_info<64, false>*, Target_x86_64*, Output_section*, + size_t relnum, const elfcpp::Rela<64, false>&, unsigned int r_type, const Sized_symbol<64>*, const Symbol_value<64>*, unsigned char*, elfcpp::Elf_types<64>::Elf_Addr, @@ -1692,6 +1692,7 @@ Target_x86_64::do_finalize_sections(Layout* layout) inline bool Target_x86_64::Relocate::relocate(const Relocate_info<64, false>* relinfo, Target_x86_64* target, + Output_section*, size_t relnum, const elfcpp::Rela<64, false>& rela, unsigned int r_type,