summaryrefslogtreecommitdiff
path: root/src/libw32dll
diff options
context:
space:
mode:
authorDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2006-12-21 09:54:44 +0000
committerDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2006-12-21 09:54:44 +0000
commit4d3ead5b20de46118087552ea6db715720f8374e (patch)
treed5de284f50c55bb0062b0ebd242dc23af89a758b /src/libw32dll
parent67534e2d8ca6a618952adcfa7dfc6d02deb49693 (diff)
downloadxine-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.am6
-rw-r--r--src/libw32dll/wine/module.c12
-rw-r--r--src/libw32dll/wine/stubs.s3
-rw-r--r--src/libw32dll/wine/wrapper.S52
-rw-r--r--src/libw32dll/wine/wrapper.h4
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);