From c327c9c1bcffd231fcaa05f3fd8c047d1fe0afcc Mon Sep 17 00:00:00 2001 From: Han Shen Date: Wed, 20 Jan 2016 16:36:53 -0800 Subject: Backport trunk patch wrt wrong stub generated for aarch64 large DSOs. Tested by build.py for linux aarch64 toolchains. The upstream patch is: commit 9a472eda40ba686e45bf4922455518ffa3c887e1 Author: Han Shen Date: Fri Jan 15 09:31:23 2016 -0800 [gold][aarch64] PR gold/19472 - DSOs need pc-relative stubs. The stub generated during relaxation uses absolute addressing mode for shared libraries, which is not correct. Use pc-relative addressing instead. gold/ChangeLog: 2016-01-15 Han Shen PR gold/19472 - DSOs need pc-relative stubs. * aarch64.cc (Reloc_stub::stub_type_for_reloc): Return PC-relative stub type for DSOs and pie executables. Change-Id: Id0022975cf93600117ff5bf300b9d736d6ad1f80 --- binutils-2.25/gold/aarch64.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'binutils-2.25/gold/aarch64.cc') diff --git a/binutils-2.25/gold/aarch64.cc b/binutils-2.25/gold/aarch64.cc index 1cc68d1e..445f3249 100644 --- a/binutils-2.25/gold/aarch64.cc +++ b/binutils-2.25/gold/aarch64.cc @@ -1327,10 +1327,12 @@ Reloc_stub::stub_type_for_reloc( if (aarch64_valid_for_adrp_p(location, dest)) return ST_ADRP_BRANCH; - if (parameters->options().output_is_position_independent() - && parameters->options().output_is_executable()) + // Always use PC-relative addressing in case of -shared or -pie. + if (parameters->options().output_is_position_independent()) return ST_LONG_BRANCH_PCREL; + // This saves 2 insns per stub, compared to ST_LONG_BRANCH_PCREL. + // But is only applicable to non-shared or non-pie. return ST_LONG_BRANCH_ABS; } -- cgit v1.2.3