diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-12-03 19:49:39 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-12-03 19:49:39 +0000 |
commit | 80439005c72d6f48fb4eb9753b37fe0288914576 (patch) | |
tree | 972b78d14d39cbc5d3d44332202817a164254b83 /loader | |
parent | 92256c07d1383814a69dcc6f8cfe55437a371b34 (diff) | |
download | mpv-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.c | 19 |
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; } |