lkml.org 
[lkml]   [2023]   [Aug]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 07/13] selftests/sgx: Produce static-pie executable for test enclave
    Date
    The current combination of -static and -fPIC creates a static executable
    with position-dependent addresses for global variables. Use -static-pie
    and -fPIE to create a proper static position independent executable that
    can be loaded at any address without a dynamic linker.

    When building the original "lea (encl_stack)(%rbx), %rax" assembly code
    with -static-pie -fPIE, the linker complains about a relocation it cannot
    resolve:

    /usr/local/bin/ld: /tmp/cchIWyfG.o: relocation R_X86_64_32S against
    `.data' can not be used when making a PIE object; recompile with -fPIE
    collect2: error: ld returned 1 exit status

    Thus, since only RIP-relative addressing is legit for local symbols, use
    "encl_stack(%rip)" and declare an explicit "__encl_base" symbol at the
    start of the linker script to be able to calculate the stack address
    relative to the current TCS in the enclave assembly entry code.

    Link: https://lore.kernel.org/all/f9c24d89-ed72-7d9e-c650-050d722c6b04@cs.kuleuven.be/
    Signed-off-by: Jo Van Bulck <jo.vanbulck@cs.kuleuven.be>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Acked-by: Kai Huang <kai.huang@intel.com>
    ---
    tools/testing/selftests/sgx/Makefile | 2 +-
    tools/testing/selftests/sgx/test_encl.lds | 1 +
    tools/testing/selftests/sgx/test_encl_bootstrap.S | 9 ++++++---
    3 files changed, 8 insertions(+), 4 deletions(-)

    diff --git a/tools/testing/selftests/sgx/Makefile b/tools/testing/selftests/sgx/Makefile
    index 7eb890bdd3f0..8d2ba6adc92b 100644
    --- a/tools/testing/selftests/sgx/Makefile
    +++ b/tools/testing/selftests/sgx/Makefile
    @@ -14,7 +14,7 @@ endif
    INCLUDES := -I$(top_srcdir)/tools/include
    HOST_CFLAGS := -Wall -Werror -g $(INCLUDES) -fPIC
    HOST_LDFLAGS := -z noexecstack -lcrypto
    -ENCL_CFLAGS += -Wall -Werror -static -nostdlib -ffreestanding -fPIC \
    +ENCL_CFLAGS += -Wall -Werror -static-pie -nostdlib -ffreestanding -fPIE \
    -fno-stack-protector -mrdrnd $(INCLUDES)
    ENCL_LDFLAGS := -Wl,-T,test_encl.lds,--build-id=none

    diff --git a/tools/testing/selftests/sgx/test_encl.lds b/tools/testing/selftests/sgx/test_encl.lds
    index a1ec64f7d91f..62d37160f59b 100644
    --- a/tools/testing/selftests/sgx/test_encl.lds
    +++ b/tools/testing/selftests/sgx/test_encl.lds
    @@ -10,6 +10,7 @@ PHDRS
    SECTIONS
    {
    . = 0;
    + __encl_base = .;
    .tcs : {
    *(.tcs*)
    } : tcs
    diff --git a/tools/testing/selftests/sgx/test_encl_bootstrap.S b/tools/testing/selftests/sgx/test_encl_bootstrap.S
    index e0ce993d3f2c..28fe5d2ac0af 100644
    --- a/tools/testing/selftests/sgx/test_encl_bootstrap.S
    +++ b/tools/testing/selftests/sgx/test_encl_bootstrap.S
    @@ -42,9 +42,12 @@
    encl_entry:
    # RBX contains the base address for TCS, which is the first address
    # inside the enclave for TCS #1 and one page into the enclave for
    - # TCS #2. By adding the value of encl_stack to it, we get
    - # the absolute address for the stack.
    - lea (encl_stack)(%rbx), %rax
    + # TCS #2. First make it relative by substracting __encl_base and
    + # then add the address of encl_stack to get the address for the stack.
    + lea __encl_base(%rip), %rax
    + sub %rax, %rbx
    + lea encl_stack(%rip), %rax
    + add %rbx, %rax
    jmp encl_entry_core
    encl_dyn_entry:
    # Entry point for dynamically created TCS page expected to follow
    --
    2.25.1
    \
     
     \ /
      Last update: 2023-08-31 15:43    [W:2.229 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site