This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] LD: PROVIDE_HIDDEN export class problem
- From: "Maciej W. Rozycki" <macro at codesourcery dot com>
- To: Alan Modra <amodra at gmail dot com>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Cc: Dave Anglin <dave dot anglin at nrc dot ca>, Jeff Law <law at redhat dot com>, <binutils at sourceware dot org>
- Date: Wed, 1 May 2013 17:04:29 +0100
- Subject: Re: [PATCH] LD: PROVIDE_HIDDEN export class problem
- References: <alpine dot DEB dot 1 dot 10 dot 1304292220350 dot 1453 at tp dot orcam dot me dot uk> <20130430012124 dot GA3074 at bubble dot grove dot modra dot org>
[Joseph, there's a question for you below, search for tic6x.]
On Tue, 30 Apr 2013, Alan Modra wrote:
> > While testing the __ehdr_start fix (PR ld/15365) I have realised we have
> > a problem with the PROVIDE_HIDDEN linker script command or
> > bfd_elf_record_link_assignment that implements this command's export class
> > handling. The issue is the symbol named is always assigned the hidden
> > export class even if it was actually created by other means and the
> > PROVIDE part of the command wasn't used.
>
> Is that really a problem?
IMHO, yes.
> The ELF gABI says that in both references
> and definitions, a visibility attribute must be propagated. I reckon
> a PROVIDEd symbol counts as a definition, so I think it quite
> reasonable that the symbol becomes hidden.
If such a symbol is defined and referred to by objects linked, then I
believe the export class of the definition/references must be respected.
This is further implied by how the PROVIDE* commands are defined -- they
are meant to trigger only if there is no other definition, whereas when
there is one they are ignored (cf. ld.info: "If, on the other hand, the
program defines `etext' (with no leading underscore), the linker will
silently use the definition in the program.").
I hoped the test cases provided were clear enough an illustration,
however in this case perhaps a C code piece will be better. Given code
produced from a definition like this:
int foo = 1234;
present in input and a linker script containing:
PROVIDE_HIDDEN (foo = bar);
I see no reason why foo should be assigned the hidden export class, as in
this case "the linker will silently use the definition in the program."
Likewise I'd expect the link not to fail even if there's been no bar
definition anywhere.
Do you have a reference backing your claim that my interpretation is
wrong?
> The bug in
> bfd_elf_record_link_assignment that I was referring to in
> http://sourceware.org/ml/binutils/2013-04/msg00262.html is just that
> the attributes are not merged properly. Fixed as follows and
> committed.
>
> * elflink.c (bfd_elf_record_link_assignment): Dont make
> STV_INTERNAL symbols STV_HIDDEN.
That doesn't fully solve the problem I described here, however it's still
needed for the HIDDEN command (as I have just now realised) as well as the
different use of bfd_elf_record_link_assignment introduced with the patch
you posted there, so now that you've applied it I have dropped this part
from the other patch I have been working on then. That change still has
issues BTW, causing a segfault rather than the original assertion failure
in one of the test cases I included with my original proposal; I'm
currently investigating whether it's an unrelated preexisting problem
triggered.
Also I have realised the retention of the internal export class across
PROVIDE_HIDDEN requires test coverage, so here's an updated patch with
some extra cases added. They succeed across all the targets I've got
covered except tic6x-elf and tic6x-uclinux:
tic6x-elf FAIL: PROVIDE_HIDDEN test 2
tic6x-elf FAIL: PROVIDE_HIDDEN test 8
tic6x-uclinux FAIL: PROVIDE_HIDDEN test 2
tic6x-uclinux FAIL: PROVIDE_HIDDEN test 8
This is because unlike all the others they put the internal symbol in the
symbol table of a static executable as STB_LOCAL/STV_DEFAULT rather than
STB_GLOBAL/STV_INTERNAL.
Joseph, would you please comment on this -- has this been a deliberate
design decision for the tic6x ABI or is it just a bug/oversight of some
sort?
Note that unlike tests #2 and #8 tests #5 and #11 do record the internal
symbol as STB_LOCAL/STV_DEFAULT. This is because
bfd_elf_record_link_assignment calls _bfd_elf_link_hash_hide_symbol with
force_local set to TRUE. I'm not sure what the intent of this arrangement
is -- I'll appreciate insights.
Finally, I have also tweaked provide-hidden.exp slightly compared to the
previous version, mostly to handle GAS flags better.
Any further questions or comments?
2013-05-01 Maciej W. Rozycki <macro@codesourcery.com>
bfd/
* elflink.c (bfd_elf_record_link_assignment): For symbols that
have been named in a PROVIDE_HIDDEN command only set the hidden
export class if the symbol has been actually set by the command.
ld/
* emultempl/elf32.em (gld${EMULATION_NAME}_find_exp_assignment):
Don't set `provide' to true for nodes of the `etree_provided'
class.
ld/testsuite/
* ld-elf/provide-hidden-s.nd: New test.
* ld-elf/provide-hidden-1.nd: New test.
* ld-elf/provide-hidden-2.nd: New test.
* ld-elf/provide-hidden-3.nd: New test.
* ld-elf/provide-hidden-4.nd: New test.
* ld-elf/provide-hidden-5.nd: New test.
* ld-elf/provide-hidden-6.nd: New test.
* ld-elf/provide-hidden-7.nd: New test.
* ld-elf/provide-hidden-8.nd: New test.
* ld-elf/provide-hidden-9.nd: New test.
* ld-elf/provide-hidden-10.nd: New test.
* ld-elf/provide-hidden-11.nd: New test.
* ld-elf/provide-hidden-12.nd: New test.
* ld-elf/provide-hidden-1.ld: New test linker script.
* ld-elf/provide-hidden-2.ld: New test linker script.
* ld-elf/provide-hidden-1.s: New test source.
* ld-elf/provide-hidden-2.s: New test source.
* ld-elf/provide-hidden-3.s: New test source.
* ld-elf/provide-hidden-4.s: New test source.
* ld-elf/provide-hidden.exp: New test script.
Maciej
binutils-provide-nohidden.diff
Index: binutils-fsf-trunk-quilt/bfd/elflink.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elflink.c 2013-05-01 02:08:11.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elflink.c 2013-05-01 02:08:23.182672039 +0100
@@ -501,6 +501,7 @@ bfd_elf_record_link_assignment (bfd *out
bfd_boolean provide,
bfd_boolean hidden)
{
+ bfd_boolean make_hidden = !provide && hidden;
struct elf_link_hash_entry *h, *hv;
struct elf_link_hash_table *htab;
const struct elf_backend_data *bed;
@@ -527,6 +528,7 @@ bfd_elf_record_link_assignment (bfd *out
h->root.type = bfd_link_hash_new;
if (h->root.u.undef.next != NULL || htab->root.undefs_tail == &h->root)
bfd_link_repair_undef_list (&htab->root);
+ make_hidden = hidden;
break;
case bfd_link_hash_new:
bfd_elf_link_mark_dynamic_symbol (info, h, NULL);
@@ -559,7 +561,10 @@ bfd_elf_record_link_assignment (bfd *out
if (provide
&& h->def_dynamic
&& !h->def_regular)
- h->root.type = bfd_link_hash_undefined;
+ {
+ h->root.type = bfd_link_hash_undefined;
+ make_hidden = hidden;
+ }
/* If this symbol is not being provided by the linker script, and it is
currently defined by a dynamic object, but not by a regular object,
@@ -572,7 +577,7 @@ bfd_elf_record_link_assignment (bfd *out
h->def_regular = 1;
- if (hidden)
+ if (make_hidden)
{
bed = get_elf_backend_data (output_bfd);
h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
Index: binutils-fsf-trunk-quilt/ld/emultempl/elf32.em
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/emultempl/elf32.em 2013-05-01 02:08:11.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/emultempl/elf32.em 2013-05-01 02:08:23.182672039 +0100
@@ -1357,9 +1357,9 @@ gld${EMULATION_NAME}_find_exp_assignment
switch (exp->type.node_class)
{
case etree_provide:
- case etree_provided:
provide = TRUE;
/* Fall thru */
+ case etree_provided:
case etree_assign:
/* We call record_link_assignment even if the symbol is defined.
This is because if it is defined by a dynamic object, we
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-1.ld
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-1.ld 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,15 @@
+SECTIONS
+{
+ . = 0x12300000;
+ .data :
+ {
+ PROVIDE_HIDDEN (foo = . + 0x11100000);
+ *(.data)
+ }
+ .got : { *(.got) }
+ .interp : { *(.interp) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .dynamic : { *(.dynamic) }
+ .hash : { *(.hash) }
+}
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-1.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-1.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +GLOBAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-1.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-1.s 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,4 @@
+ .data
+ .globl foo
+foo:
+ .dc.a foo
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-10.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-10.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,8 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-11.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-11.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-12.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-12.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,6 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-2.ld
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-2.ld 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,12 @@
+SECTIONS
+{
+ . = 0x12300000;
+ PROVIDE_HIDDEN (foo = . + 0x11100000);
+ .data : { *(.data) }
+ .got : { *(.got) }
+ .interp : { *(.interp) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .dynamic : { *(.dynamic) }
+ .hash : { *(.hash) }
+}
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-2.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-2.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +GLOBAL +INTERNAL +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-2.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-2.s 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+ .data
+ .globl foo
+ .internal foo
+foo:
+ .dc.a foo
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-3.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-3.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-3.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-3.s 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,4 @@
+ .data
+ .globl bar
+bar:
+ .dc.a foo
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-4.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-4.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,8 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-4.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-4.s 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+ .data
+ .globl bar
+ .internal foo
+bar:
+ .dc.a foo
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-5.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-5.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-6.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-6.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,6 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-7.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-7.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +GLOBAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-8.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-8.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +GLOBAL +INTERNAL +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-9.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-9.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,5 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-s.nd
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden-s.nd 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,8 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +GLOBAL +DEFAULT +[0-9]+ foo
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +GLOBAL +DEFAULT +[0-9]+ foo
+#pass
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden.exp
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-elf/provide-hidden.exp 2013-05-01 02:08:31.683797670 +0100
@@ -0,0 +1,134 @@
+# Expect script for the PROVIDE_HIDDEN linker script command.
+#
+# Copyright 2013 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+#
+# Written by Maciej W. Rozycki <macro@codesourcery.com>
+#
+
+# Export classes only make sense for ELF shared-library targets.
+if { ![is_elf_format] || ![check_shared_lib_support] } {
+ return
+}
+
+# This target requires extra GAS options when building code for shared
+# libraries.
+set AFLAGS_PIC ""
+if [istarget "tic6x-*-*"] {
+ append AFLAGS_PIC " -mpic -mpid=near"
+}
+
+set testname "PROVIDE_HIDDEN test"
+
+run_ld_link_tests [list \
+ [list \
+ "$testname (auxiliary shared object)" \
+ "-shared -T provide-hidden-1.ld" "" \
+ "$AFLAGS_PIC" \
+ { provide-hidden-1.s } \
+ { { readelf -s provide-hidden-s.nd } } \
+ "provide-hidden-s.so"]]
+
+run_ld_link_tests [list \
+ [list \
+ "$testname 1" \
+ "-T provide-hidden-1.ld" "" \
+ "" \
+ [list provide-hidden-1.s] \
+ [list "readelf -s provide-hidden-1.nd"] \
+ "provide-hidden-1"] \
+ [list \
+ "$testname 2" \
+ "-T provide-hidden-1.ld" "" \
+ "" \
+ [list provide-hidden-2.s] \
+ [list "readelf -s provide-hidden-2.nd"] \
+ "provide-hidden-2"] \
+ [list \
+ "$testname 3" \
+ "-T provide-hidden-1.ld" "" \
+ "" \
+ [list provide-hidden-3.s] \
+ [list "readelf -s provide-hidden-3.nd"] \
+ "provide-hidden-3"] \
+ [list \
+ "$testname 4" \
+ "-T provide-hidden-1.ld" "tmpdir/provide-hidden-s.so" \
+ "" \
+ [list provide-hidden-3.s] \
+ [list "readelf -s provide-hidden-4.nd"] \
+ "provide-hidden-4"] \
+ [list \
+ "$testname 5" \
+ "-T provide-hidden-1.ld" "" \
+ "" \
+ [list provide-hidden-4.s] \
+ [list "readelf -s provide-hidden-5.nd"] \
+ "provide-hidden-5"] \
+ [list \
+ "$testname 6" \
+ "-T provide-hidden-1.ld" "tmpdir/provide-hidden-s.so" \
+ "" \
+ [list provide-hidden-4.s] \
+ [list "readelf -s provide-hidden-6.nd"] \
+ "provide-hidden-6"] \
+ [list \
+ "$testname 7" \
+ "-T provide-hidden-2.ld" "" \
+ "" \
+ [list provide-hidden-1.s] \
+ [list "readelf -s provide-hidden-7.nd"] \
+ "provide-hidden-7"] \
+ [list \
+ "$testname 8" \
+ "-T provide-hidden-2.ld" "" \
+ "" \
+ [list provide-hidden-2.s] \
+ [list "readelf -s provide-hidden-8.nd"] \
+ "provide-hidden-8"] \
+ [list \
+ "$testname 9" \
+ "-T provide-hidden-2.ld" "" \
+ "" \
+ [list provide-hidden-3.s] \
+ [list "readelf -s provide-hidden-9.nd"] \
+ "provide-hidden-9"] \
+ [list \
+ "$testname 10" \
+ "-T provide-hidden-2.ld" "tmpdir/provide-hidden-s.so" \
+ "" \
+ [list provide-hidden-3.s] \
+ [list "readelf -s provide-hidden-10.nd"] \
+ "provide-hidden-10"] \
+ [list \
+ "$testname 11" \
+ "-T provide-hidden-2.ld" "" \
+ "" \
+ [list provide-hidden-4.s] \
+ [list "readelf -s provide-hidden-11.nd"] \
+ "provide-hidden-11"] \
+ [list \
+ "$testname 12" \
+ "-T provide-hidden-2.ld" "tmpdir/provide-hidden-s.so" \
+ "" \
+ [list provide-hidden-4.s] \
+ [list "readelf -s provide-hidden-12.nd"] \
+ "provide-hidden-12"]]