【总结】【变量】变量的存储域

6 views
Skip to first unread message
Message has been deleted
Message has been deleted

常高伟

unread,
Mar 2, 2010, 1:47:02 PM3/2/10
to DS计划——C深入学习项目
原先发布的那篇文章图片无法显示。由于Google Group发布图片相当麻烦,所以我先发布在了我的博客中:
http://blog.csdn.net/chgaowei/archive/2010/03/03/5340796.aspx

欢迎大家讨论。

Hidinck Cui

unread,
Mar 2, 2010, 9:02:40 PM3/2/10
to ds-c-i...@googlegroups.com
支持老大!

在 10-3-3,常高伟<chga...@gmail.com> 写道:

lin_style(欧贼欧贼)

unread,
Mar 3, 2010, 9:51:31 AM3/3/10
to ds-c-i...@googlegroups.com
http://topic.csdn.net/u/20100303/22/9dc01e67-c580-448b-b0aa-545e042a8345.html?52606

我个人觉得应该改改这种DS的学习领导方法。

L L-In

unread,
Mar 6, 2010, 9:11:02 AM3/6/10
to ds-c-i...@googlegroups.com
 支持,学习了

Jiantao Wu

unread,
Mar 8, 2010, 11:48:34 AM3/8/10
to ds-c-i...@googlegroups.com
目前正在上Unix 系统的编程课程,其中教授提到了一种可以查看变量储存域的工具,objdump.

基本的用法, objdump -x [filename]. 这里的输入文件可以是目标文件(.o)或者是可执行文件,也可以是静态库文件(.a)。 其他用法可以自己查看objdump的说明(man objdump)。

这个程序可以列出目标文件(*.o)或者可执行文件的各个储存域地址,大小,对齐方式等等各种信息。 而且可以列出变量和函数所在储存域的名称,所占内存大小等等,十分方便。

objdump 是 GNU Binutils 的一部分,binutils 还提供了其他工具和对可执行文件操作的API,详细信息参见 http://www.gnu.org/software/binutils/

常高伟

unread,
Mar 9, 2010, 12:41:19 PM3/9/10
to ds-c-i...@googlegroups.com
没有用过,听介绍不错。有时间试试

楊春雷

unread,
Mar 9, 2010, 7:46:36 PM3/9/10
to ds-c-i...@googlegroups.com

就是类似于反汇编器的命令
把你的目标代码生成一种类似于汇编代码的格式
假设代码文件code.c:
Int accum = 0;
Int sum(int x, int y)
{
Int t = x + y;
accum += t;
return t;
}
编译上面的code.c
unix>gcc -O2 -c code.c
这样就会产生目标代码文件 code.o,它是二进制格式的,所以无法直接读。
但通过下面的命令:可以生成汇编代码和对应的Byte和Offset.
Unix> objdump -d code.o
00000000 <sum>:
Offset Bytes Equivalent assembly language
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 0c mov 0xc(%ebp),%eax
6: 8b 55 08 mov 0x8(%ebp),%edx
9: 5d pop %ebp
a: 01 d0 add %edx,%eax
c: 01 05 00 00 00 00 add %eax,0x0
12: c3 ret
上面的offset是相对地址。如果你再写个main函数 然后生成可执行文件后,再用上面
的反汇编命令后 Offset就变成程序在内存中世纪的物理内存地址了。。。。。。。

常高伟

unread,
Mar 10, 2010, 4:57:10 AM3/10/10
to ds-c-i...@googlegroups.com
不错,第一次知道这样弄!
另外,objdump应该是获取的目标文件的存储地址,而不是程序运行期加载的地址把?

faked faked

unread,
Mar 11, 2010, 12:58:56 AM3/11/10
to ds-c-i...@googlegroups.com
还要考虑到你编译的时候加了哪些Debug参数,有没有带符号表。
建议慎重使用-O这种参数。
另外,offset变成内存中实际的物理内存地址这种说法是不对的.

2010/3/10 楊春雷 <yan...@dhc.cn>:

--
- Faked

楊春雷

unread,
Mar 11, 2010, 3:44:48 AM3/11/10
to ds-c-i...@googlegroups.com
刚学C语言 很多东西都没特别理解
能说说内存地址的事情吗
我上网搜了搜 还是没太明白 呵呵

楊春雷

unread,
Mar 11, 2010, 3:44:48 AM3/11/10
to ds-c-i...@googlegroups.com
我是菜鸟哈
对内存地址这始终没弄明白
请教一下: 目标文件的存储地址是指什么意思..
我编译,链接完生成可执行文件后,这个时候是什么地址
如果我运行这个可执行文件,这个时候是在内存中的实际地址吗

常高伟

unread,
Mar 11, 2010, 5:05:41 AM3/11/10
to ds-c-i...@googlegroups.com
编译后的可移植性程序时放在硬盘上的,而不是内存。
只有在执行的时候,才会加载到内存中。

一般,可执行程序的结构,和程序运行时的内存的结构有一定的对应关系。我的那篇文章里面有个图,描述的是可执行程序和运行时的内存映射关系。

详细的资料,可以看看C专家编程。

不知道对不对,欢迎讨论。

faked faked

unread,
Mar 12, 2010, 5:30:12 AM3/12/10
to ds-c-i...@googlegroups.com
要弄清这个问题要有一点点操作系统,进程,进程加载的相关概念,还要有一点虚存的概念。
说白了就是理解:*.c纯文本文件->*.exe/*.elf可执行文件->执行的整套过程.

对于加载执行,可看看http://en.wikipedia.org/wiki/Loader_(computing)
然后再往下发展看elf/pe文件格式,fork()实现,linker.

2010/3/11 楊春雷 <yan...@dhc.cn>:

--
- Faked

Reply all
Reply to author
Forward
0 new messages