On Mon, 2023-07-24 at 18:58 +0200, Jo Van Bulck wrote: > Relocate encl_op_array entries at runtime relative to the enclave base to > ensure correct function pointer when compiling the test enclave with -Os. Putting aside whether we should consider building the selftests using "-Os", it would be helpful to explain how can the "-Os" break the existing code, so that we can review why this fix is reasonable. Perhaps it's obvious to others but it's not obvious to me what can go wrong here. > > Signed-off-by: Jo Van Bulck <jo.vanbulck@xxxxxxxxxxxxxx> > --- > tools/testing/selftests/sgx/test_encl.c | 6 ++++-- > tools/testing/selftests/sgx/test_encl.lds | 1 + > tools/testing/selftests/sgx/test_encl_bootstrap.S | 5 +++++ > 3 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/sgx/test_encl.c b/tools/testing/selftests/sgx/test_encl.c > index c0d6397295e3..4e31a6c3d673 100644 > --- a/tools/testing/selftests/sgx/test_encl.c > +++ b/tools/testing/selftests/sgx/test_encl.c > @@ -119,9 +119,11 @@ static void do_encl_op_nop(void *_op) > > } > > +uint64_t get_enclave_base(void); > + > void encl_body(void *rdi, void *rsi) > { > - const void (*encl_op_array[ENCL_OP_MAX])(void *) = { > + static void (*encl_op_array[ENCL_OP_MAX])(void *) = { > do_encl_op_put_to_buf, > do_encl_op_get_from_buf, > do_encl_op_put_to_addr, > @@ -135,5 +137,5 @@ void encl_body(void *rdi, void *rsi) > struct encl_op_header *op = (struct encl_op_header *)rdi; > > if (op->type < ENCL_OP_MAX) > - (*encl_op_array[op->type])(op); > + (*(get_enclave_base() + encl_op_array[op->type]))(op); > } > diff --git a/tools/testing/selftests/sgx/test_encl.lds b/tools/testing/selftests/sgx/test_encl.lds > index a1ec64f7d91f..ca659db2a534 100644 > --- a/tools/testing/selftests/sgx/test_encl.lds > +++ b/tools/testing/selftests/sgx/test_encl.lds > @@ -10,6 +10,7 @@ PHDRS > SECTIONS > { > . = 0; > + __enclave_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 03ae0f57e29d..6126dbd7ad1c 100644 > --- a/tools/testing/selftests/sgx/test_encl_bootstrap.S > +++ b/tools/testing/selftests/sgx/test_encl_bootstrap.S > @@ -86,6 +86,11 @@ encl_entry_core: > mov $4, %rax > enclu > > + .global get_enclave_base > +get_enclave_base: > + lea __enclave_base(%rip), %rax > + ret > + > .section ".data", "aw" > > encl_ssa_tcs1: