aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elflink.c11
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/testsuite/ld-elf/pr20828-1.sd12
-rw-r--r--ld/testsuite/ld-elf/pr20828-2a.sd9
-rw-r--r--ld/testsuite/ld-elf/pr20828-2b.sd7
-rw-r--r--ld/testsuite/ld-elf/pr20828.ld19
-rw-r--r--ld/testsuite/ld-elf/pr20828.s2
-rw-r--r--ld/testsuite/ld-elf/pr20828.ver1
-rw-r--r--ld/testsuite/ld-elf/shared.exp47
10 files changed, 123 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3fae9dd..624af08 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2017-01-18 Maciej W. Rozycki <macro@imgtec.com>
+
+ PR ld/20828
+ * elflink.c (bfd_elf_record_link_assignment): Clear any
+ `forced_local' marking for DSO symbols that are not being
+ provided.
+
2017-01-17 Kuan-Lin Chen <kuanlinchentw@gmail.com>
* elfnn-riscv.c (riscv_elf_object_p): New function.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 1e5fa61..d7ed8ce 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -671,12 +671,17 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
/* 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,
- then clear out any version information because the symbol will not be
- associated with the dynamic object any more. */
+ then undo any forced local marking that may have been set by input
+ section garbage collection and clear out any version information
+ because the symbol will not be associated with the dynamic object
+ any more. */
if (!provide
&& h->def_dynamic
&& !h->def_regular)
- h->verinfo.verdef = NULL;
+ {
+ h->forced_local = 0;
+ h->verinfo.verdef = NULL;
+ }
h->def_regular = 1;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e505c84..0cc3393 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,16 @@
2017-01-18 Maciej W. Rozycki <macro@imgtec.com>
+ PR ld/20828
+ * testsuite/ld-elf/pr20828-1.sd: New test.
+ * testsuite/ld-elf/pr20828-2a.sd: New test.
+ * testsuite/ld-elf/pr20828-2b.sd: New test.
+ * testsuite/ld-elf/pr20828.ld: New test linker script.
+ * testsuite/ld-elf/pr20828.ver: New test version script.
+ * testsuite/ld-elf/pr20828.s: New test source.
+ * testsuite/ld-elf/shared.exp: Run the new test.
+
+2017-01-18 Maciej W. Rozycki <macro@imgtec.com>
+
PR gas/20649
* testsuite/ld-mips-elf/mips-elf.exp: Add PIC comdat GOT16/LO16
relocation pairing link test.
diff --git a/ld/testsuite/ld-elf/pr20828-1.sd b/ld/testsuite/ld-elf/pr20828-1.sd
new file mode 100644
index 0000000..c47eb1d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20828-1.sd
@@ -0,0 +1,12 @@
+# Make sure symbols are global rather than local in the dynamic symbol table,
+# e.g.:
+# Num: Value Size Type Bind Vis Ndx Name
+# 1: 00000000 0 NOTYPE GLOBAL DEFAULT 1 _fdata
+# 2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 _edata
+# vs:
+# 1: 00000000 0 NOTYPE LOCAL DEFAULT 1 _fdata
+# 2: 00000000 0 NOTYPE LOCAL DEFAULT 1 _edata
+#...
+ *[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_fdata
+ *[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_edata
+#pass
diff --git a/ld/testsuite/ld-elf/pr20828-2a.sd b/ld/testsuite/ld-elf/pr20828-2a.sd
new file mode 100644
index 0000000..c4b239b
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20828-2a.sd
@@ -0,0 +1,9 @@
+# Make sure `_edata' is global rather than local in the dynamic symbol table,
+# e.g.:
+# Num: Value Size Type Bind Vis Ndx Name
+# 1: 00000000 0 NOTYPE GLOBAL DEFAULT 1 _edata
+# vs:
+# 1: 00000000 0 NOTYPE LOCAL DEFAULT 1 _edata
+#...
+ *[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_edata
+#pass
diff --git a/ld/testsuite/ld-elf/pr20828-2b.sd b/ld/testsuite/ld-elf/pr20828-2b.sd
new file mode 100644
index 0000000..8089c48
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20828-2b.sd
@@ -0,0 +1,7 @@
+# Make sure no `_fdata' is present in the dynamic symbol table, e.g.:
+# Num: Value Size Type Bind Vis Ndx Name
+# 1: 00000000 0 NOTYPE LOCAL DEFAULT 1 _fdata
+#failif
+#...
+.+ +_fdata
+#pass
diff --git a/ld/testsuite/ld-elf/pr20828.ld b/ld/testsuite/ld-elf/pr20828.ld
new file mode 100644
index 0000000..9ca1943
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20828.ld
@@ -0,0 +1,19 @@
+SECTIONS
+{
+ .data :
+ {
+ _fdata = .;
+ *(.data)
+ _edata = .;
+ }
+ .dynamic : { *(.dynamic) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .shstrtab : { *(.shstrtab) }
+ .symtab : { *(.symtab) }
+ .strtab : { *(.strtab) }
+ .got.plt : { *(.got.plt) }
+ .got : { *(.got) }
+ /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-elf/pr20828.s b/ld/testsuite/ld-elf/pr20828.s
new file mode 100644
index 0000000..ece49d5
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20828.s
@@ -0,0 +1,2 @@
+ .data
+ .byte 0
diff --git a/ld/testsuite/ld-elf/pr20828.ver b/ld/testsuite/ld-elf/pr20828.ver
new file mode 100644
index 0000000..7d0fa22
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20828.ver
@@ -0,0 +1 @@
+{ global: _edata; local: *; };
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index f38cd7b..8f1f166 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -31,6 +31,53 @@ if ![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"
+}
+# This target requires a non-default emulation for successful shared
+# library/executable builds.
+set LFLAGS ""
+if [istarget "tic6x-*-*"] {
+ append LFLAGS " -melf32_tic6x_le"
+}
+
+# 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,
+# - the shared library symbols have been swept in section garbage collection.
+# Verify that the symbols are global rather than local and that a version
+# script adjusts them accordingly.
+if { [check_gc_sections_available] } {
+ run_ld_link_tests [list \
+ [list \
+ "PR ld/20828 dynamic symbols with section GC\
+ (auxiliary shared library)" \
+ "$LFLAGS -shared --gc-sections -T pr20828.ld" "" "$AFLAGS_PIC" \
+ {pr20828.s} \
+ {{readelf --dyn-syms pr20828-1.sd}} \
+ "libpr20828.so"] \
+ [list \
+ "PR ld/20828 dynamic symbols with section GC (plain)" \
+ "$LFLAGS -shared --gc-sections -T pr20828.ld" \
+ "tmpdir/libpr20828.so" "$AFLAGS_PIC" \
+ {pr20828.s} \
+ {{readelf --dyn-syms pr20828-1.sd}} \
+ "pr20828-1.so"] \
+ [list \
+ "PR ld/20828 dynamic symbols with section GC (version script)" \
+ "$LFLAGS -shared --gc-sections -T pr20828.ld\
+ --version-script=pr20828.ver" \
+ "tmpdir/libpr20828.so" \
+ "$AFLAGS_PIC" \
+ {pr20828.s} \
+ {{readelf --dyn-syms pr20828-2a.sd} \
+ {readelf --dyn-syms pr20828-2b.sd}} \
+ "pr20828-2.so"]]
+}
+
# Check to see if the C compiler works
if { [which $CC] == 0 } {
return