This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[ARM] PR ld/21402, only override the symbol dynamic decision on undefined weak symbol
- From: Renlin Li <renlin dot li at foss dot arm dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>, Nicholas Clifton <nickc at redhat dot com>, Ramana Radhakrishnan <Ramana dot Radhakrishnan at arm dot com>
- Date: Wed, 20 Sep 2017 14:26:16 +0100
- Subject: [ARM] PR ld/21402, only override the symbol dynamic decision on undefined weak symbol
- Authentication-results: sourceware.org; auth=none
Hi all,
This is a similar path as this one.
https://sourceware.org/ml/binutils/2017-06/msg00391.html
https://sourceware.org/ml/binutils/2017-05/msg00341.html
Similar as aarch64 backend, arm backend only overrides the decision on undefined weak
symbols. arm backend part already emits necessary relative relocation for this case.
Few test cases are adjusted. As some symbols is not in the dynamic symbol table, some
relocations are not generated.
cross/native check-gas/ld have been done without new regressions.
native gcc regression (gcc/g++/gfortran) with new binutils is done without
new regressions.
Okay to commit?
Regards,
Renlin
bfd/ChangeLog:
2017-09-20 Renlin Li <renlin.li@arm.com>
PR ld/21402
(allocate_dynrelocs_for_symbol): Only make undefined weak symbols into
dynamic.
(elf32_arm_finish_dynamic_symbol): Add sanity check.
ld/ChangeLog:
2017-09-20 Renlin Li <renlin.li@arm.com>
PR ld/21402
* testsuite/ld-arm/tls-app.d: Update address.
* testsuite/ld-arm/tls-app.r: Remove relocations.
* testsuite/ld-arm/unresolved-1-dyn.d: Update.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index bad8540..deeaf60 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -15443,8 +15450,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
{
/* Make sure this symbol is output as a dynamic symbol.
Undefined weak syms won't yet be marked as dynamic. */
- if (h->dynindx == -1
- && !h->forced_local)
+ if (h->dynindx == -1 && !h->forced_local
+ && h->root.type == bfd_link_hash_undefweak)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
@@ -15531,8 +15538,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
/* Make sure this symbol is output as a dynamic symbol.
Undefined weak syms won't yet be marked as dynamic. */
- if (h->dynindx == -1
- && !h->forced_local)
+ if (h->dynindx == -1 && !h->forced_local
+ && h->root.type == bfd_link_hash_undefweak)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
@@ -15755,8 +15762,8 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
{
/* Make sure this symbol is output as a dynamic symbol.
Undefined weak syms won't yet be marked as dynamic. */
- if (h->dynindx == -1
- && !h->forced_local)
+ if (h->dynindx == -1 && !h->forced_local
+ && h->root.type == bfd_link_hash_undefweak)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
@@ -16284,6 +16291,11 @@ elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
eh = (struct elf32_arm_link_hash_entry *) h;
+ /* Sanity check to make sure no unexpected symbol reaches here. */
+ if (h->dynindx == -1 && !h->forced_local
+ && h->root.type != bfd_link_hash_undefweak && bfd_link_pic (info))
+ abort ();
+
if (h->plt.offset != (bfd_vma) -1)
{
if (!eh->is_iplt)
diff --git a/ld/testsuite/ld-arm/tls-app.d b/ld/testsuite/ld-arm/tls-app.d
index de0cbab..454adcd 100644
--- a/ld/testsuite/ld-arm/tls-app.d
+++ b/ld/testsuite/ld-arm/tls-app.d
@@ -2,17 +2,17 @@
.*: file format elf32-.*arm.*
architecture: arm.*, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
-start address 0x000081c8
+start address 0x00008[0-9a-f]+
Disassembly of section .text:
-000081c8 <foo>:
- 81c8: e1a00000 nop ; \(mov r0, r0\)
- 81cc: e1a00000 nop ; \(mov r0, r0\)
- 81d0: e1a0f00e mov pc, lr
- 81d4: 000080bc .word 0x000080bc
- 81d8: 000080b4 .word 0x000080b4
- 81dc: 000080ac .word 0x000080ac
- 81e0: 00000004 .word 0x00000004
- 81e4: 000080c4 .word 0x000080c4
- 81e8: 00000014 .word 0x00000014
+00008[0-9a-f]+ <foo>:
+ 8[0-9a-f]+: e1a00000 nop ; \(mov r0, r0\)
+ 8[0-9a-f]+: e1a00000 nop ; \(mov r0, r0\)
+ 8[0-9a-f]+: e1a0f00e mov pc, lr
+ 8[0-9a-f]+: 000080bc .word 0x000080bc
+ 8[0-9a-f]+: 000080b4 .word 0x000080b4
+ 8[0-9a-f]+: 000080ac .word 0x000080ac
+ 8[0-9a-f]+: 00000004 .word 0x00000004
+ 8[0-9a-f]+: 000080c4 .word 0x000080c4
+ 8[0-9a-f]+: 00000014 .word 0x00000014
diff --git a/ld/testsuite/ld-arm/tls-app.r b/ld/testsuite/ld-arm/tls-app.r
index b156d52..518c18c 100644
--- a/ld/testsuite/ld-arm/tls-app.r
+++ b/ld/testsuite/ld-arm/tls-app.r
@@ -3,8 +3,5 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
-[0-9a-f]+ R_ARM_TLS_DTPMOD32 app_gd
-[0-9a-f]+ R_ARM_TLS_DTPOFF32 app_gd
[0-9a-f]+ R_ARM_TLS_DTPMOD32 lib_gd
[0-9a-f]+ R_ARM_TLS_DTPOFF32 lib_gd
-[0-9a-f]+ R_ARM_TLS_TPOFF32 app_ie
diff --git a/ld/testsuite/ld-arm/unresolved-1-dyn.d b/ld/testsuite/ld-arm/unresolved-1-dyn.d
index 21cd959..529da37 100644
--- a/ld/testsuite/ld-arm/unresolved-1-dyn.d
+++ b/ld/testsuite/ld-arm/unresolved-1-dyn.d
@@ -5,4 +5,4 @@
Relocation section '\.rel\.dyn' .*
Offset .*
-.* R_ARM_GLOB_DAT +00000000 +foo
+^.* 00000000 R_ARM_NONE.+