Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言在特定地址存储函数_C_Embedded - Fatal编程技术网

用C语言在特定地址存储函数

用C语言在特定地址存储函数,c,embedded,C,Embedded,我正在尝试将函数复制到特定地址,请帮助我们。FuncPtr是一种类型而不是变量,因此您应该这样做: 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); } FuncPtr myFunc = add; temp = (*myFunc)(1,1)

我正在尝试将函数复制到特定地址,请帮助我们。

FuncPtr是一种类型而不是变量,因此您应该这样做:

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);
}
FuncPtr myFunc = add;
temp = (*myFunc)(1,1);   //actually this is the same as myFunc(1,1)
. = 0x90000000;
_myown_start = .;
  .myown           : { *(.myown) } = 0x90000000
  _myown_end = .;
  code_segment    : { *(code_segment) }
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    

您不能像这样简单地将函数复制到特定地址,但是使用gcc的属性,您可以用另一种方式来实现。 首先,程序应该是这样的:

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);
}
FuncPtr myFunc = add;
temp = (*myFunc)(1,1);   //actually this is the same as myFunc(1,1)
. = 0x90000000;
_myown_start = .;
  .myown           : { *(.myown) } = 0x90000000
  _myown_end = .;
  code_segment    : { *(code_segment) }
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    
<>中的内容为“脚本”。 在“uu bss_start=”行之前添加此项

地址0x90000000是要将函数指针放入的位置,您可以尝试其他地址,但这可能不起作用。 最后,按如下方式编译程序:

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);
}
FuncPtr myFunc = add;
temp = (*myFunc)(1,1);   //actually this is the same as myFunc(1,1)
. = 0x90000000;
_myown_start = .;
  .myown           : { *(.myown) } = 0x90000000
  _myown_end = .;
  code_segment    : { *(code_segment) }
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    
您可以使用objdump查看结果:

gcc f.c -Wl,-Tf.lds

希望能够帮助您。

没有任何意义。不能将函数移动到特定地址。