代码重定位问题!!!

[复制链接]
 楼主| 乌月明星稀 发表于 2013-9-25 23:15 | 显示全部楼层 |阅读模式
本帖最后由 乌月明星稀 于 2013-9-25 23:17 编辑

#include "stdio.h"

void a()
{
        printf("This is test!\n");
}

char CodeArr[100];
void main()
{
    char temp;
    char *Pcopy=(char*)a;
    for(temp=0;temp<100;temp++)
    {
            CodeArr[temp]=Pcopy[temp];//代码拷贝
    }
    ((void(*)(void))CodeArr)();    //强制转换为void (*)(void)函数类型
}

我的想法是:将代码a拷贝到CodeArr中,然后用CodeArr强制转换为函数指针,执行到拷贝后的函数中去,但实际会导致整个main进程死掉。

求高手指点,如何用C编译可重定向代码。环境是Windows的C编译器
zhangmangui 发表于 2013-9-26 10:12 | 显示全部楼层
a()的大小不确定  那样拷贝可能会出问题
飞鹰嵌入式 发表于 2013-9-26 17:27 | 显示全部楼层
没玩过,希望高手过来指点一下
chess20052006 发表于 2013-9-26 17:32 | 显示全部楼层
这个做法也太山寨了,要解析符号表和回填地址的,还要编译器产生可重定位代码,地址不能填死了
aresc 发表于 2013-9-26 21:47 | 显示全部楼层
这个想法是可行的,但是你要注意函数的入口地址是按多少位来算的,像你这样按字节估计不行。
zhangmangui 发表于 2013-9-26 22:22 | 显示全部楼层
楼上各位建议很好
msblast 发表于 2013-9-27 00:17 | 显示全部楼层
建议先看ais文档
jackcms 发表于 2013-9-27 10:18 | 显示全部楼层
谢谢!
 楼主| 乌月明星稀 发表于 2013-9-27 14:17 | 显示全部楼层
zhangmangui 发表于 2013-9-26 10:12
a()的大小不确定  那样拷贝可能会出问题

但我至少100个字节已经可以确保我所要进入的那个函数已经完全拷贝咯。问题并不出在这里咯。
 楼主| 乌月明星稀 发表于 2013-9-27 14:26 | 显示全部楼层
chess20052006 发表于 2013-9-26 17:32
这个做法也太山寨了,要解析符号表和回填地址的,还要编译器产生可重定位代码,地址不能填死了 ...

……知识没有山寨这种说法,只有借鉴和使用。
你觉得我是在测试还是在把它当工程在用??
你说的是编译原理的东西?我个人不是很懂,如果可以,能否详实??
 楼主| 乌月明星稀 发表于 2013-9-27 14:29 | 显示全部楼层
aresc 发表于 2013-9-26 21:47
这个想法是可行的,但是你要注意函数的入口地址是按多少位来算的,像你这样按字节估计不行。 ...

No,我把它强制转成函数指针类型,那他一般函数时多少位,他就是多少位。
 楼主| 乌月明星稀 发表于 2013-9-27 14:31 | 显示全部楼层
zhangmangui 发表于 2013-9-26 10:12
a()的大小不确定  那样拷贝可能会出问题

应该知道ARM的boot引导程序吧,原理一样。但他是用汇编的。
ifft 发表于 2013-9-27 16:28 | 显示全部楼层
用vs2008编译无法通过的。
ifft 发表于 2013-9-27 16:49 | 显示全部楼层
嘿嘿。我找到了方法。实践证明100字节确实小了。我改成1000就OK了
aresc 发表于 2013-9-28 00:15 | 显示全部楼层
乌月明星稀 发表于 2013-9-27 14:29
No,我把它强制转成函数指针类型,那他一般函数时多少位,他就是多少位。 ...

假设函数a入口地址必须是16位的,你定义的char codeAddr[]是可以按字节分配,强制转换也是有问题的,能成功应该是其他巧合,比如可能你的char其实也是16位的等等。
easy_tm 发表于 2013-9-28 13:40 | 显示全部楼层
通常是给函数a()指定固定的地址,然后剩下的就简单了。。。
 楼主| 乌月明星稀 发表于 2013-9-28 15:22 | 显示全部楼层
ifft 发表于 2013-9-27 16:28
用vs2008编译无法通过的。

如果无法通过,则做以下调整:(*(void(*)(void))&Code[0])();
 楼主| 乌月明星稀 发表于 2013-9-28 15:27 | 显示全部楼层
aresc 发表于 2013-9-26 21:47
这个想法是可行的,但是你要注意函数的入口地址是按多少位来算的,像你这样按字节估计不行。 ...

貌似是地址赋值的时候出错,我用反汇编看了一下,a的地址为0x401080,但执行Pcopy后,Pcopy却等于0x401005;在这里出错,为什么!!!如果我直接将地址映射到0x401080那里开始拷贝代码,就能够完成运行。为什么会出现赋值时出问题?现在问题找出来了,新问题又出来了。
 楼主| 乌月明星稀 发表于 2013-9-28 15:28 | 显示全部楼层
ifft 发表于 2013-9-27 16:49
嘿嘿。我找到了方法。实践证明100字节确实小了。我改成1000就OK了

不会吧???你是怎么做到的???求代码贴出来
zhangmangui 发表于 2013-9-28 17:46 | 显示全部楼层
ifft 发表于 2013-9-27 16:49
嘿嘿。我找到了方法。实践证明100字节确实小了。我改成1000就OK了

看到就去实践的人   得真理也
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

127

帖子

2

粉丝
快速回复 返回顶部 返回列表