int (*FuncPtr)(int,int) = NULL;
int add(int a, int b)
{
return a+b;
}
int temp;
int main (void)
{
add = 0x100;
FuncPtr = add;
temp = (*FuncPtr)(10,20);
}
我正在尝试将功能复制到特定地址,可以帮助我们。
答案 0 :(得分:3)
您无法像这样将某个功能复制到特定地址,但使用gcc的属性,您可以通过其他方式执行此操作。 首先,程序应该是这样的:
#include <stdio.h>
int (*FuncPtr)(int, int) __attribute__((unused, section(".myown"))) = NULL;
int add(int a, int b)
{
return a + b;
}
int temp;
int main (void)
{
//add = 0x100;
FuncPtr = add;
temp = (*FuncPtr)(10,20);
}
然后你必须得到ld脚本,在shell中执行这个cmd:
ld --verbose > f.lds
中间的内容“======================================== ==========“是脚本。 在“__bss_start =。;”
行之前添加它. = 0x90000000;
_myown_start = .;
.myown : { *(.myown) } = 0x90000000
_myown_end = .;
code_segment : { *(code_segment) }
地址0x90000000是您要将函数指针放入的位置,您可以尝试其他地址,但这可能不起作用。 最后,像这样编译你的程序:
gcc f.c -Wl,-Tf.lds
您可以使用objdump查看结果:
080483c2 <main>:
80483c2: 55 push %ebp
80483c3: 89 e5 mov %esp,%ebp
80483c5: 83 e4 f0 and $0xfffffff0,%esp
80483c8: 83 ec 10 sub $0x10,%esp
80483cb: c7 05 00 00 00 90 b4 movl $0x80483b4,0x90000000
80483d2: 83 04 08
80483d5: a1 00 00 00 90 **mov 0x90000000,%eax**
80483da: c7 44 24 04 14 00 00 movl $0x14,0x4(%esp)
80483e1: 00
80483e2: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
80483e9: ff d0 call *%eax
80483eb: a3 0c 00 00 90 mov %eax,0x9000000c
80483f0: c9 leave
80483f1: c3 ret
这是将一个函数指针放在一个部分中的例子,你可以使用add函数中的属性将整个函数放在如下的部分中:
int add(int a, int b) __attribute__((unused, section(".myown")));
int add(int a, int b)
{
return a + b;
}
希望能够帮助你。
答案 1 :(得分:0)
FuncPtr 是一个不是变量的类型,所以你应该这样做:
FuncPtr myFunc = add;
temp = (*myFunc)(1,1); //actually this is the same as myFunc(1,1)