diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 42d112f378..626e68a6ae 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-04-05 Maciej W. Rozycki + + * elflink.c (elf_link_add_object_symbols): Always turn hidden + and internal symbols which have a dynamic index into local + ones. + 2016-04-04 Nick Clifton PR 19872 diff --git a/bfd/elflink.c b/bfd/elflink.c index 445fb01325..42b3689048 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4583,7 +4583,7 @@ error_free_dyn: goto error_free_vers; } } - else if (dynsym && h->dynindx != -1) + else if (h->dynindx != -1) /* If the symbol already has a dynamic index, but visibility says it should not be visible, turn it into a local symbol. */ diff --git a/ld/ChangeLog b/ld/ChangeLog index ae7062af5e..1e1aae7afc 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,23 @@ +2016-04-05 Maciej W. Rozycki + + PR ld/19908 + * testsuite/ld-cris/tls-e-20.d: Adjust for hidden symbol + handling fix. + * testsuite/ld-cris/tls-e-20a.d: Likewise. + * testsuite/ld-cris/tls-e-21.d: Likewise. + * testsuite/ld-cris/tls-e-23.d: Likewise. + * testsuite/ld-cris/tls-e-80.d: Likewise. + * testsuite/ld-cris/tls-gd-3h.d: Likewise. + * testsuite/ld-cris/tls-leie-19.d: Likewise. + * testsuite/ld-mips-elf/export-class-ref-lib.sd: New test. + * testsuite/ld-mips-elf/export-hidden-ref.sd: New test. + * testsuite/ld-mips-elf/export-internal-ref.sd: New test. + * testsuite/ld-mips-elf/export-protected-ref.sd: New test. + * testsuite/ld-mips-elf/export-class-ref-f0.s: New test source. + * testsuite/ld-mips-elf/export-class-ref-f1.s: New test source. + * testsuite/ld-mips-elf/export-class-ref-f2.s: New test source. + * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests. + 2016-04-05 Cupertino Miranda * testsuite/ld-discard/extern.d: Removed xfail for ARC. diff --git a/ld/testsuite/ld-cris/tls-e-20.d b/ld/testsuite/ld-cris/tls-e-20.d index 6b4e7142ce..eb323a5980 100644 --- a/ld/testsuite/ld-cris/tls-e-20.d +++ b/ld/testsuite/ld-cris/tls-e-20.d @@ -35,8 +35,8 @@ SYMBOL TABLE: 0+80094 l d \.text 0+ \.text 0+820b0 l d \.tdata 0+ \.tdata 0+820bc l d \.got 0+ \.got +0+ l \.tdata 0+4 x 0+820bc l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+ g \.tdata 0+4 \.hidden x 0+80098 g F \.text 0+6 tlsdsofn2 0+8 g \.tdata 0+4 \.hidden x2 0+80094 g \.text 0+ _start diff --git a/ld/testsuite/ld-cris/tls-e-20a.d b/ld/testsuite/ld-cris/tls-e-20a.d index 13b3be8b82..7d5a95e8b2 100644 --- a/ld/testsuite/ld-cris/tls-e-20a.d +++ b/ld/testsuite/ld-cris/tls-e-20a.d @@ -43,8 +43,8 @@ SYMBOL TABLE: 0+ l df \*ABS\* 0+ .* 0+ l \.tdata 0+80 tls128 0+ l df \*ABS\* 0+ .* +0+80 l \.tdata 0+4 x 0+82168 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+80 g \.tdata 0+4 \.hidden x 0+800c4 g F \.text 0+6 tlsdsofn2 0+821b4 g O \.data 0+4 got7var5 0+88 g \.tdata 0+4 \.hidden x2 diff --git a/ld/testsuite/ld-cris/tls-e-21.d b/ld/testsuite/ld-cris/tls-e-21.d index fa56b9faad..80ca3e37f7 100644 --- a/ld/testsuite/ld-cris/tls-e-21.d +++ b/ld/testsuite/ld-cris/tls-e-21.d @@ -19,7 +19,7 @@ private flags = 0: #... SYMBOL TABLE: #... -0+80 g \.tdata 0+4 \.hidden x +0+80 l \.tdata 0+4 x #... Contents of section \.text: #... diff --git a/ld/testsuite/ld-cris/tls-e-23.d b/ld/testsuite/ld-cris/tls-e-23.d index 499899edf7..a09d55ef90 100644 --- a/ld/testsuite/ld-cris/tls-e-23.d +++ b/ld/testsuite/ld-cris/tls-e-23.d @@ -19,7 +19,7 @@ private flags = 0: #... SYMBOL TABLE: #... -0+80 g \.tdata 0+4 \.hidden x +0+80 l \.tdata 0+4 x #... Contents of section \.text: #... diff --git a/ld/testsuite/ld-cris/tls-e-80.d b/ld/testsuite/ld-cris/tls-e-80.d index 7a6f4599e9..15ce3d7838 100644 --- a/ld/testsuite/ld-cris/tls-e-80.d +++ b/ld/testsuite/ld-cris/tls-e-80.d @@ -42,8 +42,8 @@ SYMBOL TABLE: 0+820c0 l d \.tdata 0+ \.tdata 0+820d0 l d \.tbss 0+ \.tbss 0+820d0 l d \.got 0+ \.got +0+ l \.tdata 0+4 x 0+820d0 l O \.got 0+ _GLOBAL_OFFSET_TABLE_ -0+ g \.tdata 0+4 \.hidden x 0+800a0 g F \.text 0+6 tlsdsofn2 0+800a8 g F \.text 0+6 tlsfn12 0+c g \.tdata 0+4 \.hidden x2 diff --git a/ld/testsuite/ld-cris/tls-gd-3h.d b/ld/testsuite/ld-cris/tls-gd-3h.d index 78f109da8f..898a670e16 100644 --- a/ld/testsuite/ld-cris/tls-gd-3h.d +++ b/ld/testsuite/ld-cris/tls-gd-3h.d @@ -19,7 +19,7 @@ private flags = 0: #... SYMBOL TABLE: #... -0+80 g \.tdata 0+4 \.hidden x +0+80 l \.tdata 0+4 x #... Contents of section \.text: #... diff --git a/ld/testsuite/ld-cris/tls-leie-19.d b/ld/testsuite/ld-cris/tls-leie-19.d index 6cf69b23f7..859e2e64dd 100644 --- a/ld/testsuite/ld-cris/tls-leie-19.d +++ b/ld/testsuite/ld-cris/tls-leie-19.d @@ -26,14 +26,14 @@ private flags = 0: CONTENTS.* SYMBOL TABLE: #... +0+84 l \.tdata 0+4 x2 +#... +0+80 l \.tdata 0+4 x1 +#... 0+88 g .tdata 0+4 x #... -0+84 g \.tdata 0+4 \.hidden x2 -#... 0+8c g .tdata 0+4 z #... -0+80 g \.tdata 0+4 \.hidden x1 -#... Contents of section \.text: #... Contents of section \.got: diff --git a/ld/testsuite/ld-mips-elf/export-class-ref-f0.s b/ld/testsuite/ld-mips-elf/export-class-ref-f0.s new file mode 100644 index 0000000000..675996d368 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-class-ref-f0.s @@ -0,0 +1,37 @@ + .abicalls + .text + + .if refv == 3 + .protected f1 + .elseif refv == 2 + .hidden f1 + .elseif refv == 1 + .internal f1 + .endif + + .globl f0 + .ent f0 +f0: + .frame $sp, 32, $31 + .mask 0x80000000, -4 + .fmask 0x00000000, 0 + .set noreorder + .cpload $25 + .set reorder + addiu $sp, $sp, -32 + sw $31, 28($sp) + .cprestore 16 + + lw $25, %call16(f1)($28) + jalr $25 + lw $28, 16($sp) + + lw $25, %call16(f2)($28) + jalr $25 + lw $28, 16($sp) + + move $2, $0 + lw $31, 28($sp) + addiu $sp, $sp, 32 + jr $31 + .end f0 diff --git a/ld/testsuite/ld-mips-elf/export-class-ref-f1.s b/ld/testsuite/ld-mips-elf/export-class-ref-f1.s new file mode 100644 index 0000000000..299278da3b --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-class-ref-f1.s @@ -0,0 +1,18 @@ + .abicalls + .text + + .globl f1 + .if defv == 3 + .protected f1 + .elseif defv == 2 + .hidden f1 + .elseif defv == 1 + .internal f1 + .endif + .ent f1 +f1: + .frame $sp, 0, $31 + .mask 0x00000000, 0 + .fmask 0x00000000, 0 + jr $31 + .end f1 diff --git a/ld/testsuite/ld-mips-elf/export-class-ref-f2.s b/ld/testsuite/ld-mips-elf/export-class-ref-f2.s new file mode 100644 index 0000000000..deecdd20f4 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-class-ref-f2.s @@ -0,0 +1,20 @@ + .abicalls + .text + + .globl f1 + .ent f1 +f1: + .frame $sp, 0, $31 + .mask 0x00000000, 0 + .fmask 0x00000000, 0 + jr $31 + .end f1 + + .globl f2 + .ent f2 +f2: + .frame $sp, 0, $31 + .mask 0x00000000, 0 + .fmask 0x00000000, 0 + jr $31 + .end f2 diff --git a/ld/testsuite/ld-mips-elf/export-class-ref-lib.sd b/ld/testsuite/ld-mips-elf/export-class-ref-lib.sd new file mode 100644 index 0000000000..26b3e38e2d --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-class-ref-lib.sd @@ -0,0 +1,6 @@ +# Make sure `f1' is present in the dynamic symbol table, e.g.: +# Num: Value Size Type Bind Vis Ndx Name +# 6: 000002d0 8 FUNC GLOBAL DEFAULT 7 f1 +#... + *[0-9]+: +[0-9a-f]+ +[0-9]+ FUNC +GLOBAL +DEFAULT +[0-9]+ f1 +#pass diff --git a/ld/testsuite/ld-mips-elf/export-hidden-ref.sd b/ld/testsuite/ld-mips-elf/export-hidden-ref.sd new file mode 100644 index 0000000000..b1d62467da --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-hidden-ref.sd @@ -0,0 +1,7 @@ +# Make sure no hidden symbol is present in the dynamic symbol table, e.g.: +# Num: Value Size Type Bind Vis Ndx Name +# 6: 004003f0 8 FUNC GLOBAL HIDDEN 8 f1 +#failif +#... +.+ +HIDDEN +.+ +f1 +#pass diff --git a/ld/testsuite/ld-mips-elf/export-internal-ref.sd b/ld/testsuite/ld-mips-elf/export-internal-ref.sd new file mode 100644 index 0000000000..48515435ff --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-internal-ref.sd @@ -0,0 +1,7 @@ +# Make sure no internal symbol is present in the dynamic symbol table, e.g.: +# Num: Value Size Type Bind Vis Ndx Name +# 6: 004003f0 8 FUNC GLOBAL INTERNAL 8 f1 +#failif +#... +.+ +INTERNAL +.+ +f1 +#pass diff --git a/ld/testsuite/ld-mips-elf/export-local-ref.sd b/ld/testsuite/ld-mips-elf/export-local-ref.sd new file mode 100644 index 0000000000..4ee4a42c3c --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-local-ref.sd @@ -0,0 +1,7 @@ +# Make sure no local symbol is present in the dynamic symbol table, e.g.: +# Num: Value Size Type Bind Vis Ndx Name +# 6: 004003f0 8 FUNC LOCAL DEFAULT 8 f1 +#failif +#... +.+ +LOCAL +.+ +f1 +#pass diff --git a/ld/testsuite/ld-mips-elf/export-protected-ref.sd b/ld/testsuite/ld-mips-elf/export-protected-ref.sd new file mode 100644 index 0000000000..af2cb98bd2 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/export-protected-ref.sd @@ -0,0 +1,6 @@ +# Make sure a protected symbol is present in the dynamic symbol table, e.g.: +# Num: Value Size Type Bind Vis Ndx Name +# 6: 004003f0 8 FUNC GLOBAL PROTECTED 8 f1 +#... + *[0-9]+: +[0-9a-f]+ +[0-9]+ FUNC +GLOBAL +PROTECTED +[0-9]+ f1 +#pass diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index c5ce5bc771..4467719683 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -899,3 +899,31 @@ if { $linux_gnu } { n32 -1 1 umips } } + +# PR ld/19908 export class tests. +if { $linux_gnu } { + run_ld_link_tests [list \ + [list "Shared library for MIPS export class symbol reference tests" \ + "$abi_ldflags(o32) -shared" "" \ + "$abi_asflags(o32)" \ + { export-class-ref-f2.s } \ + { { readelf --dyn-syms export-class-ref-lib.sd } } \ + "export-class-ref-lib.so"]] + foreach { class flag } { internal 1 hidden 2 protected 3 } { + run_ld_link_tests [list \ + [list "MIPS $class symbol reference test 1" \ + "$abi_ldflags(o32) -e f0" "tmpdir/export-class-ref-lib.so" \ + "$abi_asflags(o32) --defsym defv=$flag" \ + { export-class-ref-f0.s export-class-ref-f1.s } \ + [list [list readelf --dyn-syms export-$class-ref.sd] \ + [list readelf --dyn-syms export-local-ref.sd]] \ + "export-$class-ref"] \ + [list "MIPS $class symbol reference test 2" \ + "$abi_ldflags(o32) -e f0" "tmpdir/export-class-ref-lib.so" \ + "$abi_asflags(o32) --defsym defv=$flag --defsym refv=$flag" \ + { export-class-ref-f0.s export-class-ref-f1.s } \ + [list [list readelf --dyn-syms export-$class-ref.sd] \ + [list readelf --dyn-syms export-local-ref.sd]] \ + "export-$class-ref"]] + } +}