1. The generation of the program and what he has done to pave the way for the generation of the process
The general compilation process can be divided into four steps: preprocessing, compilation, assembly and linking:
-
Precompiled: process precompiled instructions starting with "#" in source code, such as "#include", "define", etc.
-
Compilation: after a series of lexical analysis, syntax analysis, semantic analysis and optimization of the preprocessed files, the corresponding assembly code files are generated. It is not only the core part of program construction, but also one of the most complex parts.
-
Assembly: convert assembly code into machine executable instructions according to the instruction comparison table. An assembly statement generally corresponds to a machine instruction.
-
Link: combine multiple target files to form an executable file.
Hello world
Why header files are needed, or why this form of header files is referenced;
What happened during code compilation: verbose
.
g++ main.cpp -o main --verbose The compilation process is as follows: Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) COLLECT_GCC_OPTIONS='-o' 'main' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/7/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE main.cpp -quiet -dumpbase main.cpp -mtune=generic -march=x86-64 -auxbase main -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cc6t0Tol.s GNU C++14 (Ubuntu 7.5.0-3ubuntu1~18.04) version 7.5.0 (x86_64-linux-gnu) compiled by GNU C version 7.5.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7" ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/7 /usr/include/x86_64-linux-gnu/c++/7 /usr/include/c++/7/backward /usr/lib/gcc/x86_64-linux-gnu/7/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. GNU C++14 (Ubuntu 7.5.0-3ubuntu1~18.04) version 7.5.0 (x86_64-linux-gnu) compiled by GNU C version 7.5.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 3eb3dc290cd5714c3e1c3ae751116f07 COLLECT_GCC_OPTIONS='-o' 'main' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' as -v --64 -o /tmp/ccwOSKKN.o /tmp/cc6t0Tol.s GNU assembler version 2.30 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.30 COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-o' 'main' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/cc2FJr9f.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o main /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. /tmp/ccwOSKKN.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o COLLECT_GCC_OPTIONS='-o' 'main' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
What content does the compiled file contain and the target file format
#include<iostream> using namespace std; int main(){ cout<<"Hello world"<<endl; return 0; }
A simple Hello world is written above. What is the compiled product? We can use file [filename] to see:
main: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c37c1e115f20a240dbf73b79dd3521bb830daac4, not stripped
This file is a 64 bit ELF(Executable and Linkable Format, ELF) file. The following figure describes the structure and information contained in the elf file from two perspectives. These information integrates code, data and information used during loading.
[external chain picture transfer failed. The source station may have anti-theft chain mechanism. It is recommended to save the picture and upload it directly (img-ckb8sum-16374370177)( https://secure1.wostatic.cn/static/3j9uPi79f2rkRcT2aMVTqL/image.png )]
The following shows the information read from the program using readelf
ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x7b0 Start of program headers: 64 (bytes into file) Start of section headers: 7064 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 9 Size of section headers: 64 (bytes) Number of section headers: 29 Section header string table index: 28 Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .interp PROGBITS 0000000000000238 00000238 000000000000001c 0000000000000000 A 0 0 1 [ 2] .note.ABI-tag NOTE 0000000000000254 00000254 0000000000000020 0000000000000000 A 0 0 4 [ 3] .note.gnu.build-i NOTE 0000000000000274 00000274 0000000000000024 0000000000000000 A 0 0 4 [ 4] .gnu.hash GNU_HASH 0000000000000298 00000298 0000000000000024 0000000000000000 A 5 0 8 [ 5] .dynsym DYNSYM 00000000000002c0 000002c0 0000000000000138 0000000000000018 A 6 1 8 [ 6] .dynstr STRTAB 00000000000003f8 000003f8 0000000000000163 0000000000000000 A 0 0 1 [ 7] .gnu.version VERSYM 000000000000055c 0000055c 000000000000001a 0000000000000002 A 5 0 2 [ 8] .gnu.version_r VERNEED 0000000000000578 00000578 0000000000000040 0000000000000000 A 6 2 8 [ 9] .rela.dyn RELA 00000000000005b8 000005b8 0000000000000120 0000000000000018 A 5 0 8 [10] .rela.plt RELA 00000000000006d8 000006d8 0000000000000060 0000000000000018 AI 5 22 8 [11] .init PROGBITS 0000000000000738 00000738 0000000000000017 0000000000000000 AX 0 0 4 [12] .plt PROGBITS 0000000000000750 00000750 0000000000000050 0000000000000010 AX 0 0 16 [13] .plt.got PROGBITS 00000000000007a0 000007a0 0000000000000008 0000000000000008 AX 0 0 8 [14] .text PROGBITS 00000000000007b0 000007b0 0000000000000212 0000000000000000 AX 0 0 16 [15] .fini PROGBITS 00000000000009c4 000009c4 0000000000000009 0000000000000000 AX 0 0 4 [16] .rodata PROGBITS 00000000000009d0 000009d0 0000000000000011 0000000000000000 A 0 0 4 [17] .eh_frame_hdr PROGBITS 00000000000009e4 000009e4 000000000000004c 0000000000000000 A 0 0 4 [18] .eh_frame PROGBITS 0000000000000a30 00000a30 0000000000000148 0000000000000000 A 0 0 8 [19] .init_array INIT_ARRAY 0000000000200d78 00000d78 0000000000000010 0000000000000008 WA 0 0 8 [20] .fini_array FINI_ARRAY 0000000000200d88 00000d88 0000000000000008 0000000000000008 WA 0 0 8 [21] .dynamic DYNAMIC 0000000000200d90 00000d90 0000000000000200 0000000000000010 WA 6 0 8 [22] .got PROGBITS 0000000000200f90 00000f90 0000000000000070 0000000000000008 WA 0 0 8 [23] .data PROGBITS 0000000000201000 00001000 0000000000000010 0000000000000000 WA 0 0 8 [24] .bss NOBITS 0000000000201020 00001010 0000000000000118 0000000000000000 WA 0 0 32 [25] .comment PROGBITS 0000000000000000 00001010 0000000000000029 0000000000000001 MS 0 0 1 [26] .symtab SYMTAB 0000000000000000 00001040 00000000000006d8 0000000000000018 27 47 8 [27] .strtab STRTAB 0000000000000000 00001718 0000000000000381 0000000000000000 0 0 1 [28] .shstrtab STRTAB 0000000000000000 00001a99 00000000000000fe 0000000000000000 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), l (large), p (processor specific) There are no section groups in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040 0x00000000000001f8 0x00000000000001f8 R 0x8 INTERP 0x0000000000000238 0x0000000000000238 0x0000000000000238 0x000000000000001c 0x000000000000001c R 0x1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000b78 0x0000000000000b78 R E 0x200000 LOAD 0x0000000000000d78 0x0000000000200d78 0x0000000000200d78 0x0000000000000298 0x00000000000003c0 RW 0x200000 DYNAMIC 0x0000000000000d90 0x0000000000200d90 0x0000000000200d90 0x0000000000000200 0x0000000000000200 RW 0x8 NOTE 0x0000000000000254 0x0000000000000254 0x0000000000000254 0x0000000000000044 0x0000000000000044 R 0x4 GNU_EH_FRAME 0x00000000000009e4 0x00000000000009e4 0x00000000000009e4 0x000000000000004c 0x000000000000004c R 0x4 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 0x10 GNU_RELRO 0x0000000000000d78 0x0000000000200d78 0x0000000000200d78 0x0000000000000288 0x0000000000000288 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 03 .init_array .fini_array .dynamic .got .data .bss 04 .dynamic 05 .note.ABI-tag .note.gnu.build-id 06 .eh_frame_hdr 07 08 .init_array .fini_array .dynamic .got Dynamic section at offset 0xd90 contains 28 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000c (INIT) 0x738 0x000000000000000d (FINI) 0x9c4 0x0000000000000019 (INIT_ARRAY) 0x200d78 0x000000000000001b (INIT_ARRAYSZ) 16 (bytes) 0x000000000000001a (FINI_ARRAY) 0x200d88 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x000000006ffffef5 (GNU_HASH) 0x298 0x0000000000000005 (STRTAB) 0x3f8 0x0000000000000006 (SYMTAB) 0x2c0 0x000000000000000a (STRSZ) 355 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x200f90 0x0000000000000002 (PLTRELSZ) 96 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x6d8 0x0000000000000007 (RELA) 0x5b8 0x0000000000000008 (RELASZ) 288 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000000000001e (FLAGS) BIND_NOW 0x000000006ffffffb (FLAGS_1) Flags: NOW PIE 0x000000006ffffffe (VERNEED) 0x578 0x000000006fffffff (VERNEEDNUM) 2 0x000000006ffffff0 (VERSYM) 0x55c 0x000000006ffffff9 (RELACOUNT) 4 0x0000000000000000 (NULL) 0x0 Relocation section '.rela.dyn' at offset 0x5b8 contains 12 entries: Offset Info Type Sym. Value Sym. Name + Addend 000000200d78 000000000008 R_X86_64_RELATIVE 8b0 000000200d80 000000000008 R_X86_64_RELATIVE 936 000000200d88 000000000008 R_X86_64_RELATIVE 870 000000201008 000000000008 R_X86_64_RELATIVE 201008 000000200fc8 000100000006 R_X86_64_GLOB_DAT 0000000000000000 __cxa_finalize@GLIBC_2.2.5 + 0 000000200fd0 000200000006 R_X86_64_GLOB_DAT 0000000000000000 _ZSt4endlIcSt11char_tr@GLIBCXX_3.4 + 0 000000200fd8 000700000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_deregisterTMClone + 0 000000200fe0 000800000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0 000000200fe8 000900000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0 000000200ff0 000a00000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_registerTMCloneTa + 0 000000200ff8 000b00000006 R_X86_64_GLOB_DAT 0000000000000000 _ZNSt8ios_base4InitD1E@GLIBCXX_3.4 + 0 000000201020 000c00000005 R_X86_64_COPY 0000000000201020 _ZSt4cout@GLIBCXX_3.4 + 0 Relocation section '.rela.plt' at offset 0x6d8 contains 4 entries: Offset Info Type Sym. Value Sym. Name + Addend 000000200fa8 000300000007 R_X86_64_JUMP_SLO 0000000000000000 __cxa_atexit@GLIBC_2.2.5 + 0 000000200fb0 000400000007 R_X86_64_JUMP_SLO 0000000000000000 _ZStlsISt11char_traits@GLIBCXX_3.4 + 0 000000200fb8 000500000007 R_X86_64_JUMP_SLO 0000000000000000 _ZNSolsEPFRSoS_E@GLIBCXX_3.4 + 0 000000200fc0 000600000007 R_X86_64_JUMP_SLO 0000000000000000 _ZNSt8ios_base4InitC1E@GLIBCXX_3.4 + 0 The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported. Symbol table '.dynsym' contains 13 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2) 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZSt4endlIcSt11char_trait@GLIBCXX_3.4 (3) 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@GLIBC_2.2.5 (2) 4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZStlsISt11char_traitsIcE@GLIBCXX_3.4 (3) 5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSolsEPFRSoS_E@GLIBCXX_3.4 (3) 6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitC1Ev@GLIBCXX_3.4 (3) 7: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab 8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2) 9: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 10: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 11: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitD1Ev@GLIBCXX_3.4 (3) 12: 0000000000201020 272 OBJECT GLOBAL DEFAULT 24 _ZSt4cout@GLIBCXX_3.4 (3) Symbol table '.symtab' contains 73 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000238 0 SECTION LOCAL DEFAULT 1 2: 0000000000000254 0 SECTION LOCAL DEFAULT 2 3: 0000000000000274 0 SECTION LOCAL DEFAULT 3 4: 0000000000000298 0 SECTION LOCAL DEFAULT 4 5: 00000000000002c0 0 SECTION LOCAL DEFAULT 5 6: 00000000000003f8 0 SECTION LOCAL DEFAULT 6 7: 000000000000055c 0 SECTION LOCAL DEFAULT 7 8: 0000000000000578 0 SECTION LOCAL DEFAULT 8 9: 00000000000005b8 0 SECTION LOCAL DEFAULT 9 10: 00000000000006d8 0 SECTION LOCAL DEFAULT 10 11: 0000000000000738 0 SECTION LOCAL DEFAULT 11 12: 0000000000000750 0 SECTION LOCAL DEFAULT 12 13: 00000000000007a0 0 SECTION LOCAL DEFAULT 13 14: 00000000000007b0 0 SECTION LOCAL DEFAULT 14 15: 00000000000009c4 0 SECTION LOCAL DEFAULT 15 16: 00000000000009d0 0 SECTION LOCAL DEFAULT 16 17: 00000000000009e4 0 SECTION LOCAL DEFAULT 17 18: 0000000000000a30 0 SECTION LOCAL DEFAULT 18 19: 0000000000200d78 0 SECTION LOCAL DEFAULT 19 20: 0000000000200d88 0 SECTION LOCAL DEFAULT 20 21: 0000000000200d90 0 SECTION LOCAL DEFAULT 21 22: 0000000000200f90 0 SECTION LOCAL DEFAULT 22 23: 0000000000201000 0 SECTION LOCAL DEFAULT 23 24: 0000000000201020 0 SECTION LOCAL DEFAULT 24 25: 0000000000000000 0 SECTION LOCAL DEFAULT 25 26: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 27: 00000000000007e0 0 FUNC LOCAL DEFAULT 14 deregister_tm_clones 28: 0000000000000820 0 FUNC LOCAL DEFAULT 14 register_tm_clones 29: 0000000000000870 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux 30: 0000000000201130 1 OBJECT LOCAL DEFAULT 24 completed.7698 31: 0000000000200d88 0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fin 32: 00000000000008b0 0 FUNC LOCAL DEFAULT 14 frame_dummy 33: 0000000000200d78 0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_ 34: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.cpp 35: 00000000000009d4 1 OBJECT LOCAL DEFAULT 16 _ZStL19piecewise_construc 36: 0000000000201131 1 OBJECT LOCAL DEFAULT 24 _ZStL8__ioinit 37: 00000000000008ed 73 FUNC LOCAL DEFAULT 14 _Z41__static_initializati 38: 0000000000000936 21 FUNC LOCAL DEFAULT 14 _GLOBAL__sub_I_main 39: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 40: 0000000000000b74 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__ 41: 0000000000000000 0 FILE LOCAL DEFAULT ABS 42: 00000000000009e4 0 NOTYPE LOCAL DEFAULT 17 __GNU_EH_FRAME_HDR 43: 0000000000200d90 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC 44: 0000000000200d88 0 NOTYPE LOCAL DEFAULT 19 __init_array_end 45: 0000000000200d78 0 NOTYPE LOCAL DEFAULT 19 __init_array_start 46: 0000000000200f90 0 OBJECT LOCAL DEFAULT 22 _GLOBAL_OFFSET_TABLE_ 47: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 23 _edata 48: 0000000000201000 0 NOTYPE WEAK DEFAULT 23 data_start 49: 00000000000009d0 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used 50: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2 51: 00000000000008ba 51 FUNC GLOBAL DEFAULT 14 main 52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZSt4endlIcSt11char_trait 53: 0000000000201008 0 OBJECT GLOBAL HIDDEN 23 __dso_handle 54: 00000000000009c4 0 FUNC GLOBAL DEFAULT 15 _fini 55: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@@GLIBC_2.2.5 56: 00000000000007b0 43 FUNC GLOBAL DEFAULT 14 _start 57: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZStlsISt11char_traitsIcE 58: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSolsEPFRSoS_E@@GLIBCXX 59: 0000000000000738 0 FUNC GLOBAL DEFAULT 11 _init 60: 0000000000201010 0 OBJECT GLOBAL HIDDEN 23 __TMC_END__ 61: 0000000000201020 272 OBJECT GLOBAL DEFAULT 24 _ZSt4cout@@GLIBCXX_3.4 62: 0000000000201000 0 NOTYPE GLOBAL DEFAULT 23 __data_start 63: 0000000000201138 0 NOTYPE GLOBAL DEFAULT 24 _end 64: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 24 __bss_start 65: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitC1Ev@@ 66: 0000000000000950 101 FUNC GLOBAL DEFAULT 14 __libc_csu_init 67: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab 68: 00000000000009c0 2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini 69: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_ 70: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 71: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 72: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8ios_base4InitD1Ev@@ Histogram for `.gnu.hash' bucket list length (total of 2 buckets): Length Number % of total Coverage 0 1 ( 50.0%) 1 1 ( 50.0%) 100.0% Version symbols section '.gnu.version' contains 13 entries: Addr: 000000000000055c Offset: 0x00055c Link: 5 (.dynsym) 000: 0 (*local*) 2 (GLIBC_2.2.5) 3 (GLIBCXX_3.4) 2 (GLIBC_2.2.5) 004: 3 (GLIBCXX_3.4) 3 (GLIBCXX_3.4) 3 (GLIBCXX_3.4) 0 (*local*) 008: 2 (GLIBC_2.2.5) 0 (*local*) 0 (*local*) 3 (GLIBCXX_3.4) 00c: 3 (GLIBCXX_3.4) Version needs section '.gnu.version_r' contains 2 entries: Addr: 0x0000000000000578 Offset: 0x000578 Link: 6 (.dynstr) 000000: Version: 1 File: libstdc++.so.6 Cnt: 1 0x0010: Name: GLIBCXX_3.4 Flags: none Version: 3 0x0020: Version: 1 File: libc.so.6 Cnt: 1 0x0030: Name: GLIBC_2.2.5 Flags: none Version: 2 Displaying notes found in: .note.ABI-tag Owner Data size Description GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) OS: Linux, ABI: 3.2.0 Displaying notes found in: .note.gnu.build-id Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) Build ID: c37c1e115f20a240dbf73b79dd3521bb830daac4
How the program is executed and how the operating system loads the program
What did you do before running the main function,
What is the running memory layout like