diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 3 | ||||
-rw-r--r-- | ld/ChangeLog | 22 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/mips-elf.exp | 36 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-2.dd | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-2.gd | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-2.ld | 21 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-2.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-2.sd | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.gd | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.ld | 22 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.sd | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.dd | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.gd | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.sd | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.dd | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.gd | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.sd | 5 |
18 files changed, 229 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4b0454d..7e8cf8c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-07-09 Maciej W. Rozycki <macro@mips.com> + + * elfxx-mips.c (_bfd_mips_elf_adjust_dynamic_symbol): Don't set + `->needs_lazy_stub' if the stubs output section is the absolute + section. + 2018-07-09 H.J. Lu <hongjiu.lu@intel.com> PR ld/23388 diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index c33b276..990e3a1 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -9043,7 +9043,8 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info, the symbol to the stub location. This is required to make function pointers compare as equal between the normal executable and the shared library. */ - if (!h->def_regular) + if (!h->def_regular + && !bfd_is_abs_section (htab->sstubs->output_section)) { hmips->needs_lazy_stub = TRUE; htab->lazy_stub_count++; diff --git a/ld/ChangeLog b/ld/ChangeLog index c146f5c..7d382b9 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,27 @@ 2018-07-09 Maciej W. Rozycki <macro@mips.com> + * testsuite/ld-mips-elf/stub-dynsym-2.dd: New test. + * testsuite/ld-mips-elf/stub-dynsym-2.gd: New test. + * testsuite/ld-mips-elf/stub-dynsym-2.sd: New test. + * testsuite/ld-mips-elf/stub-dynsym-discard-2.gd: New test. + * testsuite/ld-mips-elf/stub-dynsym-discard-2.sd: New test. + * testsuite/ld-mips-elf/stub-dynsym-micromips-2.dd: New test. + * testsuite/ld-mips-elf/stub-dynsym-micromips-2.gd: New test. + * testsuite/ld-mips-elf/stub-dynsym-micromips-2.sd: New test. + * testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.dd: New + test. + * testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.gd: New + test. + * testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.sd: New + test. + * testsuite/ld-mips-elf/stub-dynsym-2.ld: New test linker + script. + * testsuite/ld-mips-elf/stub-dynsym-discard-2.ld: New test + linker script. + * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests. + +2018-07-09 Maciej W. Rozycki <macro@mips.com> + * testsuite/lib/ld-lib.exp (run_dump_test): Call `unsupported' if the target being tested has been excluded by means of one or more of `target', `alltargets' and `notarget' tags. Add support diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index ddd90f2..8b0594a 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -807,6 +807,42 @@ if { $linux_gnu } { "stub-dynsym$suffix-1-$dynsym.d"]] \ "stub-dynsym$suffix-1-$dynsym"]] } + run_ld_link_tests [list \ + [list \ + "Retained stubs for dynsyms ($isa)" \ + "-shared -melf32btsmip -T stub-dynsym-2.ld $lflag" "" \ + "-EB $aflag -32 -KPIC" \ + [list "stub-dynsym-2.s"] \ + [list \ + [list \ + "objdump" \ + "-dz -j .MIPS.stubs" \ + "stub-dynsym$suffix-2.dd"] \ + [list \ + "readelf" \ + "--dyn-syms" \ + "stub-dynsym$suffix-2.sd"] \ + [list \ + "readelf" \ + "-A" \ + "stub-dynsym$suffix-2.gd"]] \ + "stub-dynsym$suffix-2"] \ + [list \ + "Discarded stubs for dynsyms ($isa)" \ + "-shared -melf32btsmip -T stub-dynsym-discard-2.ld $lflag" \ + "" \ + "-EB $aflag -32 -KPIC" \ + [list "stub-dynsym-2.s"] \ + [list \ + [list \ + "readelf" \ + "--dyn-syms" \ + "stub-dynsym-discard-2.sd"] \ + [list \ + "readelf" \ + "-A" \ + "stub-dynsym-discard-2.gd"]] \ + "stub-dynsym-discard$suffix-2"]] } } diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-2.dd b/ld/testsuite/ld-mips-elf/stub-dynsym-2.dd new file mode 100644 index 0000000..6013a47 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-2.dd @@ -0,0 +1,17 @@ +.*: +file format .*mips.* + +Disassembly of section \.MIPS\.stubs: + +000800ec <_MIPS_STUBS_>: + 800ec: 8f998010 lw t9,-32752\(gp\) + 800f0: 03e07825 move t7,ra + 800f4: 0320f809 jalr t9 + 800f8: 24180002 li t8,2 + 800fc: 8f998010 lw t9,-32752\(gp\) + 80100: 03e07825 move t7,ra + 80104: 0320f809 jalr t9 + 80108: 24180001 li t8,1 + 8010c: 00000000 nop + 80110: 00000000 nop + 80114: 00000000 nop + 80118: 00000000 nop diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-2.gd b/ld/testsuite/ld-mips-elf/stub-dynsym-2.gd new file mode 100644 index 0000000..411cdf1 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-2.gd @@ -0,0 +1,12 @@ +Primary GOT: + Canonical gp value: 00097ff0 + + Reserved entries: + Address Access Initial Purpose + 00090000 -32752\(gp\) 00000000 Lazy resolver + 00090004 -32748\(gp\) 80000000 Module pointer \(GNU extension\) + + Global entries: + Address Access Initial Sym\.Val\. Type Ndx Name + 00090008 -32744\(gp\) 000800fc 000800fc FUNC UND bar + 0009000c -32740\(gp\) 000800ec 000800ec FUNC UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-2.ld b/ld/testsuite/ld-mips-elf/stub-dynsym-2.ld new file mode 100644 index 0000000..a385012 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-2.ld @@ -0,0 +1,21 @@ +SECTIONS +{ + . = 0x80000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.dyn : { *(.rel.dyn) } + .MIPS.stubs : { *(.MIPS.stubs) } + .text : { *(.text) } + + . = ALIGN (0x10000); + HIDDEN (_gp = . + 0x7ff0); + .got : { *(.got) } + + .symtab : { *(.symtab) } + .strtab : { *(.strtab) } + .shstrtab : { *(.shstrtab) } + + /DISCARD/ : { *(.reginfo) *(.MIPS.abiflags) *(.gnu.attributes) } +} diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-2.s b/ld/testsuite/ld-mips-elf/stub-dynsym-2.s new file mode 100644 index 0000000..9c5f166 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-2.s @@ -0,0 +1,2 @@ + lw $25,%call16(foo)($gp) + lw $25,%call16(bar)($gp) diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-2.sd b/ld/testsuite/ld-mips-elf/stub-dynsym-2.sd new file mode 100644 index 0000000..4960ae7 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-2.sd @@ -0,0 +1,5 @@ +Symbol table '\.dynsym' contains 3 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 000800fc 0 FUNC GLOBAL DEFAULT UND bar + 2: 000800ec 0 FUNC GLOBAL DEFAULT UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.gd b/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.gd new file mode 100644 index 0000000..f56553a --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.gd @@ -0,0 +1,12 @@ +Primary GOT: + Canonical gp value: 00097ff0 + + Reserved entries: + Address Access Initial Purpose + 00090000 -32752\(gp\) 00000000 Lazy resolver + 00090004 -32748\(gp\) 80000000 Module pointer \(GNU extension\) + + Global entries: + Address Access Initial Sym\.Val\. Type Ndx Name + 00090008 -32744\(gp\) 00000000 00000000 FUNC UND bar + 0009000c -32740\(gp\) 00000000 00000000 FUNC UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.ld b/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.ld new file mode 100644 index 0000000..e6d89bd --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.ld @@ -0,0 +1,22 @@ +SECTIONS +{ + . = 0x80000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.dyn : { *(.rel.dyn) } + .text : { *(.text) } + + . = ALIGN (0x10000); + HIDDEN (_gp = . + 0x7ff0); + .got : { *(.got) } + + .symtab : { *(.symtab) } + .strtab : { *(.strtab) } + .shstrtab : { *(.shstrtab) } + + /DISCARD/ : { + *(.reginfo) *(.MIPS.abiflags) *(.MIPS.stubs) *(.gnu.attributes) + } +} diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.sd b/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.sd new file mode 100644 index 0000000..f78f939 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-discard-2.sd @@ -0,0 +1,5 @@ +Symbol table '\.dynsym' contains 3 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 00000000 0 FUNC GLOBAL DEFAULT UND bar + 2: 00000000 0 FUNC GLOBAL DEFAULT UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.dd b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.dd new file mode 100644 index 0000000..7c3bf25 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.dd @@ -0,0 +1,16 @@ +.*: +file format .*mips.* + +Disassembly of section \.MIPS\.stubs: + +000800ec <_MIPS_STUBS_>: + 800ec: ff3c 8010 lw t9,-32752\(gp\) + 800f0: 0dff move t7,ra + 800f2: 45d9 jalr t9 + 800f4: 3300 0002 li t8,2 + 800f8: ff3c 8010 lw t9,-32752\(gp\) + 800fc: 0dff move t7,ra + 800fe: 45d9 jalr t9 + 80100: 3300 0001 li t8,1 + 80104: 0000 0000 nop + 80108: 0000 0000 nop + 8010c: 0000 0000 nop diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.gd b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.gd new file mode 100644 index 0000000..2691d1d --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.gd @@ -0,0 +1,12 @@ +Primary GOT: + Canonical gp value: 00097ff0 + + Reserved entries: + Address Access Initial Purpose + 00090000 -32752\(gp\) 00000000 Lazy resolver + 00090004 -32748\(gp\) 80000000 Module pointer \(GNU extension\) + + Global entries: + Address Access Initial Sym\.Val\. Type Ndx Name + 00090008 -32744\(gp\) 000800f9 000800f9 FUNC UND bar + 0009000c -32740\(gp\) 000800ed 000800ed FUNC UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.sd b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.sd new file mode 100644 index 0000000..d0b8d49 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-2.sd @@ -0,0 +1,5 @@ +Symbol table '\.dynsym' contains 3 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 000800f9 0 FUNC GLOBAL DEFAULT UND bar + 2: 000800ed 0 FUNC GLOBAL DEFAULT UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.dd b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.dd new file mode 100644 index 0000000..8c33741 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.dd @@ -0,0 +1,17 @@ +.*: +file format .*mips.* + +Disassembly of section \.MIPS\.stubs: + +000800ec <_MIPS_STUBS_>: + 800ec: ff3c 8010 lw t9,-32752\(gp\) + 800f0: 001f 7a90 move t7,ra + 800f4: 03f9 0f3c jalr t9 + 800f8: 3300 0002 li t8,2 + 800fc: ff3c 8010 lw t9,-32752\(gp\) + 80100: 001f 7a90 move t7,ra + 80104: 03f9 0f3c jalr t9 + 80108: 3300 0001 li t8,1 + 8010c: 0000 0000 nop + 80110: 0000 0000 nop + 80114: 0000 0000 nop + 80118: 0000 0000 nop diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.gd b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.gd new file mode 100644 index 0000000..1ebc071 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.gd @@ -0,0 +1,12 @@ +Primary GOT: + Canonical gp value: 00097ff0 + + Reserved entries: + Address Access Initial Purpose + 00090000 -32752\(gp\) 00000000 Lazy resolver + 00090004 -32748\(gp\) 80000000 Module pointer \(GNU extension\) + + Global entries: + Address Access Initial Sym\.Val\. Type Ndx Name + 00090008 -32744\(gp\) 000800fd 000800fd FUNC UND bar + 0009000c -32740\(gp\) 000800ed 000800ed FUNC UND foo diff --git a/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.sd b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.sd new file mode 100644 index 0000000..860fd48 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/stub-dynsym-micromips-insn32-2.sd @@ -0,0 +1,5 @@ +Symbol table '\.dynsym' contains 3 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 000800fd 0 FUNC GLOBAL DEFAULT UND bar + 2: 000800ed 0 FUNC GLOBAL DEFAULT UND foo |