免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 927 | 回复: 0
打印 上一主题 下一主题

U-Boot and GOT II - C code [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-06 11:15 |只看该作者 |倒序浏览

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.



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22020/showart_1110479.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP