用C语言在特定地址存储函数
我正在尝试将函数复制到特定地址,请帮助我们。FuncPtr是一种类型而不是变量,因此您应该这样做:用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)
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
希望能够帮助您。没有任何意义。不能将函数移动到特定地址。