Brief description:
Wrote a simple c program to display “Hello World!”, and compiled it using command “gcc –g –O0 –
fno-builtin”. Then using command “objdump” with options –f, -d, -s, --source to
display the information of the output file.
And then do the following changes to see the changes and
difference in the results.
5) Move the
printf()
call to a separate function named output()
, and call that function from main().
Original output file: a.out
Output file after change: hello_all5.out
Before change:
After change
It shows following:
6) Remove
-O0
and add -O3
to the gcc options. Note and explain the
difference in the compiled code.
-O3 is to optimize more
for code size and execution time. It reduces the execution time, but increase
the memory usage and compile time.
Output file before change:
hello_all5.out
Output file after change:
hello_all6.out
I use “time” command to
check the execution time of above files, and get following result.
hello_all6.out is complied with the option –O3. It supposes
to have less execution time. However, it takes much longer in real time than
the previous one. Well, it does take less time in sys time.
I also compared the sizes of the output files with –O0 and
–O3. The hello_all5.out, which is compiled with –O0, has smaller size than
hell0_all6.out, being compiled with –O3. Apparently, compiling file with option
–O3 does not reduce the file size. Instead, it increases the file size.
Following sreenshots are the result by running “objdump
–source” command for both of the files.
Comparing the two results, I found:
1 --- The sequences of <main> section and
<output> section in both results are different. For the output file
hello_all5.out, being compiled with –O0 option, <main> section appears
after <frame-dummy> section. And <output> section is after
<main> section. By contrast, for the output file hello_all6.out, being
compiled with –O3 option, <main> section appears right after the line “
Disassembly of section .text”. And <output> section still appears after
<frame-dummy> section.
2 ---The contents of <main> section and
<output> section are different for both results. For the output file
hello_all6.out, the contents of both <main> section and <output>
section are shorter than those in the result of hello_all5.out. It has 6
actions in <main> section of hello_all5.out and 9 actions in
<output> section of hello_all5.out. By contrast, there are only 3 actions
in <main> section of hello_all6.out and 4 actions in <output>
section of hello_all6.out.
When I ran “objdump –s” for both files, I found more
differences.
Contents of section .debug_line and contents of section
.debug_str are shorter than the result of hello_all6.out. Moreover, the result
generate by hello_all6.out has one more section – contents of section
.debug_ranges.
Contents of section. debug_str generated by hello_all5.out
It is good to know that using different compiling options,
the compiler compiles the program in different ways. Each option serves the
different purposes. Accordingly, the assembler contents of each object files
are different as well.
Using “objdump” command, it is good to see the assembler
contents of the object file. It’s a good start to learn the assembly language.
However, I still don’t fully understand what the assembler contents stand for.
With learning more assembly language, I think it won’t be a problem for me
anymore.
No comments:
Post a Comment