打印

位置无关(PID)代码反汇编后出现绝对地址怎么回事???

[复制链接]
4395|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chyl411|  楼主 | 2012-1-31 18:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个简单的位置无关代码的测试程序,包含两个C文件,source如下:
文件一:test.c

int aaa = 0x2b2b2b;
//const char bbb = '2';

extern int useless_fun();
void entry_pt()
{

aaa = 0xacacac;

aaa = useless_fun();
//
bbb++;
}


文件夹二:test1.c
int var_c = 0x1010101;

int useless_fun()
{

int bbb = var_c;

bbb++;

bbb--;

return bbb;
}
然后分别编译两个文件,用如下指令:
armcc -c -O1 -g- -apcs /rwpi/ropi -cpu ARM7EJ-S test1.c
armcc -c -O1 -g- -apcs /rwpi/ropi -cpu ARM7EJ-S test.c
链接用:
armlink -info totals -rwpi -ropi -nodebug test.o test1.o
生成的axf映象文件打开之后部分汇编代码如下:
entry_pt        [0xe92d4010]   stmfd    r13!,{r4,r14}
00008004        [0xe59f4018]   ldr      r4,0x00008024 ; = #0x00000004
00008008        [0xe59f0010]   ldr      r0,0x00008020 ; = #0x00acacac
0000800c        [0xe0844009]   add      r4,r4,r9
00008010        [0xe5840000]   str      r0,[r4,#0]
00008014        [0xeb000003]   bl       useless_fun
00008018        [0xe5840000]   str      r0,[r4,#0]
0000801c        [0xe8bd8010]   ldmfd    r13!,{r4,pc}
00008020        [0x00acacac]   dcd      0x00acacac  ....
00008024        [0x00000004]   dcd      0x00000004  ....
useless_fun        [0xe59f0010]   ldr      r0,0x00008040 ; = #0x00000008
0000802c        [0xe0800009]   add      r0,r0,r9
00008030        [0xe5900000]   ldr      r0,[r0,#0]
00008034        [0xe2800001]   add      r0,r0,#1
00008038        [0xe2400001]   sub      r0,r0,#1
0000803c        [0xe12fff1e]   bx       r14

请问如果是位置无关的代码怎么会出现0x00008024这种绝对地址呢?动态加载的时候这些绝对地址是怎么变成实际的物理地址呢?
00008004        [0xe59f4018]   ldr      r4,0x00008024 ; = #0x00000004
00008008        [0xe59f0010]   ldr      r0,0x00008020 ; = #0x00acacac

排版有点乱,不知道说明白没

相关帖子

沙发
xinzha| | 2012-2-1 00:19 | 只看该作者
从机器码上看是位置无关的,反汇编程序不是很严谨,实际上应该是
ldr r4, 0x18[pc]
ldr r0, 0x10[pc]
我的汇编码格式可能不对,没对照标准文档,不过大概意思就是这样,将当前pc偏移0x10和0x18的地址的内容赋给r0和r4,注意,两条指令的pc是不一样的,而且pc是当前指令地址加8.

使用特权

评论回复
板凳
chyl411|  楼主 | 2012-2-1 10:41 | 只看该作者
用axd和fromelf看的结果都是一样的绝对地址

使用特权

评论回复
地板
xinzha| | 2012-2-1 15:52 | 只看该作者
反汇编程序图省事没有把最精确的结果展示出来,你自己对照机器码就知道了。

使用特权

评论回复
5
senioryzc| | 2012-2-1 17:27 | 只看该作者
ropi只是read only无关,比如code
那2个变量是rw的,并不是无关的,对应的选项是rwpi,
程序实际运行的时候,好像依赖于r9

另外选项relloc可以把所有需要重定位的rw信息提取出来

使用特权

评论回复
6
xinzha| | 2012-2-1 20:18 | 只看该作者
这是arm使用立即数的一种方式,因为arm桶形移位器以及类risc架构的限制,有些立即数赋值不能够在一条指令内来表达,后来立即数赋值多数会采用这种把立即数放在紧挨函数的内存中,然后用ldr把立即数load给寄存器。

使用特权

评论回复
7
chyl411|  楼主 | 2012-2-2 13:51 | 只看该作者
4# xinzha
确实是反汇编的问题,用IDA打开就不是那种绝对地址的汇编了
LDR R4, =4
LDR R0, =0XACACAC
这样的了,而且ida里面看到的是在6楼说的把立即数存放在紧挨函数的内存中。我想问下怎么才能看到机器码对应的ARM指令码。
LDR R4, =4 这行对应的机器码是
18 40 9F E5

谢谢你的回答

使用特权

评论回复
8
xinzha| | 2012-2-2 15:12 | 只看该作者
指令集简单是risc架构的优势之一,一般讲arm的书里面会介绍指令集,0xe59f4018,这个32位的指令,分成了几个指令域,都有他们的固定位置和含义,查一下参考书就行了,或者去arm的官方网站找文档。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝