TIC6X __c6xabi_DSBT_BASE
[deliverable/binutils-gdb.git] / gold / gc.h
index d0b16b22cdd261dc7ec792296ee15dd151f2a592..78ead4132f9a533c1963ff3e3b71db71cb713331 100644 (file)
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -1,6 +1,6 @@
 // gc.h -- garbage collection of unused sections
 
-// Copyright (C) 2009-2016 Free Software Foundation, Inc.
+// Copyright (C) 2009-2018 Free Software Foundation, Inc.
 // Written by Sriraman Tallam <tmsriram@google.com>.
 
 // This file is part of gold.
@@ -247,7 +247,12 @@ gc_process_relocs(
                (*secvec).push_back(Section_id(src_obj, dst_indx));
              else
                 (*secvec).push_back(Section_id(NULL, 0));
-              (*symvec).push_back(NULL);
+              // If the target of the relocation is an STT_SECTION symbol,
+              // make a note of that by storing -1 in the symbol vector.
+              if (lsym.get_st_type() == elfcpp::STT_SECTION)
+               (*symvec).push_back(reinterpret_cast<Symbol*>(-1));
+             else
+               (*symvec).push_back(NULL);
              (*addendvec).push_back(std::make_pair(
                                        static_cast<long long>(symvalue),
                                        static_cast<long long>(addend)));
@@ -263,7 +268,7 @@ gc_process_relocs(
          if (is_ordinary
              && check_section_for_function_pointers
               && lsym.get_st_type() != elfcpp::STT_OBJECT
-             && scan.local_reloc_may_be_function_pointer(symtab, NULL, NULL,
+             && scan.local_reloc_may_be_function_pointer(symtab, NULL, target,
                                                          src_obj, src_indx,
                                                          NULL, reloc, r_type,
                                                          lsym))
@@ -295,11 +300,12 @@ gc_process_relocs(
          // When doing safe folding, check to see if this relocation is that
          // of a function pointer being taken.
          if (gsym->source() == Symbol::FROM_OBJECT
+              && gsym->type() == elfcpp::STT_FUNC
               && check_section_for_function_pointers
               && dst_obj != NULL
               && (!is_ordinary
                   || scan.global_reloc_may_be_function_pointer(
-                       symtab, NULL, NULL, src_obj, src_indx, NULL, reloc,
+                       symtab, NULL, target, src_obj, src_indx, NULL, reloc,
                        r_type, gsym)))
             symtab->icf()->set_section_has_function_pointers(dst_obj, dst_indx);
 
This page took 0.025617 seconds and 4 git commands to generate.