x86: Support Intel Shadow Stack with SHSTK property
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Jun 2017 12:50:20 +0000 (05:50 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Jun 2017 12:50:31 +0000 (05:50 -0700)
commit48580982ef41907a45cda259a63d9e6878cbbea3
tree34cb9f37e796a00e55ade7a1fd60cac70a30a826
parentee2fdd6f36c10ceb84e05c7234983bcfbe6146d5
x86: Support Intel Shadow Stack with SHSTK property

To support Intel Shadow Stack (SHSTK) in Intel Control-flow Enforcement
Technology (CET) instructions:

https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf

 #define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1)

is added to GNU program properties to indicate that all executable sections
are compatible with SHSTK where return address popped from shadow stack
always matches return address popped from normal stack.

GNU_PROPERTY_X86_FEATURE_1_SHSTK is set on output only if it is set on all
relocatable inputs.

bfd/

* elf32-i386.c (elf_i386_merge_gnu_properties): If info->shstk
is set, turn on GNU_PROPERTY_X86_FEATURE_1_SHSTK.
(elf_i386_link_setup_gnu_properties): If info->shstk is set,
turn on GNU_PROPERTY_X86_FEATURE_1_IBT.
* elf64-x86-64.c (elf_x86_64_merge_gnu_properties): If
info->shstk is set, turn on GNU_PROPERTY_X86_FEATURE_1_SHSTK.
(elf_x86_64_link_setup_gnu_properties): If info->shstk is set,
turn on GNU_PROPERTY_X86_FEATURE_1_IBT.

binutils/

* readelf.c (decode_x86_feature): Decode
GNU_PROPERTY_X86_FEATURE_1_SHSTK.
* testsuite/binutils-all/i386/shstk.d: New file.
* testsuite/binutils-all/i386/shstk.s: Likewise.
* testsuite/binutils-all/x86-64/shstk-x32.d: Likewise.
* testsuite/binutils-all/x86-64/shstk.d: Likewise.
* testsuite/binutils-all/x86-64/shstk.s: Likewise.

include/

* bfdlink.h (bfd_link_info): Add shstk.
* elf/common.h (GNU_PROPERTY_X86_FEATURE_1_SHSTK): New.

ld/

* NEWS: Mention -z shstk and GNU_PROPERTY_X86_FEATURE_1_SHSTK.
* emulparams/cet.sh (PARSE_AND_LIST_OPTIONS_CET): Add "-z shstk".
(PARSE_AND_LIST_ARGS_CASE_Z_CET): Support "-z shstk".
* ld.texinfo: Document -z shstk.
* testsuite/ld-i386/i386.exp: Run SHSTK tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/property-x86-shstk.s: New file.
* testsuite/ld-i386/property-x86-shstk1a.d: Likewise.
* testsuite/ld-i386/property-x86-shstk1b.d: Likewise.
* testsuite/ld-i386/property-x86-shstk2.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3a.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3b.d: Likewise.
* testsuite/ld-i386/property-x86-shstk4.d: Likewise.
* testsuite/ld-i386/property-x86-shstk5.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk.s: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1a.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk1b.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk2-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk2.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk4-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk4.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk5-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk5.d: Likewise.
42 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
binutils/ChangeLog
binutils/readelf.c
binutils/testsuite/binutils-all/i386/shstk.d [new file with mode: 0644]
binutils/testsuite/binutils-all/i386/shstk.s [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/shstk-x32.d [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/shstk.d [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/shstk.s [new file with mode: 0644]
include/ChangeLog
include/bfdlink.h
include/elf/common.h
ld/ChangeLog
ld/NEWS
ld/emulparams/cet.sh
ld/ld.texinfo
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/property-x86-shstk.s [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk1a.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk1b.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk2.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk3a.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk3b.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk4.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-shstk5.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1a-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1b-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk1b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk2-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk3b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk4-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk4.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk5-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-shstk5.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp