Chinaunix首页 | 论坛 | 博客
  • 博客访问: 211929
  • 博文数量: 30
  • 博客积分: 1308
  • 博客等级: 中尉
  • 技术积分: 279
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-20 22:12
文章分类

全部博文(30)

文章存档

2010年(1)

2008年(2)

2007年(8)

2006年(19)

分类: LINUX

2008-08-06 11:15:29

Code segment

bfc1f9d0 <do_version>:
bfc1f9d0:    3c1c0001     lui    gp,0x1
bfc1f9d4:    279c4b30     addiu    gp,gp,19248
bfc1f9d8:    0399e021     addu    gp,gp,t9
bfc1f9dc:    27bdffe0     addiu    sp,sp,-32
bfc1f9e0:    afbf0018     sw    ra,24(sp)
bfc1f9e4:    afbc0010     sw    gp,16(sp)
bfc1f9e8:    8f84000c     lw    a0,12(gp)
bfc1f9ec:    8f9905cc     lw    t9,1484(gp)
bfc1f9f0:    8f8505e8     lw    a1,1512(gp)
bfc1f9f4:    0320f809     jalr    t9
bfc1f9f8:    24841ae4     addiu    a0,a0,6884
bfc1f9fc:    8fbc0010     lw    gp,16(sp)
bfc1fa00:    8fbf0018     lw    ra,24(sp)
bfc1fa04:    00001021     move    v0,zero
bfc1fa08:    03e00008     jr    ra
bfc1fa0c:    27bd0020     addiu    sp,sp,32

bfc2b5d0 <version_string>:
……

bfc2024c <printf>:
bfc2024c:    3c1c0001     lui    gp,0x1
bfc20250:    279c42b4     addiu    gp,gp,17076
bfc20254:    0399e021     addu    gp,gp,t9
bfc20258:    27bdfec8     addiu    sp,sp,-312
bfc2025c:    afbf0130     sw    ra,304(sp)
bfc20260:    afbc0010     sw    gp,16(sp)
bfc20264:    8f9905c0     lw    t9,1472(gp)
bfc20268:    afa5013c     sw    a1,316(sp)
bfc2026c:    afa60140     sw    a2,320(sp)
bfc20270:    afa70144     sw    a3,324(sp)
bfc20274:    00802821     move    a1,a0
bfc20278:    27a6013c     addiu    a2,sp,316
bfc2027c:    0320f809     jalr    t9
bfc20280:    27a40018     addiu    a0,sp,24
bfc20284:    8fbc0010     lw    gp,16(sp)
bfc20288:    8f990498     lw    t9,1176(gp)
bfc2028c:    0320f809     jalr    t9
bfc20290:    27a40018     addiu    a0,sp,24
bfc20294:    8fbc0010     lw    gp,16(sp)
bfc20298:    8fbf0130     lw    ra,304(sp)
bfc2029c:    03e00008     jr    ra
bfc202a0:    27bd0138     addiu    sp,sp,312

 

void printf (const char *fmt, ...)
{
    va_list args;
    uint i;
    char printbuffer[CFG_PBSIZE];

    va_start (args, fmt);

    /* For this to work, printbuffer must be larger than
     * anything we ever want to print.
     */

    i = vsprintf (printbuffer, fmt, args);
    va_end (args);

    /* Print the string */
    puts (printbuffer);
}

int
do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    extern char version_string[];
    printf ("\n%s\n", version_string);
    return 0;
}

Analysis

When do_version invokes printf, the address of printf is saved into t9.

 

In printf:

 

bfc2024c:    3c1c0001     lui        gp,0x1

 

gp = 0x00010000

 

bfc20250: 279c42b4 addiu gp,gp,17076

 

gp = gp + 17076 = 0x00010000 + 0x42b4 = 0x000142b4

 

bfc20254: 0399e021 addu gp,gp,t9

 

When in flash

gp = gp + t9 = 0x000142b4 + bfc2024c = 0xbfc34500

When in ram

gp = gp + t9 = 0x000142b4 + 80c2024c = 0x80c34500

 

Thus, we get the GOT pointer.

 

阅读(2414) | 评论(0) | 转发(0) |
0

上一篇:U-Boot and GOT I - assemble code

下一篇:没有了

给主人留下些什么吧!~~