mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-20 23:30:54 +00:00
Add some basic mingw support.
Patch by Ruben Van Boxem! llvm-svn: 148048
This commit is contained in:
parent
b1ca881191
commit
48cfd55c5d
@ -80,6 +80,13 @@
|
||||
|
||||
#endif /* GNU/Linux */
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
#define _YUGA_LITTLE_ENDIAN 1
|
||||
#define _YUGA_BIG_ENDIAN 0
|
||||
|
||||
#endif /* Windows */
|
||||
|
||||
/* . */
|
||||
|
||||
#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
|
||||
|
@ -11,11 +11,20 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
void __clear_cache(void* start, void* end)
|
||||
{
|
||||
if (!FlushInstructionCache(GetCurrentProcess(), start, end-start))
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
||||
|
||||
extern void __clear_cache(void* start, void* end);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
typedef int (*pfunc)(void);
|
||||
|
||||
@ -38,21 +47,29 @@ int main()
|
||||
// make executable the page containing execution_buffer
|
||||
char* start = (char*)((uintptr_t)execution_buffer & (-4095));
|
||||
char* end = (char*)((uintptr_t)(&execution_buffer[128+4096]) & (-4095));
|
||||
if ( mprotect(start, end-start, PROT_READ|PROT_WRITE|PROT_EXEC) != 0 )
|
||||
#if defined(_WIN32)
|
||||
DWORD dummy_oldProt;
|
||||
MEMORY_BASIC_INFORMATION b;
|
||||
if (!VirtualQuery(start, &b, sizeof(b)))
|
||||
return 1;
|
||||
if (!VirtualProtect(b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, &b.Protect))
|
||||
#else
|
||||
if (mprotect(start, end-start, PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
|
||||
#endif
|
||||
return 1;
|
||||
|
||||
// verify you can copy and execute a function
|
||||
memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128);
|
||||
__clear_cache(execution_buffer, &execution_buffer[128]);
|
||||
pfunc f1 = (pfunc)(uintptr_t)execution_buffer;
|
||||
if ( (*f1)() != 1 )
|
||||
if ((*f1)() != 1)
|
||||
return 1;
|
||||
|
||||
// verify you can overwrite a function with another
|
||||
memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128);
|
||||
__clear_cache(execution_buffer, &execution_buffer[128]);
|
||||
pfunc f2 = (pfunc)(uintptr_t)execution_buffer;
|
||||
if ( (*f2)() != 2 )
|
||||
if ((*f2)() != 2)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
@ -11,12 +11,27 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
void __clear_cache(void* start, void* end)
|
||||
{
|
||||
if (!FlushInstructionCache(GetCurrentProcess(), start, end-start))
|
||||
exit(1);
|
||||
}
|
||||
void __enable_execute_stack(void *addr)
|
||||
{
|
||||
MEMORY_BASIC_INFORMATION b;
|
||||
|
||||
if (!VirtualQuery(addr, &b, sizeof(b)))
|
||||
exit(1);
|
||||
if (!VirtualProtect(b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, &b.Protect))
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
||||
|
||||
extern void __clear_cache(void* start, void* end);
|
||||
extern void __enable_execute_stack(void* addr);
|
||||
#endif
|
||||
|
||||
typedef int (*pfunc)(void);
|
||||
|
||||
@ -43,14 +58,14 @@ int main()
|
||||
memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128);
|
||||
__clear_cache(execution_buffer, &execution_buffer[128]);
|
||||
pfunc f1 = (pfunc)(uintptr_t)execution_buffer;
|
||||
if ( (*f1)() != 1 )
|
||||
if ((*f1)() != 1)
|
||||
return 1;
|
||||
|
||||
// verify you can overwrite a function with another
|
||||
memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128);
|
||||
__clear_cache(execution_buffer, &execution_buffer[128]);
|
||||
pfunc f2 = (pfunc)(uintptr_t)execution_buffer;
|
||||
if ( (*f2)() != 2 )
|
||||
if ((*f2)() != 2)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user