diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-10-13 05:10:24 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-10-13 05:10:36 -0700 |
commit | aac1d94f19492fb6bea7193497bce599952c429d (patch) | |
tree | a228a103e97cc042b6d2ea5f5171294da08da4cb /gold/x86_64.cc | |
parent | 1fb1d64f4a7c817f91a164dc22d5a22a0e75c1b8 (diff) | |
download | binutils-aac1d94f19492fb6bea7193497bce599952c429d.zip binutils-aac1d94f19492fb6bea7193497bce599952c429d.tar.gz binutils-aac1d94f19492fb6bea7193497bce599952c429d.tar.bz2 |
Gold: Enable safe ICF for shared object on x86-64
With
commit 4aebb6312eb5dcd12f2f8420028547584b708907
Author: Rahul Chaudhry <rahulchaudhry@google.com>
Date: Wed Feb 15 00:37:10 2017 -0800
Improved support for --icf=safe when used with -pie.
we now check opcode with R_X86_64_PC32 relocation, which tell branches
from other instructions. We can enable safe ICF for shared object on
x86-64. Also, global symbols with non-default visibility should be
folded like local symbols.
PR gold/21452
* x86_64.cc (Scan::local_reloc_may_be_function_pointer): Remove
check for shared library.
(Scan::global_reloc_may_be_function_pointer): Remove check for
shared library and symbol visibility.
* testsuite/icf_safe_so_test.cc (bar_static): New function.
(main): Take function address of bar_static and use it.
* testsuite/icf_safe_so_test.sh (arch_specific_safe_fold): Also
check fold on x86-64. Check bar_static isn't folded.
Diffstat (limited to 'gold/x86_64.cc')
-rw-r--r-- | gold/x86_64.cc | 18 |
1 files changed, 2 insertions, 16 deletions
diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 1d9d920..9cb2cf0 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -3992,12 +3992,6 @@ Target_x86_64<size>::Scan::local_reloc_may_be_function_pointer( unsigned int r_type, const elfcpp::Sym<size, false>&) { - // When building a shared library, do not fold any local symbols as it is - // not possible to distinguish pointer taken versus a call by looking at - // the relocation types. - if (parameters->options().shared()) - return true; - return possible_function_pointer_reloc(src_obj, src_indx, reloc.get_r_offset(), r_type); } @@ -4017,16 +4011,8 @@ Target_x86_64<size>::Scan::global_reloc_may_be_function_pointer( Output_section* , const elfcpp::Rela<size, false>& reloc, unsigned int r_type, - Symbol* gsym) -{ - // When building a shared library, do not fold symbols whose visibility - // is hidden, internal or protected. - if (parameters->options().shared() - && (gsym->visibility() == elfcpp::STV_INTERNAL - || gsym->visibility() == elfcpp::STV_PROTECTED - || gsym->visibility() == elfcpp::STV_HIDDEN)) - return true; - + Symbol*) +{ return possible_function_pointer_reloc(src_obj, src_indx, reloc.get_r_offset(), r_type); } |