From aac1d94f19492fb6bea7193497bce599952c429d Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 13 Oct 2020 05:10:24 -0700 Subject: Gold: Enable safe ICF for shared object on x86-64 With commit 4aebb6312eb5dcd12f2f8420028547584b708907 Author: Rahul Chaudhry 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. --- gold/ChangeLog | 12 ++++++++++++ gold/testsuite/icf_safe_so_test.cc | 8 ++++++++ gold/testsuite/icf_safe_so_test.sh | 2 +- gold/x86_64.cc | 18 ++---------------- 4 files changed, 23 insertions(+), 17 deletions(-) (limited to 'gold') diff --git a/gold/ChangeLog b/gold/ChangeLog index 0300722..5defad4 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,17 @@ 2020-10-13 H.J. Lu + 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. + +2020-10-13 H.J. Lu + * icf.cc (Icf::find_identical_sections): Skip zero-sized sections. 2020-10-09 Alan Modra diff --git a/gold/testsuite/icf_safe_so_test.cc b/gold/testsuite/icf_safe_so_test.cc index 1c59303..3256655 100644 --- a/gold/testsuite/icf_safe_so_test.cc +++ b/gold/testsuite/icf_safe_so_test.cc @@ -61,10 +61,18 @@ int bar_glob() return 2; } +static int +bar_static() +{ + return 2; +} + int main() { int (*p)() = foo_glob; (void)p; + p = bar_static; + (void)p; foo_static(); foo_prot(); foo_hidden(); diff --git a/gold/testsuite/icf_safe_so_test.sh b/gold/testsuite/icf_safe_so_test.sh index 10f8782..4c253c5 100755 --- a/gold/testsuite/icf_safe_so_test.sh +++ b/gold/testsuite/icf_safe_so_test.sh @@ -83,7 +83,7 @@ END { arch_specific_safe_fold() { - if grep -q -e "Intel 80386" -e "ARM" -e "PowerPC" $1; + if grep -q -e "Advanced Micro Devices X86-64" -e "Intel 80386" -e "ARM" -e "PowerPC" $1; then shift shift 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::Scan::local_reloc_may_be_function_pointer( unsigned int r_type, const elfcpp::Sym&) { - // 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::Scan::global_reloc_may_be_function_pointer( Output_section* , const elfcpp::Rela& 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); } -- cgit v1.1