|
发表于 2004-10-20 11:23:20
|
显示全部楼层
多谢。请问哪里有 objdump 生成的信息的说明呀?我装了 binutils-doc 发现读到的信息同执行 man 得到的结果一样没有说明。
还有关于堆栈的问题。今天我又试了另外一个程序 (修改它使其只包含必要信息需要更多的时间,所以我没修改,抱歉):- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <errno.h>
- #include <ctype.h>
- static int val1;
- static char val2;
- [color=red]static char val3;
- static int val4;[/color]
- void dumpaddr(FILE *fp, char *desc, void *addr);
- void mkprnt(char *buf);
- int main(int argc, char *argv[], char *envp[])
- {
- FILE *p;
- int i;
- if ((p = popen("sort -n -k3 | "
- "gawk '{ printf "%-32s %s\\n", $1, $2 }'", "w"))
- == NULL) {
- fprintf(stderr, "%s: cannot open pipe in dump(): %s\n",
- argv[0], strerror(errno));
- exit(-2);
- }
- for (i = 0; argv[i]; i++) {
- char buf[32];
- strcpy(buf, "arg:");
- strncpy(buf+4, argv[i], sizeof(buf)-6);
- buf[sizeof(buf) - 1] = '\0';
- mkprnt(buf);
- dumpaddr(p, buf, argv[i]);
- }
- for (i = 0; envp[i]; i++) {
- char buf[32];
- buf[0] = '&';
- strncpy(buf+1, envp[i], sizeof(buf)-2);
- buf[sizeof(buf) - 1] = '\0';
- mkprnt(buf);
- dumpaddr(p, buf, envp[i]);
- }
- dumpaddr(p, "main", main);
- dumpaddr(p, "stderr", stderr);
- dumpaddr(p, "stdout", stdout);
- char str_val1[]="24\n";
- char str_val2[]="32\n";
- char str_val3[]="48\n";
- [color=red] char str_val4[]="80\n";[/color]
- int mval1;
- char mval2;
- [color=red] char mval3;
- int mval4;[/color]
- dumpaddr(p, "str_val1", str_val1);
- dumpaddr(p, "str_val2", str_val2);
- dumpaddr(p, "str_val3", str_val3);
- [color=red] dumpaddr(p, "str_val4", str_val4);[/color]
- dumpaddr(p, "val1", &val1);
- dumpaddr(p, "val2", &val2);
- dumpaddr(p, "val3", &val3);
- [color=red] dumpaddr(p, "val4", &val4);[/color]
- dumpaddr(p, "i", &i);
- dumpaddr(p, "p", &p);
- dumpaddr(p, "mval1", &mval1);
- dumpaddr(p, "mval2", &mval2);
- dumpaddr(p, "mval3", &mval3);
- [color=red] dumpaddr(p, "mval4", &mval4);[/color]
- pclose(p);
- return 0;
- }
- /* dumpaddr: write messege desc and addr into stream p */
- void dumpaddr(FILE *fp, char *desc, void *addr)
- {
- fprintf(fp, "%-32s 0x%08X\t%-32lu\n",
- desc, (long) addr, (unsigned long) addr);
- }
- /* mkprnt: make buf printable */
- void mkprnt(char *buf)
- {
- while (*buf)
- if (!isprint(*buf++))
- *buf = '@';
- }
复制代码
同昨天的程序相比只有红色的部分是不同的。这个程序生成的主要结果是这样的:- main 0x080485C4
- val1 0x08049D28
- val2 0x08049D2C
- val3 0x08049D2D
- val4 0x08049D30
- stdout 0x40150F80
- stderr 0x401510E0
- [color=blue]mval4 0xBFFFF8D4
- mval3 0xBFFFF8DA
- mval2 0xBFFFF8DB
- mval1 0xBFFFF8DC[/color]
- str_val4 0xBFFFF8E0
- str_val3 0xBFFFF8E4
- str_val2 0xBFFFF8E8
- str_val1 0xBFFFF8EC
- i 0xBFFFF918
- p 0xBFFFF91C
- arg:./y 0xBFFFFA8E
- &KDE_MULTIHEAD=false 0xBFFFFA92
- &TERM=xterm 0xBFFFFAA6
- &SHELL=/bin/bash 0xBFFFFAB1
- &XDM_MANAGED=/var/run/xdmctl/xd 0xBFFFFAC1
- >K2_RC_FILES=/etc/gtk-2.0/gtk 0xBFFFFB08
- >K_RC_FILES=/etc/gtk/gtkrc:/h 0xBFFFFB68
- &GS_LIB=/home/herbert/.fonts 0xBFFFFBBF
- &WINDOWID=35651589 0xBFFFFBDB
- &KDE_FULL_SESSION=true 0xBFFFFBED
- &USER=herbert 0xBFFFFC03
- &LS_COLORS=no=00:fi=00:di=01;34 0xBFFFFC10
- &LD_LIBRARY_PATH=/usr/lib/wine 0xBFFFFE45
- &XCURSOR_SIZE= 0xBFFFFE63
- &SESSION_MANAGER=local/natsu:/t 0xBFFFFE71
- &XPSERVERLIST=:64 0xBFFFFEA1
- &KONSOLE_DCOP=DCOPRef(konsole-1 0xBFFFFEB3
- &DESKTOP_SESSION=default 0xBFFFFEDE
- &PATH=/usr/local/bin:/usr/bin:/ 0xBFFFFEF6
- &KONSOLE_DCOP_SESSION=DCOPRef(k 0xBFFFFF32
- &PWD=/home/herbert 0xBFFFFF67
- &XMODIFIERS=@im=fcitx 0xBFFFFF79
- &LANG=zh_CN 0xBFFFFF8E
- &SHLVL=2 0xBFFFFF99
- &HOME=/home/herbert 0xBFFFFFA1
- &XCURSOR_THEME=default 0xBFFFFFB4
- &LOGNAME=herbert 0xBFFFFFCA
- &DISPLAY=:0.0 0xBFFFFFDA
- &COLORTERM= 0xBFFFFFE7
- &_=./y 0xBFFFFFF2
复制代码
为了方便我把昨天的程序的执行结果也放在这里:- main 0x080485C4
- val1 0x08049C50
- val2 0x08049C54
- val3 0x08049C58
- stdout 0x40150F80
- stderr 0x401510E0
- [color=blue]mval3 0xBFFFF8D8
- mval2 0xBFFFF8DF
- mval1 0xBFFFF8E0[/color]
- str_val3 0xBFFFF8E4
- str_val2 0xBFFFF8E8
- str_val1 0xBFFFF8EC
- i 0xBFFFF918
- p 0xBFFFF91C
- arg:./y 0xBFFFFA87
- arg:abcdef 0xBFFFFA8B
- &KDE_MULTIHEAD=false 0xBFFFFA92
- &TERM=xterm 0xBFFFFAA6
- &SHELL=/bin/bash 0xBFFFFAB1
- &XDM_MANAGED=/var/run/xdmctl/xd 0xBFFFFAC1
- >K2_RC_FILES=/etc/gtk-2.0/gtk 0xBFFFFB08
- >K_RC_FILES=/etc/gtk/gtkrc:/h 0xBFFFFB68
- &GS_LIB=/home/herbert/.fonts 0xBFFFFBBF
- &WINDOWID=48234501 0xBFFFFBDB
- &KDE_FULL_SESSION=true 0xBFFFFBED
- &USER=herbert 0xBFFFFC03
- &LS_COLORS=no=00:fi=00:di=01;34 0xBFFFFC10
- &LD_LIBRARY_PATH=/usr/lib/wine 0xBFFFFE45
- &XCURSOR_SIZE= 0xBFFFFE63
- &SESSION_MANAGER=local/natsu:/t 0xBFFFFE71
- &XPSERVERLIST=:64 0xBFFFFEA1
- &KONSOLE_DCOP=DCOPRef(konsole-3 0xBFFFFEB3
- &DESKTOP_SESSION=default 0xBFFFFEDE
- &PATH=/usr/local/bin:/usr/bin:/ 0xBFFFFEF6
- &KONSOLE_DCOP_SESSION=DCOPRef(k 0xBFFFFF32
- &PWD=/home/herbert 0xBFFFFF67
- &XMODIFIERS=@im=fcitx 0xBFFFFF79
- &LANG=zh_CN 0xBFFFFF8E
- &SHLVL=2 0xBFFFFF99
- &HOME=/home/herbert 0xBFFFFFA1
- &XCURSOR_THEME=default 0xBFFFFFB4
- &LOGNAME=herbert 0xBFFFFFCA
- &DISPLAY=:0.0 0xBFFFFFDA
- &COLORTERM= 0xBFFFFFE7
- &_=./y 0xBFFFFFF2
复制代码
请注意两个结果的蓝色部分。我搞不懂这些地址。请问这是怎么回事儿?另外,从结果上看如果出现了两个 char 类型的静态变量,它们不会都在 4 字节边界上对齐了。 |
|