- 论坛徽章:
- 0
|
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 |
|