diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/emulparams/elf_x86_64.sh | 5 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 15 | ||||
-rw-r--r-- | ld/ld.texinfo | 3 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 18 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/bnd-ifunc-1.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/bnd-ifunc-2.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/bnd-plt-1.d | 18 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx.exp | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx1a.rd | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx1c.rd | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx2a.rd | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx2c.rd | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx3.dd | 35 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx3a.s | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx3b.s | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx4.dd | 24 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx4a.s | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/mpx4b.s | 5 |
19 files changed, 175 insertions, 16 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index ec4be3f..a966603 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2014-11-18 Igor Zamyatin <igor.zamyatin@intel.com> + + * emulparams/elf_x86_64.sh (BNDPLT): Set to yes for x86_64. + * emultempl/elf32.em (gld${EMULATION_NAME}_handle_option): Handle + "-z bndplt" if BNDPLT is yes. + (gld${EMULATION_NAME}_list_options): Add "-z bndplt" entry. + * ld.texinfo: Add description for bndplt. + 2014-10-08 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> * avrtiny.sc: Apply avr.sc fixes. diff --git a/ld/emulparams/elf_x86_64.sh b/ld/emulparams/elf_x86_64.sh index d8cb6bf..1e83a74 100644 --- a/ld/emulparams/elf_x86_64.sh +++ b/ld/emulparams/elf_x86_64.sh @@ -31,7 +31,10 @@ fi case "$target" in x86_64*-linux*|i[3-7]86-*-linux-*) case "$EMULATION_NAME" in - *64*) LIBPATH_SUFFIX=64 ;; + *64*) + LIBPATH_SUFFIX=64 + BNDPLT=yes + ;; esac ;; *-*-solaris2*) diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 67c437d..137446f 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -2277,6 +2277,14 @@ fragment <<EOF link_info.execstack = FALSE; } EOF + +if test x"$BNDPLT" = xyes; then +fragment <<EOF + else if (strcmp (optarg, "bndplt") == 0) + link_info.bndplt = TRUE; +EOF +fi + if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then fragment <<EOF else if (strcmp (optarg, "global") == 0) @@ -2456,6 +2464,13 @@ fragment <<EOF EOF fi +if test x"$BNDPLT" = xyes; then +fragment <<EOF + fprintf (file, _("\ + -z bndplt Always generate BND prefix in PLT entries\n")); +EOF +fi + if test -n "$PARSE_AND_LIST_OPTIONS" ; then fragment <<EOF $PARSE_AND_LIST_OPTIONS diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 3001bf1..bb386e4 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -1133,6 +1133,9 @@ Specify a stack size for in an ELF @code{PT_GNU_STACK} segment. Specifying zero will override any default non-zero sized @code{PT_GNU_STACK} segment creation. +@item bndplt +Always generate BND prefix in PLT entries. Supported for Linux/x86_64. + @end table Other keywords are ignored for Solaris compatibility. diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 4d78aab..6cf823b 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2014-11-18 Igor Zamyatin <igor.zamyatin@intel.com> + + * testsuite/ld-x86-64/bnd-ifunc-1.d: Add bndplt option. + * testsuite/ld-x86-64/bnd-ifunc-2.d: Likewise. + * testsuite/ld-x86-64/bnd-plt-1.d: Likewise. Update dissassembly + sections. + * testsuite/ld-x86-64/mpx.exp: Handle mpx3 and mpx4 tests. + * testsuite/ld-x86-64/mpx1a.rd: Remove _BND from relocation name. + * testsuite/ld-x86-64/mpx1c.rd: Likewise. + * testsuite/ld-x86-64/mpx2a.rd: Likewise. + * testsuite/ld-x86-64/mpx2c.rd: Likewise. + * testsuite/ld-x86-64/mpx3.dd: New file. + * testsuite/ld-x86-64/mpx3a.s: Likewise. + * testsuite/ld-x86-64/mpx3b.s: Likewise. + * testsuite/ld-x86-64/mpx4.dd: Likewise. + * testsuite/ld-x86-64/mpx4a.s: Likewise. + * testsuite/ld-x86-64/mpx4b.s: Likewise. + 2014-11-13 H.J. Lu <hongjiu.lu@intel.com> PR gas/17598 diff --git a/ld/testsuite/ld-x86-64/bnd-ifunc-1.d b/ld/testsuite/ld-x86-64/bnd-ifunc-1.d index cdcb4f6..11313ab 100644 --- a/ld/testsuite/ld-x86-64/bnd-ifunc-1.d +++ b/ld/testsuite/ld-x86-64/bnd-ifunc-1.d @@ -1,5 +1,5 @@ #as: --64 -madd-bnd-prefix -#ld: -shared -melf_x86_64 +#ld: -shared -melf_x86_64 -z bndplt #objdump: -dw #... diff --git a/ld/testsuite/ld-x86-64/bnd-ifunc-2.d b/ld/testsuite/ld-x86-64/bnd-ifunc-2.d index 43e3356..6be8290 100644 --- a/ld/testsuite/ld-x86-64/bnd-ifunc-2.d +++ b/ld/testsuite/ld-x86-64/bnd-ifunc-2.d @@ -1,5 +1,5 @@ #as: --64 -madd-bnd-prefix -#ld: -shared -melf_x86_64 +#ld: -shared -melf_x86_64 -z bndplt #objdump: -dw #... diff --git a/ld/testsuite/ld-x86-64/bnd-plt-1.d b/ld/testsuite/ld-x86-64/bnd-plt-1.d index 3cfe9e6..d76a7a7 100644 --- a/ld/testsuite/ld-x86-64/bnd-plt-1.d +++ b/ld/testsuite/ld-x86-64/bnd-plt-1.d @@ -1,6 +1,6 @@ #source: bnd-branch-1.s #as: --64 -#ld: -shared -melf_x86_64 +#ld: -shared -melf_x86_64 -z bndplt #objdump: -dw .*: +file format .* @@ -13,8 +13,8 @@ Disassembly of section .plt: [ ]*[a-f0-9]+: f2 ff 25 83 01 20 00 bnd jmpq \*0x200183\(%rip\) # 200440 <_GLOBAL_OFFSET_TABLE_\+0x10> [ ]*[a-f0-9]+: 0f 1f 00 nopl \(%rax\) [ ]*[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 -[ ]*[a-f0-9]+: e9 e6 ff ff ff jmpq 2b0 <foo2@plt-0x50> -[ ]*[a-f0-9]+: 66 0f 1f 44 00 00 nopw 0x0\(%rax,%rax,1\) +[ ]*[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 2b0 <foo2@plt-0x50> +[ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) [ ]*[a-f0-9]+: 68 01 00 00 00 pushq \$0x1 [ ]*[a-f0-9]+: f2 e9 d5 ff ff ff bnd jmpq 2b0 <foo2@plt-0x50> [ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) @@ -22,14 +22,14 @@ Disassembly of section .plt: [ ]*[a-f0-9]+: f2 e9 c5 ff ff ff bnd jmpq 2b0 <foo2@plt-0x50> [ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) [ ]*[a-f0-9]+: 68 03 00 00 00 pushq \$0x3 -[ ]*[a-f0-9]+: e9 b6 ff ff ff jmpq 2b0 <foo2@plt-0x50> -[ ]*[a-f0-9]+: 66 0f 1f 44 00 00 nopw 0x0\(%rax,%rax,1\) +[ ]*[a-f0-9]+: f2 e9 b5 ff ff ff bnd jmpq 2b0 <foo2@plt-0x50> +[ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) Disassembly of section .plt.bnd: 0+300 <foo2@plt>: -[ ]*[a-f0-9]+: ff 25 42 01 20 00 jmpq \*0x200142\(%rip\) # 200448 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 66 90 xchg %ax,%ax +[ ]*[a-f0-9]+: f2 ff 25 41 01 20 00 bnd jmpq \*0x200141\(%rip\) # 200448 <_GLOBAL_OFFSET_TABLE_\+0x18> +[ ]*[a-f0-9]+: 90 nop 0+308 <foo3@plt>: [ ]*[a-f0-9]+: f2 ff 25 41 01 20 00 bnd jmpq \*0x200141\(%rip\) # 200450 <_GLOBAL_OFFSET_TABLE_\+0x20> @@ -40,8 +40,8 @@ Disassembly of section .plt.bnd: [ ]*[a-f0-9]+: 90 nop 0+318 <foo4@plt>: -[ ]*[a-f0-9]+: ff 25 42 01 20 00 jmpq \*0x200142\(%rip\) # 200460 <_GLOBAL_OFFSET_TABLE_\+0x30> -[ ]*[a-f0-9]+: 66 90 xchg %ax,%ax +[ ]*[a-f0-9]+: f2 ff 25 41 01 20 00 bnd jmpq \*0x200141\(%rip\) # 200460 <_GLOBAL_OFFSET_TABLE_\+0x30> +[ ]*[a-f0-9]+: 90 nop Disassembly of section .text: diff --git a/ld/testsuite/ld-x86-64/mpx.exp b/ld/testsuite/ld-x86-64/mpx.exp index f2a50d4..2650b3a 100644 --- a/ld/testsuite/ld-x86-64/mpx.exp +++ b/ld/testsuite/ld-x86-64/mpx.exp @@ -74,6 +74,21 @@ set run_tests { {dummy.s} "mpx2static" "mpx2.out"} } +run_ld_link_tests { + {"Build libcall.so" + "-shared -z bndplt" "" "" + {mpx3b.s} {} "libcall.so"} + {"Build mpx3" + "tmpdir/libcall.so -z bndplt" "" "" + {mpx3a.s} {{objdump -dw mpx3.dd}} "mpx3"} + {"Build libcall1.so" + "-shared -z bndplt" "" "" + {mpx4b.s} {} "libcall1.so"} + {"Build mpx4" + "tmpdir/libcall1.so -z bndplt" "" "" + {mpx4a.s} {{objdump -dw mpx4.dd}} "mpx4"} +} + run_ld_link_exec_tests [] $run_tests run_dump_test "bnd-branch-1" diff --git a/ld/testsuite/ld-x86-64/mpx1a.rd b/ld/testsuite/ld-x86-64/mpx1a.rd index 9bebc82..d66524c 100644 --- a/ld/testsuite/ld-x86-64/mpx1a.rd +++ b/ld/testsuite/ld-x86-64/mpx1a.rd @@ -1,3 +1,3 @@ #... -[0-9a-f ]+R_X86_64_PLT32_BND +0+ +.* +[0-9a-f ]+R_X86_64_PLT32 +0+ +.* #... diff --git a/ld/testsuite/ld-x86-64/mpx1c.rd b/ld/testsuite/ld-x86-64/mpx1c.rd index 2b050bd..d3b292c 100644 --- a/ld/testsuite/ld-x86-64/mpx1c.rd +++ b/ld/testsuite/ld-x86-64/mpx1c.rd @@ -1,3 +1,3 @@ #... -[0-9a-f ]+R_X86_64_PC32_BND +0+ +.* +[0-9a-f ]+R_X86_64_PC32 +0+ +.* #... diff --git a/ld/testsuite/ld-x86-64/mpx2a.rd b/ld/testsuite/ld-x86-64/mpx2a.rd index 9bebc82..d66524c 100644 --- a/ld/testsuite/ld-x86-64/mpx2a.rd +++ b/ld/testsuite/ld-x86-64/mpx2a.rd @@ -1,3 +1,3 @@ #... -[0-9a-f ]+R_X86_64_PLT32_BND +0+ +.* +[0-9a-f ]+R_X86_64_PLT32 +0+ +.* #... diff --git a/ld/testsuite/ld-x86-64/mpx2c.rd b/ld/testsuite/ld-x86-64/mpx2c.rd index 9bebc82..d66524c 100644 --- a/ld/testsuite/ld-x86-64/mpx2c.rd +++ b/ld/testsuite/ld-x86-64/mpx2c.rd @@ -1,3 +1,3 @@ #... -[0-9a-f ]+R_X86_64_PLT32_BND +0+ +.* +[0-9a-f ]+R_X86_64_PLT32 +0+ +.* #... diff --git a/ld/testsuite/ld-x86-64/mpx3.dd b/ld/testsuite/ld-x86-64/mpx3.dd new file mode 100644 index 0000000..2a8356d --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx3.dd @@ -0,0 +1,35 @@ +.*: +file format .* + + +Disassembly of section .plt: + +0+400290 <.plt>: +[ ]*[a-f0-9]+: ff 35 6a 01 20 00 pushq 0x20016a\(%rip\) # 600400 <_GLOBAL_OFFSET_TABLE_\+0x8> +[ ]*[a-f0-9]+: f2 ff 25 6b 01 20 00 bnd jmpq \*0x20016b\(%rip\) # 600408 <_GLOBAL_OFFSET_TABLE_\+0x10> +[ ]*[a-f0-9]+: 0f 1f 00 nopl \(%rax\) +[ ]*[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 +[ ]*[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 400290 <call1@plt-0x30> +[ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) +[ ]*[a-f0-9]+: 68 01 00 00 00 pushq \$0x1 +[ ]*[a-f0-9]+: f2 e9 d5 ff ff ff bnd jmpq 400290 <call1@plt-0x30> +[ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +Disassembly of section .plt.bnd: + +0+4002c0 <call1@plt>: +[ ]*[a-f0-9]+: f2 ff 25 49 01 20 00 bnd jmpq \*0x200149\(%rip\) # 600410 <_GLOBAL_OFFSET_TABLE_\+0x18> +[ ]*[a-f0-9]+: 90 nop + +0+4002c8 <call2@plt>: +[ ]*[a-f0-9]+: f2 ff 25 49 01 20 00 bnd jmpq \*0x200149\(%rip\) # 600418 <_GLOBAL_OFFSET_TABLE_\+0x20> +[ ]*[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+4002d0 <_start>: +[ ]*[a-f0-9]+: bf c0 02 40 00 mov \$0x4002c0,%edi +[ ]*[a-f0-9]+: f2 ff d7 bnd callq \*%rdi +[ ]*[a-f0-9]+: 48 8b 3d 41 01 20 00 mov 0x200141\(%rip\),%rdi # 600420 <func> +[ ]*[a-f0-9]+: f2 ff d7 bnd callq \*%rdi +[ ]*[a-f0-9]+: c3 retq +#pass diff --git a/ld/testsuite/ld-x86-64/mpx3a.s b/ld/testsuite/ld-x86-64/mpx3a.s new file mode 100644 index 0000000..28cb580 --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx3a.s @@ -0,0 +1,16 @@ + .text + .globl _start + .type _start, @function +_start: + movl $call1, %edi + bnd call *%rdi + movq func(%rip), %rdi + bnd call *%rdi + ret + .size _start, .-_start + .globl func + .data + .type func, @object + .size func, 8 +func: + .quad call2 diff --git a/ld/testsuite/ld-x86-64/mpx3b.s b/ld/testsuite/ld-x86-64/mpx3b.s new file mode 100644 index 0000000..1ee2557 --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx3b.s @@ -0,0 +1,11 @@ + .text + .globl call1 + .type call1, @function +call1: + ret + .size call1, .-call1 + .globl call2 + .type call2, @function +call2: + ret + .size call2, .-call2 diff --git a/ld/testsuite/ld-x86-64/mpx4.dd b/ld/testsuite/ld-x86-64/mpx4.dd new file mode 100644 index 0000000..0cf0f75 --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx4.dd @@ -0,0 +1,24 @@ +.*: +file format .* + + +Disassembly of section .plt: + +0+400260 <.plt>: +[ ]*[a-f0-9]+: ff 35 42 01 20 00 pushq 0x200142\(%rip\) # 6003a8 <_GLOBAL_OFFSET_TABLE_\+0x8> +[ ]*[a-f0-9]+: f2 ff 25 43 01 20 00 bnd jmpq \*0x200143\(%rip\) # 6003b0 <_GLOBAL_OFFSET_TABLE_\+0x10> +[ ]*[a-f0-9]+: 0f 1f 00 nopl \(%rax\) +[ ]*[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 +[ ]*[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 400260 <call1@plt-0x20> +[ ]*[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +Disassembly of section .plt.bnd: + +0+400280 <call1@plt>: +[ ]*[a-f0-9]+: f2 ff 25 31 01 20 00 bnd jmpq \*0x200131\(%rip\) # 6003b8 <_GLOBAL_OFFSET_TABLE_\+0x18> +[ ]*[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+400288 <_start>: +[ ]*[a-f0-9]+: bf 80 02 40 00 mov \$0x400280,%edi +[ ]*[a-f0-9]+: f2 ff d7 bnd callq \*%rdi diff --git a/ld/testsuite/ld-x86-64/mpx4a.s b/ld/testsuite/ld-x86-64/mpx4a.s new file mode 100644 index 0000000..0ee2723 --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx4a.s @@ -0,0 +1,6 @@ +.text + .globl _start + .type _start, @function +_start: + movl $call1, %edi + bnd call *%rdi diff --git a/ld/testsuite/ld-x86-64/mpx4b.s b/ld/testsuite/ld-x86-64/mpx4b.s new file mode 100644 index 0000000..0e9ac14 --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx4b.s @@ -0,0 +1,5 @@ +.text + .globl call1 + .type call1, @function +call1: + ret |