Module: wine Branch: master Commit: 7e112c29173c5b8766542fcfec46e43e99e0c4fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=7e112c29173c5b8766542fcfec... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Tue Dec 21 19:38:27 2010 +0100 loader: Setup the TLS register on x86-64 for stack protector checks. --- loader/preloader.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/loader/preloader.c b/loader/preloader.c index 4344a16..e1c2276 100644 --- a/loader/preloader.c +++ b/loader/preloader.c @@ -344,6 +344,8 @@ static inline int wld_prctl( int code, long arg ) #elif defined(__x86_64__) +void *thread_data[256]; + /* * The _start function is the entry and exit point of this program * @@ -355,8 +357,12 @@ extern char _end[]; __ASM_GLOBAL_FUNC(_start, "movq %rsp,%rax\n\t" "leaq -144(%rsp),%rsp\n\t" /* allocate some space for extra aux values */ + "movq %rax,(%rsp)\n\t" /* orig stack pointer */ + "movq $thread_data,%rsi\n\t" + "movq $0x1002,%rdi\n\t" /* ARCH_SET_FS */ + "movq $158,%rax\n\t" /* SYS_arch_prctl */ + "syscall\n\t" "movq %rsp,%rdi\n\t" /* ptr to orig stack pointer */ - "movq %rax,(%rdi)\n\t" /* orig stack pointer */ "call wld_start\n\t" "movq (%rsp),%rsp\n\t" /* new stack pointer */ "pushq %rax\n\t" /* ELF interpreter entry point */