一)、Linux中的程序运行过程。
1、在使用gcc -g -Wall **.c -o ** -v命令后:
-g:可以在可执行文件里面添加调试信息
-Wall:W是警告的意思,all则是所有,因此这条语句可以帮助显示所有警 告信息
-v:这条语句可以显示在编译时的所有信息
下面是执行命令后显示的基础信息:包括执行编译的版本信息以及进行库函数的搜索信息
2、在使用readelf语句后,我们查看了3-1可执行文件的内部信息
ELF信息:采用小端方式存储、文件为可执行文件、入口地址 0x8048310、采用系统版本是INTEL 80386。
3、在使用strace后可以跟踪运行情况,由此知道我们是通过一个叫做write的函数来打印信息到显示器上的,只不过C语言通过封装让我们使用了printf这样一个功能强大的函数。运行时的步骤:execve函数就是派生进程的系统函数,brk为中断一个任务,mmap2:内存映射(在阅读了程序员的自我修养后对这个也有了初步的理解)。中断当前正在运行的程序,保存被中断程序的断点信息(当前的寄存器内容,cache的内容),写入内存,由操作系统为将要运行的程序分配资源,操作系统自我中断,将要运行程序开始工作。
二)、验证C语言执行过程是否从main函数开始。ld为linux系统默认的运行链接器,其运行由系统定义的脚本规定。
通过执行-v指令以及查阅资料理解了以下结论:
结论:
1.可执行文件中,除了用户自定义的代码之外,还需首先加载库函数作为运行的软件环境基础。
2.在linux的当下版本中,可执行文件中仅仅包含相关库的路径,而具体库文件的加载是在程序运行时,由ld加载器根据事先由系统规定的脚本临时装入内存。
3.这种运行方式成为运行时动态链接。
1、before main函数前缀的含义
在查询了资料后初步理解了__attribute__ 机制:attribute 是GCC的一个特性,它可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。在本次实验中,设置的就是函数属性,constructor属性的具体相当于c++里面的构造函数,它会在main函数执行前执行,因此在实验的时候会先输出这个属性定义下的函数显示,在使用constructor时,
1)、相同文件中的执行顺序与函数在文件中的先后顺序一致
2)、不同源文件中在后面编译的源文件中的该函数反而先执行
与之对应的还有destructor,执行顺序或许可以理解为虚构函数(功能不一样),在main函数执行之后进行执行。
2、分析-v选项中显示的信息,说明本程序在链接时具体添加了哪些库函数?库名称以及用途。
Using built-in specs.:编译链接详细信息
COLLECT_GCC=gcc:编译时调用的总调度程序
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/5/lto-wrapper:系统目录
Target: i686-linux-gnu:可执行文件的运行环境,cpui686 操作系统为:Linux,gnu:gcc的开发组织。
配置信息:
头文件包含:
#include “…” search starts here:到程序员自己指定的路径搜索
#include <…> search starts here:到系统指定的路径下搜索
/usr/lib/gcc/i686-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/5/include-fixed
/usr/include/i386-linux-gnu
/usr/include
End of search list.搜索结束
汇编:
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=127604
Compiler executable checksum: aa6acd9da3973c4e062850ebfea36a8e
COLLECT_GCC_OPTIONS='-o' 'test' '-v' '-mtune=generic' '-march=i686'
as -v --32 -o /tmp/ccE4Ef0F.o /tmp/ccy7NTqq.s
链接:
COLLECT_GCC_OPTIONS='-o' 'test' '-v' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-linux-gnu/5/collect2 -plugin /usr/lib/gcc/i686-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/i686-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cco9llZV.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_i386 --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -z relro -o test /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/5 -L/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/5/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/5/../../.. /tmp/ccE4Ef0F.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-n