summaryrefslogtreecommitdiffstats
path: root/loader
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-03 19:49:39 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-03 19:49:39 +0000
commit80439005c72d6f48fb4eb9753b37fe0288914576 (patch)
tree972b78d14d39cbc5d3d44332202817a164254b83 /loader
parent92256c07d1383814a69dcc6f8cfe55437a371b34 (diff)
downloadmpv-80439005c72d6f48fb4eb9753b37fe0288914576.tar.bz2
mpv-80439005c72d6f48fb4eb9753b37fe0288914576.tar.xz
Fix 21381, make sure gcc does not make any ip-relative calls or similar.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@21477 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader')
-rw-r--r--loader/win32.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/loader/win32.c b/loader/win32.c
index 40059ab846..60b35d724f 100644
--- a/loader/win32.c
+++ b/loader/win32.c
@@ -5291,7 +5291,9 @@ struct libs libraries[]={
static void ext_stubs(void)
{
volatile int idx = 0xdeadabcd;
- printf("Called unk_%s\n", export_names[idx]);
+ // make sure gcc does not do eip-relative call or something like that
+ volatile void (*my_printf)(char *, char *) = (void *)0xdeadfbcd;
+ my_printf("Called unk_%s\n", export_names[idx]);
}
#define MAX_STUB_SIZE 0x60
@@ -5302,6 +5304,7 @@ static char extcode[MAX_NUM_STUBS * MAX_STUB_SIZE];
static void* add_stub(void)
{
int i;
+ int found = 0;
// generated code in runtime!
char* answ = extcode + pos * MAX_STUB_SIZE;
if (pos >= MAX_NUM_STUBS) {
@@ -5310,14 +5313,20 @@ static void* add_stub(void)
}
memcpy(answ, ext_stubs, MAX_STUB_SIZE);
for (i = 0; i < MAX_STUB_SIZE - 3; i++) {
- if (*(int*)(answ + i) == 0xdeadabcd)
- break;
+ int *magic = (int *)(answ + i);
+ if (*magic == 0xdeadabcd) {
+ *magic = pos;
+ found |= 1;
+ }
+ if (*magic == 0xdeadfbcd) {
+ *magic = (intptr_t)printf;
+ found |= 2;
+ }
}
- if (*(int*)(answ + i) != 0xdeadabcd) {
+ if (found != 3) {
printf("magic code not found in ext_subs, expect crash\n");
return NULL;
}
- *(int*)(answ + i) = pos;
pos++;
return (void*)answ;
}