This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PR 21384, --dynamic-list regression with f02cb058


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]