aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-10-13 05:10:24 -0700
committerH.J. Lu <hjl.tools@gmail.com>2020-10-13 05:10:36 -0700
commitaac1d94f19492fb6bea7193497bce599952c429d (patch)
treea228a103e97cc042b6d2ea5f5171294da08da4cb /gold
parent1fb1d64f4a7c817f91a164dc22d5a22a0e75c1b8 (diff)
downloadbinutils-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')
-rw-r--r--gold/ChangeLog12
-rw-r--r--gold/testsuite/icf_safe_so_test.cc8
-rwxr-xr-xgold/testsuite/icf_safe_so_test.sh2
-rw-r--r--gold/x86_64.cc18
4 files changed, 23 insertions, 17 deletions
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 <hongjiu.lu@intel.com>
+ 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 <hongjiu.lu@intel.com>
+
* icf.cc (Icf::find_identical_sections): Skip zero-sized sections.
2020-10-09 Alan Modra <amodra@gmail.com>
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<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);
}