调试代码
Debugging the Code
大家好,我开始调试代码的航程了,运行按照书上的命令进行下面的源码分析
// hello_world-1.c
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
gcc -Wall -Wextra -c hello_world-1.c // What is wall and wextra here
?
$ size hello_world-1 hello_world-1.o
text data bss dec hex filename
916 256 4 1176 498 hello_world-1
48 0 0 48 30 hello_world-1.o
$ objdump -h hello_world-1.o
hello_world-1.o: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000023 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000058 2**2
ALLOC
3 .rodata 0000000d 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .note.GNU-stack 00000000 00000000 00000000 00000065 2**0
CONTENTS, READONLY
5 .comment 0000001b 00000000 00000000 00000065 2**0
CONTENTS, READONLY
48 0 0 48 30 hello_world-1.o
我有一些问题
1) hello_world-1.c中没有全局变量。那么为什么大小报告目标文件的数据和 bss 段长度为零,而可执行文件的长度为非零?
2) 为什么 size 和 objdump 报告文本段的大小不同?
关于您的问题:
"gcc -Wall -Wextra -c hello_world-1.c // What is wall and wextra here ?"
(注意大写)
-Wall 告诉编译器启用大多数警告
-Wextra 告诉编译器启用更多警告
-c 告诉编译器只编译,而不是 link.
因为没有包含 '-o objfilename.o' 参数,
编译器将输出一个与输入文件同名的目标文件,扩展名为“.o”。
建议始终明确包含“-o objfilename.o”参数
建议对此类内容进行一些在线谷歌搜索,您会在其中找到类似于以下内容的页面:
目标文件由 .text(即二进制 CPU 指令)、.rodata(只读数据 - "hello world"[=15=] - 总共 13 个字节)和 .comment(附加链接信息)。
可执行文件由相同的减去 .comment 加上标准库内容加上导入动态库数据(如果有的话)组成。
标准库至少添加了启动代码,这使得可执行文件更大。所以你的区别是:executable .text = .object text + startup code + stdlibrary code (if static linking).
这是 'size'
的手册页副本
SIZE(1) GNU 开发工具 SIZE(1)
姓名
大小 - 列出部分大小和总大小。
概要
大小 [-A|-B|--格式=兼容性]
[ - 帮助]
[-d|-o|-x|--radix=数字]
[ - 常见的]
[-t|--总计]
[--target=bfdname] [-V|--version]
[目标文件...]
说明
GNU 大小实用程序列出了部分大小---和总大小---
其参数列表中的每个对象或存档文件 objfile。经过
默认情况下,为每个目标文件或每个生成一行输出
存档中的模块。
objfile... are the object files to be examined. If none are specified,
the file "a.out" will be used.
选项
命令行选项含义如下:
-A
-B
--format=compatibility
Using one of these options, you can choose whether the output from
GNU size resembles output from System V size (using -A, or
--format=sysv), or Berkeley size (using -B, or --format=berkeley).
The default is the one-line format similar to Berkeley's.
Here is an example of the Berkeley (default) format of output from
size:
$ size --format=Berkeley ranlib size
text data bss dec hex filename
294880 81920 11592 388392 5ed28 ranlib
294880 81920 11888 388688 5ee50 size
This is the same data, but displayed closer to System V
conventions:
$ size --format=SysV ranlib size
ranlib :
section size addr
.text 294880 8192
.data 81920 303104
.bss 11592 385024
Total 388392
size :
section size addr
.text 294880 8192
.data 81920 303104
.bss 11888 385024
Total 388688
--help
Show a summary of acceptable arguments and options.
-d
-o
-x
--radix=number
Using one of these options, you can control whether the size of
each section is given in decimal (-d, or --radix=10); octal (-o, or
--radix=8); or hexadecimal (-x, or --radix=16). In --radix=number,
only the three values (8, 10, 16) are supported. The total size is
always given in two radices; decimal and hexadecimal for -d or -x
output, or octal and hexadecimal if you're using -o.
--common
Print total size of common symbols in each file. When using
Berkeley format these are included in the bss size.
-t
--totals
Show totals of all objects listed (Berkeley format listing mode
only).
--target=bfdname
Specify that the object-code format for objfile is bfdname. This
option may not be necessary; size can automatically recognize many
formats.
-V
--version
Display the version number of size.
@file
Read command-line options from file. The options read are inserted
in place of the original @file option. If file does not exist, or
cannot be read, then the option will be treated literally, and not
removed.
Options in file are separated by whitespace. A whitespace
character may be included in an option by surrounding the entire
option in either single or double quotes. Any character (including
a backslash) may be included by prefixing the character to be
included with a backslash. The file may itself contain additional
@file options; any such options will be processed recursively.
另见
ar(1)、objdump(1)、readelf(1) 和 binutils 的信息条目。
版权所有
版权所有 (c) 1991-2013 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
Free Documentation License".
binutils-2.23.91 2013-11-18 大小(1)
大家好,我开始调试代码的航程了,运行按照书上的命令进行下面的源码分析
// hello_world-1.c
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
gcc -Wall -Wextra -c hello_world-1.c // What is wall and wextra here
?
$ size hello_world-1 hello_world-1.o
text data bss dec hex filename
916 256 4 1176 498 hello_world-1
48 0 0 48 30 hello_world-1.o
$ objdump -h hello_world-1.o
hello_world-1.o: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000023 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000058 2**2
ALLOC
3 .rodata 0000000d 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .note.GNU-stack 00000000 00000000 00000000 00000065 2**0
CONTENTS, READONLY
5 .comment 0000001b 00000000 00000000 00000065 2**0
CONTENTS, READONLY
48 0 0 48 30 hello_world-1.o
我有一些问题
1) hello_world-1.c中没有全局变量。那么为什么大小报告目标文件的数据和 bss 段长度为零,而可执行文件的长度为非零?
2) 为什么 size 和 objdump 报告文本段的大小不同?
关于您的问题:
"gcc -Wall -Wextra -c hello_world-1.c // What is wall and wextra here ?"
(注意大写)
-Wall 告诉编译器启用大多数警告
-Wextra 告诉编译器启用更多警告
-c 告诉编译器只编译,而不是 link.
因为没有包含 '-o objfilename.o' 参数, 编译器将输出一个与输入文件同名的目标文件,扩展名为“.o”。
建议始终明确包含“-o objfilename.o”参数
建议对此类内容进行一些在线谷歌搜索,您会在其中找到类似于以下内容的页面:
目标文件由 .text(即二进制 CPU 指令)、.rodata(只读数据 - "hello world"[=15=] - 总共 13 个字节)和 .comment(附加链接信息)。 可执行文件由相同的减去 .comment 加上标准库内容加上导入动态库数据(如果有的话)组成。 标准库至少添加了启动代码,这使得可执行文件更大。所以你的区别是:executable .text = .object text + startup code + stdlibrary code (if static linking).
这是 'size'
的手册页副本SIZE(1) GNU 开发工具 SIZE(1)
姓名 大小 - 列出部分大小和总大小。
概要 大小 [-A|-B|--格式=兼容性] [ - 帮助] [-d|-o|-x|--radix=数字] [ - 常见的] [-t|--总计] [--target=bfdname] [-V|--version] [目标文件...]
说明 GNU 大小实用程序列出了部分大小---和总大小--- 其参数列表中的每个对象或存档文件 objfile。经过 默认情况下,为每个目标文件或每个生成一行输出 存档中的模块。
objfile... are the object files to be examined. If none are specified,
the file "a.out" will be used.
选项 命令行选项含义如下:
-A
-B
--format=compatibility
Using one of these options, you can choose whether the output from
GNU size resembles output from System V size (using -A, or
--format=sysv), or Berkeley size (using -B, or --format=berkeley).
The default is the one-line format similar to Berkeley's.
Here is an example of the Berkeley (default) format of output from
size:
$ size --format=Berkeley ranlib size
text data bss dec hex filename
294880 81920 11592 388392 5ed28 ranlib
294880 81920 11888 388688 5ee50 size
This is the same data, but displayed closer to System V
conventions:
$ size --format=SysV ranlib size
ranlib :
section size addr
.text 294880 8192
.data 81920 303104
.bss 11592 385024
Total 388392
size :
section size addr
.text 294880 8192
.data 81920 303104
.bss 11888 385024
Total 388688
--help
Show a summary of acceptable arguments and options.
-d
-o
-x
--radix=number
Using one of these options, you can control whether the size of
each section is given in decimal (-d, or --radix=10); octal (-o, or
--radix=8); or hexadecimal (-x, or --radix=16). In --radix=number,
only the three values (8, 10, 16) are supported. The total size is
always given in two radices; decimal and hexadecimal for -d or -x
output, or octal and hexadecimal if you're using -o.
--common
Print total size of common symbols in each file. When using
Berkeley format these are included in the bss size.
-t
--totals
Show totals of all objects listed (Berkeley format listing mode
only).
--target=bfdname
Specify that the object-code format for objfile is bfdname. This
option may not be necessary; size can automatically recognize many
formats.
-V
--version
Display the version number of size.
@file
Read command-line options from file. The options read are inserted
in place of the original @file option. If file does not exist, or
cannot be read, then the option will be treated literally, and not
removed.
Options in file are separated by whitespace. A whitespace
character may be included in an option by surrounding the entire
option in either single or double quotes. Any character (including
a backslash) may be included by prefixing the character to be
included with a backslash. The file may itself contain additional
@file options; any such options will be processed recursively.
另见 ar(1)、objdump(1)、readelf(1) 和 binutils 的信息条目。
版权所有 版权所有 (c) 1991-2013 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
Free Documentation License".
binutils-2.23.91 2013-11-18 大小(1)