这个程序,一步到位的编译指令是:gcc test.c- o test实质上,上述编译过程是分为四个阶段进行的,即预处理、编译、汇编和连接。 预处理gcc -E test.c-o test.i或gcc -E test.c编译为汇编代码,预处理之后,可直接对生成的test.i文件编译,生成汇编代码:gcc -Stest.i -o test.s
汇编:对于之前生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:gcc-c test.s -o test.o
连接:对于之前生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test,代码如下:gcc test.o- o test
库文件链接 首先我们要进行编译test.c为目标文件,这个时候需要执行 gcc –c –I /usr/dev/mysql/include test.c –o test.o 最后我们把所有目标文件链接成可执行文件:
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test 强制链接时使用静态链接库 在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令: gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test 分析ELF文件 LF文件格式如下图所示,位于ELFHeader和SectionHeaderTable之间的都是段(Section)。一个典型的ELF文件包含下面几个段: .text:已编译程序的指令代码段。 .rodata:ro代表readonly,即只读数据(譬如常数const)。 .data:已初始化的C程序全局变量和静态局部变量。 .bss:未初始化的C程序全局变量和静态局部变量。 .debug:调试符号表,调试器用此段的信息帮助调试。可以使用readelf -S查看其各个section的信息。 反汇编ELF 由于ELF文件无法被当做普通文本文件打开,如果希望直接查看一个ELF文件包含的指令和数据,需要使用反汇编的方法。使用objdump-D对其进行反汇编如下:objdump -D Hello 使用objdump-S将其反汇编并且将其C语言源代码混合显示出来:gcc -o Hello -g Hello.c ,objdump -S Hello
