?? x86-testapp.c
字號:
#include <stddef.h>#include <stdio.h>#include <string.h>void *func[8], **pfunc;typedef struct xxx xxx_t;struct xxx { int dummy; void **pfunc;} q;#define XF_strcpy 3#define XF_printf 4#define LABEL(x) \asm volatile ( \#if defined(__i386__)#define EXPORT_FUNC(x) \asm volatile ( \" .globl mon_" #x "\n" \"mon_" #x ":\n" \" movl %0, %%eax\n" \" movl pfunc, %%ecx\n" \" jmp *(%%ecx,%%eax)\n" \ : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");#elif defined(__powerpc__)#define EXPORT_FUNC(x) \asm volatile ( \" .globl mon_" #x "\n" \"mon_" #x ":\n" \" lwz %%r11, %0(%%r29)\n" \" lwz %%r11, %1(%%r11)\n" \" mtctr %%r11\n" \" bctr\n" \ : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r29");#elif defined(__arm__)#define EXPORT_FUNC(x) \asm volatile ( \" .globl mon_" #x "\n" \"mon_" #x ":\n" \" ldr ip, [r8, %0]\n" \" ldr pc, [ip, %1]\n" \ : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "ip");#elif defined(__mips__)#define EXPORT_FUNC(x) \asm volatile ( \" .globl mon_" #x "\n" \"mon_" #x ":\n" \" lw $25, %0($26)\n" \" lw $25, %1($25)\n" \" jr $25\n" \ : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "t9");#else#error [No stub code for this arch]#endifvoid dummy(void){EXPORT_FUNC(printf)EXPORT_FUNC(strcpy)}int main(void){#if defined(__i386__) xxx_t *pq;#elif defined(__powerpc__) register volatile xxx_t *pq asm("r29");#elif defined(__arm__) register volatile xxx_t *pq asm("r8");#elif defined(__mips__) register volatile xxx_t *pq asm("k0");#endif char buf[32]; func[XF_strcpy] = strcpy; func[XF_printf] = printf; pq = &q; pq->pfunc = pfunc = func; mon_strcpy(buf, "test"); mon_printf("hi %s %d z\n", buf, 444); return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -