[PATCH] ELF: Don't check DT_NEEDED for linker script defined symbols

H.J. Lu hjl.tools@gmail.com
Tue Nov 28 13:05:00 GMT 2017


On Tue, Nov 28, 2017 at 4:26 AM, Alan Modra <amodra@gmail.com> wrote:
> On Mon, Nov 27, 2017 at 02:55:55PM +1030, Alan Modra wrote:
>> On Mon, Nov 27, 2017 at 07:12:59AM +1030, Alan Modra wrote:
>> > We already process some assignments in open_input_bfds to have
>> > --defsym symbols defined early, so (3) shouldn't be too hard.
>>
>> I'm testing the following.
>
> Well, that failed badly on mmix use of DEFINED.  I'd missed the need
> to increment lang_statement_iteration before open_input_bfds, and with
> DEFINED not returning values on the first pass ld could trash symbols
> defined in object files.  It's also possible for update_definedness to
> be missed on one pass, hence the need to track more than one bit of
> lang_statement_iteration.
>
>
> This patch processes linker script assignment statements before ld
> opens DT_NEEDED libraries, in order to define symbols like __bss_start
> that might also be defined by a library, falsely triggering an error
> about "DSO missing from command line".
>
> The initial value won't be correct when assigning a symbol from dot,
> and I make no attempt to handle all expressions.  For example, an
> assignment like "_start_foo = ADDR (.foo)" isn't valid until sections
> are laid out, so won't define _start_foo early.  What's here should be
> enough for most common scripts, and hopefully won't perturb fragile
> scripts.
>
> bfd/
>         PR 22471
>         * elflink.c (_bfd_elf_merge_symbol): Allow weak symbols to override
>         early passes over linker script symbols.
>         * linker.c (_bfd_generic_link_add_one_symbol): Allow symbols to
>         override early passes over linker script symbols.  Clear ldscript_def
>         on symbol definitions.
> ld/
>         PR 22471
>         * ldexp.c (struct definedness_hash_entry): Delete "by_script".  Make
>         "iteration" an 8-bit field, and update mask in all uses.
>         (definedness_newfunc): Don't init "by_script".
>         (update_definedness): Test ldscript_def rather than by_script.
>         (is_sym_value): Likewise.
>         (fold_name <DEFINED>): Return a result for first phase.  Test
>         ldscript_def.
>         (fold_name <NAME>): Return a result for first phase.
>         * ldlang.c (open_input_bfds): Process all assignments, not just
>         defsym.
>         (lang_process): Increment lang_statement_iteration before
>         open_input_bfds.
>         * testsuite/ld-mips-elf/tlsdyn-o32-1.d: Adjust for larger .dynsym.
>         * testsuite/ld-mips-elf/tlsdyn-o32-1.got: Likewise.
>         * testsuite/ld-mips-elf/tlsdyn-o32-2.d: Likewise.
>         * testsuite/ld-mips-elf/tlsdyn-o32-2.got: Likewise.
>         * testsuite/ld-mips-elf/tlsdyn-o32-3.d: Likewise.
>         * testsuite/ld-mips-elf/tlsdyn-o32-3.got: Likewise.
>

Here is a patch to add a testcase.  OK for master?

Thanks.


-- 
H.J.
---
>From 7ce00e7a68138f6d58d9d7db8a096dad24b8e47e Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 23 Nov 2017 08:36:21 -0800
Subject: [PATCH] ld: Add a testcase for PR ld/22471

PR ld/22471
* testsuite/ld-elf/pr22471.t: New file.
* testsuite/ld-elf/pr22471a.s: Likewise.
* testsuite/ld-elf/pr22471b.s: Likewise.
* testsuite/ld-elf/shared.exp (ASFLAGS): Define UNDERSCORE for
underscore targets.
Run PR ld/22471 tests.
---
 ld/testsuite/ld-elf/pr22471.t  |  1 +
 ld/testsuite/ld-elf/pr22471a.s |  1 +
 ld/testsuite/ld-elf/pr22471b.s | 17 +++++++++++++++++
 ld/testsuite/ld-elf/shared.exp | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 53 insertions(+)
 create mode 100644 ld/testsuite/ld-elf/pr22471.t
 create mode 100644 ld/testsuite/ld-elf/pr22471a.s
 create mode 100644 ld/testsuite/ld-elf/pr22471b.s

diff --git a/ld/testsuite/ld-elf/pr22471.t b/ld/testsuite/ld-elf/pr22471.t
new file mode 100644
index 0000000000..8862dc291d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22471.t
@@ -0,0 +1 @@
+{ local: *; };
diff --git a/ld/testsuite/ld-elf/pr22471a.s b/ld/testsuite/ld-elf/pr22471a.s
new file mode 100644
index 0000000000..3bb6a92bdb
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22471a.s
@@ -0,0 +1 @@
+# Empty input.
diff --git a/ld/testsuite/ld-elf/pr22471b.s b/ld/testsuite/ld-elf/pr22471b.s
new file mode 100644
index 0000000000..f4edad0464
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22471b.s
@@ -0,0 +1,17 @@
+ .type start,"function"
+ .global start
+start:
+ .type _start,"function"
+ .global _start
+_start:
+ .type __start,"function"
+ .global __start
+__start:
+ .type main,"function"
+ .global main
+main:
+  .ifdef UNDERSCORE
+ .dc.a ___bss_start
+  .else
+ .dc.a __bss_start
+  .endif
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index a40f8e0f59..7514eb116b 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -47,6 +47,40 @@ if [istarget "tic6x-*-*"] {
     append LFLAGS " -melf32_tic6x_le"
 }

+if [is_underscore_target] {
+    set ASFLAGS "$ASFLAGS --defsym UNDERSCORE=1"
+}
+
+run_ld_link_tests [list \
+    [list \
+ "Build pr22471a.so" \
+ "$LFLAGS -shared" \
+ "" \
+ "$AFLAGS_PIC" \
+ {pr22471a.s} \
+ {} \
+ "pr22471a.so" \
+    ] \
+    [list \
+ "Build pr22471b.so" \
+ "$LFLAGS -shared --version-script pr22471.t" \
+ "tmpdir/pr22471a.so" \
+ "$AFLAGS_PIC" \
+ {pr22471a.s} \
+ {} \
+ "pr22471b.so" \
+    ] \
+    [list \
+ "Build pr22471" \
+ "$LFLAGS -rpath-link ." \
+ "tmpdir/pr22471b.so" \
+ "" \
+ {pr22471b.s} \
+ {} \
+ "pr22471" \
+    ] \
+]
+
 # PR ld/20828 check for correct dynamic symbol table entries where:
 # - symbols have been defined with a linker script,
 # - the same symbols have been seen in shared library used in the link,
-- 
2.14.3



More information about the Binutils mailing list