f7884e7328
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. Signed-off-by: Jo Van Bulck <jo.vanbulck@cs.kuleuven.be> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> Acked-by: Kai Huang <kai.huang@intel.com> Link: https://lore.kernel.org/all/f9c24d89-ed72-7d9e-c650-050d722c6b04@cs.kuleuven.be/ Link: https://lore.kernel.org/all/20231005153854.25566-8-jo.vanbulck%40cs.kuleuven.be
43 lines
799 B
Plaintext
43 lines
799 B
Plaintext
OUTPUT_FORMAT(elf64-x86-64)
|
|
|
|
PHDRS
|
|
{
|
|
tcs PT_LOAD;
|
|
text PT_LOAD;
|
|
data PT_LOAD;
|
|
}
|
|
|
|
SECTIONS
|
|
{
|
|
. = 0;
|
|
__encl_base = .;
|
|
.tcs : {
|
|
*(.tcs*)
|
|
} : tcs
|
|
|
|
. = ALIGN(4096);
|
|
.text : {
|
|
*(.text*)
|
|
*(.rodata*)
|
|
FILL(0xDEADBEEF);
|
|
. = ALIGN(4096);
|
|
} : text
|
|
|
|
.data : {
|
|
*(.data*)
|
|
} : data
|
|
|
|
/DISCARD/ : {
|
|
*(.comment*)
|
|
*(.note*)
|
|
*(.debug*)
|
|
*(.eh_frame*)
|
|
}
|
|
}
|
|
|
|
ASSERT(!DEFINED(.altinstructions), "ALTERNATIVES are not supported in enclaves")
|
|
ASSERT(!DEFINED(.altinstr_replacement), "ALTERNATIVES are not supported in enclaves")
|
|
ASSERT(!DEFINED(.discard.retpoline_safe), "RETPOLINE ALTERNATIVES are not supported in enclaves")
|
|
ASSERT(!DEFINED(.discard.nospec), "RETPOLINE ALTERNATIVES are not supported in enclaves")
|
|
ASSERT(!DEFINED(.got.plt), "Libcalls are not supported in enclaves")
|