diff options
author | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2006-12-21 09:54:44 +0000 |
---|---|---|
committer | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2006-12-21 09:54:44 +0000 |
commit | 4d3ead5b20de46118087552ea6db715720f8374e (patch) | |
tree | d5de284f50c55bb0062b0ebd242dc23af89a758b /src/libw32dll | |
parent | 67534e2d8ca6a618952adcfa7dfc6d02deb49693 (diff) | |
download | xine-lib-4d3ead5b20de46118087552ea6db715720f8374e.tar.gz xine-lib-4d3ead5b20de46118087552ea6db715720f8374e.tar.bz2 |
Apply the textrel patch from Gentoo, thanks to PaX team for providing it. The patch was applied and tested for a while in Gentoo and Pardus, and solves also Debian's problems with non-PIC code. If problems will arise, they'll be debugged.
CVS patchset: 8431
CVS date: 2006/12/21 09:54:44
Diffstat (limited to 'src/libw32dll')
-rw-r--r-- | src/libw32dll/Makefile.am | 6 | ||||
-rw-r--r-- | src/libw32dll/wine/module.c | 12 | ||||
-rw-r--r-- | src/libw32dll/wine/stubs.s | 3 | ||||
-rw-r--r-- | src/libw32dll/wine/wrapper.S | 52 | ||||
-rw-r--r-- | src/libw32dll/wine/wrapper.h | 4 |
5 files changed, 44 insertions, 33 deletions
diff --git a/src/libw32dll/Makefile.am b/src/libw32dll/Makefile.am index aa42cd8e3..67af8a8d3 100644 --- a/src/libw32dll/Makefile.am +++ b/src/libw32dll/Makefile.am @@ -16,8 +16,7 @@ lib_LTLIBRARIES = $(w32dll_codec) $(qt_codec) EXTRA_DIST = common.c xineplug_decode_w32dll_la_SOURCES = w32codec.c -xineplug_decode_w32dll_la_LDFLAGS = -avoid-version -module \ - @IMPURE_TEXT_LDFLAGS@ +xineplug_decode_w32dll_la_LDFLAGS = -avoid-version -module xineplug_decode_w32dll_la_LIBADD = \ $(top_builddir)/src/libw32dll/wine/libwine.la \ $(XINE_LIB) \ @@ -26,8 +25,7 @@ xineplug_decode_w32dll_la_LIBADD = \ @KSTAT_LIBS@ xineplug_decode_qt_la_SOURCES = qt_decoder.c -xineplug_decode_qt_la_LDFLAGS = -avoid-version -module \ - IMPURE_TEXT_LDFLAGS@ +xineplug_decode_qt_la_LDFLAGS = -avoid-version -module xineplug_decode_qt_la_LIBADD = \ $(top_builddir)/src/libw32dll/wine/libwine.la \ $(XINE_LIB) \ diff --git a/src/libw32dll/wine/module.c b/src/libw32dll/wine/module.c index c37073d18..0331f141f 100644 --- a/src/libw32dll/wine/module.c +++ b/src/libw32dll/wine/module.c @@ -39,8 +39,8 @@ #ifdef EMU_QTX_API #include "wrapper.h" -static int report_func(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags); -static int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags); +int report_func(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags); +int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags); #endif //#undef TRACE @@ -519,8 +519,6 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags) printf ("wine/module: QuickTime.qts patched!!! old entry=%p\n",ptr[0]); #ifdef EMU_QTX_API - report_entry = report_func; - report_ret = report_func_ret; wrapper_target=ptr[0]; ptr[0]=wrapper; #endif @@ -683,7 +681,7 @@ static int dump_component(char* name,int type,void* _orig, ComponentParameters * static u_int32_t ret_array[4096]; static int ret_i=0; -static int report_func(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags) +int report_func(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags) { #ifdef DEBUG_QTX_API int i; @@ -882,7 +880,7 @@ static int report_func(void *stack_base, int stack_size, reg386_t *reg, u_int32_ return 0; } -static int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags) +int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags) { #ifdef DEBUG_QTX_API int i; @@ -997,8 +995,6 @@ FARPROC MODULE_GetProcAddress( // || !strcmp(function,"_CallComponent") ){ fprintf(stderr,"theQuickTimeDispatcher caught -> %p\n",retproc); - report_entry = report_func; - report_ret = report_func_ret; wrapper_target=(void *)retproc; retproc=(void *)wrapper; } diff --git a/src/libw32dll/wine/stubs.s b/src/libw32dll/wine/stubs.s index 6aa90ee9d..2c6270616 100644 --- a/src/libw32dll/wine/stubs.s +++ b/src/libw32dll/wine/stubs.s @@ -33,3 +33,6 @@ exp_EH_prolog: leal 12(%esp), %ebp pushl %eax ret + +.section .note.GNU-stack,"",@progbits + diff --git a/src/libw32dll/wine/wrapper.S b/src/libw32dll/wine/wrapper.S index fe2d85619..2e781787e 100644 --- a/src/libw32dll/wine/wrapper.S +++ b/src/libw32dll/wine/wrapper.S @@ -1,17 +1,19 @@ .section .data -.globl caller_return caller_return: .long 0 -.globl report_entry -report_entry: - .long null_call -.globl report_ret -report_ret: - .long null_call .global wrapper_target wrapper_target: .long null_call +#undef __i686 /* gcc define gets in our way */ + .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits +.globl __i686.get_pc_thunk.bx + .hidden __i686.get_pc_thunk.bx + .type __i686.get_pc_thunk.bx,@function +__i686.get_pc_thunk.bx: + movl (%esp), %ebx + ret + .section .text .globl null_call .type null_call, @function @@ -22,46 +24,60 @@ null_call: .type wrapper, @function .balign 16,0x90 wrapper: + pushl $0 pusha # store registers (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) pushf # store flags push %ebp # set up a stack frame movl %esp, %ebp + call __i686.get_pc_thunk.bx + addl $_GLOBAL_OFFSET_TABLE_, %ebx + leal 4(%ebp), %eax # push flags addr push %eax leal 8(%ebp), %eax # push registers addr push %eax - leal 40(%ebp), %edx + leal 44(%ebp), %edx movl (%ebp), %eax subl %edx, %eax push %eax push %edx - call *report_entry # report entry + call report_func@PLT # report entry test %eax, %eax jnz .Ldone + movl 44(%ebp), %eax # switch return addresses + movl %eax, caller_return@GOTOFF(%ebx) + leal .Lwrapper_return@GOTOFF(%ebx), %eax + movl %eax, 40(%ebp) + + movl wrapper_target@GOTOFF(%ebx), %eax + mov %eax, 40(%ebp) # wrapper_target should return at .Lwrapper_return + leave # restore %esp, %ebp popf # restore flags popa # restore registers - - popl caller_return # switch return addresses - pushl $.Lwrapper_return - - jmp *wrapper_target # wrapper_target should return at .Lwrapper_return + + ret # fake 'return' to wrapper_target actually .balign 16, 0x90 .Lwrapper_return: - pushl caller_return # restore the original return address + pushl $0 pusha # more for reference sake here pushf push %ebp # set up a stack frame movl %esp, %ebp + call __i686.get_pc_thunk.bx + addl $_GLOBAL_OFFSET_TABLE_, %ebx + movl caller_return@GOTOFF(%ebx), %eax + movl %eax, 40(%ebp) # restore the original return address + leal 4(%ebp), %eax # push flags addr push %eax leal 8(%ebp), %eax # push registers addr @@ -73,11 +89,13 @@ wrapper: push %eax push %edx - call *report_ret # report the return information (same args) + call report_func_ret@PLT# report the return information (same args) .Ldone: leave popf popa ret - + +.section .note.GNU-stack,"",@progbits + diff --git a/src/libw32dll/wine/wrapper.h b/src/libw32dll/wine/wrapper.h index a9943ce78..5e2cf804e 100644 --- a/src/libw32dll/wine/wrapper.h +++ b/src/libw32dll/wine/wrapper.h @@ -11,10 +11,6 @@ typedef struct { u_int32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; } reg386_t; -typedef int (*wrapper_func_t)(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags); - -extern wrapper_func_t report_entry, report_ret; - extern void (*wrapper_target)(void); extern int wrapper(void); |