This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PR 21384, --dynamic-list regression with f02cb058
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Alan Modra <amodra at gmail dot com>
- Cc: Binutils <binutils at sourceware dot org>
- Date: Tue, 2 May 2017 13:57:49 -0700
- Subject: Re: PR 21384, --dynamic-list regression with f02cb058
- Authentication-results: sourceware.org; auth=none
- References: <20170502152227.GG24006@bubble.grove.modra.org>
On Tue, May 2, 2017 at 8:22 AM, Alan Modra <amodra@gmail.com> wrote:
> The commit to "Always descend into output section statements in
> lang_do_assignments" meant that linker script symbols were not
> bfd_link_hash_new when ld called bfd_elf_record_link_assignment.
> This patch corrects that problem by testing h->non_elf instead.
>
> PR 21384
> * elflink.c (bfd_elf_link_mark_dynamic_symbol): Test h->non_elf
> rather than h->root.type == bfd_link_hash_new.
> (bfd_elf_record_link_assignment): Similarly, call
> bfd_elf_link_mark_dynamic_symbol when h->non_elf.
>
> diff --git a/bfd/ChangeLog b/bfd/ChangeLog
> index dff6a59..c62cf13 100644
> --- a/bfd/ChangeLog
> +++ b/bfd/ChangeLog
> @@ -1,3 +1,11 @@
> +2017-05-02 Alan Modra <amodra@gmail.com>
> +
> + PR 21384
> + * elflink.c (bfd_elf_link_mark_dynamic_symbol): Test h->non_elf
> + rather than h->root.type == bfd_link_hash_new.
> + (bfd_elf_record_link_assignment): Similarly, call
> + bfd_elf_link_mark_dynamic_symbol when h->non_elf.
> +
> 2017-04-29 Alan Modra <amodra@gmail.com>
>
> PR 21432
> diff --git a/bfd/elflink.c b/bfd/elflink.c
> index 4af4b1c..9acc069 100644
> --- a/bfd/elflink.c
> +++ b/bfd/elflink.c
> @@ -580,7 +580,7 @@ bfd_elf_link_mark_dynamic_symbol (struct bfd_link_info *info,
> && (ELF_ST_TYPE (sym->st_info) == STT_OBJECT
> || ELF_ST_TYPE (sym->st_info) == STT_COMMON))))
> || (d != NULL
> - && h->root.type == bfd_link_hash_new
> + && h->non_elf
> && (*d->match) (&d->head, NULL, h->root.root.string)))
> h->dynamic = 1;
> }
> @@ -623,6 +623,14 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
> }
> }
>
> + /* Symbols defined in a linker script but not referenced anywhere
> + else will have non_elf set. */
> + if (h->non_elf)
> + {
> + bfd_elf_link_mark_dynamic_symbol (info, h, NULL);
> + h->non_elf = 0;
> + }
> +
> switch (h->root.type)
> {
> case bfd_link_hash_defined:
> @@ -639,8 +647,6 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
> bfd_link_repair_undef_list (&htab->root);
> break;
> case bfd_link_hash_new:
> - bfd_elf_link_mark_dynamic_symbol (info, h, NULL);
> - h->non_elf = 0;
> break;
> case bfd_link_hash_indirect:
> /* We had a versioned symbol in a dynamic library. We make the
>
I checked in a test for this.
--
H.J.
From 640226f048b67d79da85742728e40114c9ee5da0 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Tue, 2 May 2017 13:54:22 -0700
Subject: [PATCH] Add a test for PR ld/21384
PR ld/21384
* testsuite/ld-elf/pr21384.d: New file.
* testsuite/ld-elf/pr21384.dl: Likewise.
* testsuite/ld-elf/pr21384.ld: Likewise.
* testsuite/ld-elf/pr21384.s: Likewise.
---
ld/ChangeLog | 8 ++++++++
ld/testsuite/ld-elf/pr21384.d | 11 +++++++++++
ld/testsuite/ld-elf/pr21384.dl | 4 ++++
ld/testsuite/ld-elf/pr21384.ld | 22 ++++++++++++++++++++++
ld/testsuite/ld-elf/pr21384.s | 2 ++
5 files changed, 47 insertions(+)
create mode 100644 ld/testsuite/ld-elf/pr21384.d
create mode 100644 ld/testsuite/ld-elf/pr21384.dl
create mode 100644 ld/testsuite/ld-elf/pr21384.ld
create mode 100644 ld/testsuite/ld-elf/pr21384.s
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 238404d..4fc4e1d 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2017-05-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/21384
+ * testsuite/ld-elf/pr21384.d: New file.
+ * testsuite/ld-elf/pr21384.dl: Likewise.
+ * testsuite/ld-elf/pr21384.ld: Likewise.
+ * testsuite/ld-elf/pr21384.s: Likewise.
+
2017-05-01 H.J. Lu <hongjiu.lu@intel.com>
* testsuite/ld-i386/tls.exp: Run GNU2 TLS tests only if there
diff --git a/ld/testsuite/ld-elf/pr21384.d b/ld/testsuite/ld-elf/pr21384.d
new file mode 100644
index 0000000..5a3aedc
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21384.d
@@ -0,0 +1,11 @@
+#ld: -T pr21384.ld --dynamic-list $srcdir/$subdir/pr21384.dl --no-dynamic-linker
+#readelf : --dyn-syms --wide
+#target: *-*-linux* *-*-gnu* *-*-solaris*
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND +
+#...
+ +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +edata
+ +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +fdata
+#pass
diff --git a/ld/testsuite/ld-elf/pr21384.dl b/ld/testsuite/ld-elf/pr21384.dl
new file mode 100644
index 0000000..b164dc0
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21384.dl
@@ -0,0 +1,4 @@
+{
+ fdata;
+ edata;
+};
diff --git a/ld/testsuite/ld-elf/pr21384.ld b/ld/testsuite/ld-elf/pr21384.ld
new file mode 100644
index 0000000..034887d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21384.ld
@@ -0,0 +1,22 @@
+SECTIONS
+{
+ .data :
+ {
+ fdata = .;
+ *(.data)
+ edata = .;
+ }
+ .dynamic : { *(.dynamic) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .shstrtab : { *(.shstrtab) }
+ .symtab : { *(.symtab) }
+ .strtab : { *(.strtab) }
+ .plt : { *(.plt) }
+ .got.plt : { *(.got.plt) }
+ .got : { *(.got) }
+ /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-elf/pr21384.s b/ld/testsuite/ld-elf/pr21384.s
new file mode 100644
index 0000000..ece49d5
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21384.s
@@ -0,0 +1,2 @@
+ .data
+ .byte 0
--
2.9.3