在C中的特定地址存储函数

时间:2013-12-04 05:38:47

标签: c embedded

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);
}

我正在尝试将功能复制到特定地址,可以帮助我们。

2 个答案:

答案 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)