【编译、链接、装载一】预处理、编译、汇编、链接( 二 )


上面的编译过程相当于如下命令:
$cc hello.i -S -o hello.s
可以得到汇编输出文件hello.s
2、编译的过程3、编译生成的文件(如下图)
后面分一篇文章 , 详细的介绍下以下的指令都是什么意思 。
四、汇编器()——as 1、汇编指令
汇编器是将汇编代码转变成机器可以执行的指令 , 每一个汇编语句几乎都对应一条机器指令 。所以汇编器的汇编过程相对于编译器来讲比较简单 , 它没有复杂的语法 , 也没有语义 , 也不需要做指令优化 , 只是根据汇编指令和机器指令的对照表一一翻译就可以了 , “汇编”这个名字也来源于此 。
$as hello.s -o hello.o
2、查看汇编生成的目标文件
$objdump -h hello.o
五、链接器()——ld 1、链接器
目标文件:.so 文件生成.out文件
链接的指令
ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/--linux/4.8.5/.o /usr/lib/gcc/--linux/4.8.5/.o -L/usr/lib/gcc/--linux/4.8.5 -L/usr/lib64 -L/usr/lib --start-group -lgcc - -lc --end-group hello.o -o hello.out
或者
ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/--linux/4.8.5/.o /usr/lib/gcc/--linux/4.8.5/.o -L/usr/lib/gcc/--linux/4.8.5 -L/usr/lib64 -L/usr/lib -lstdc++ -lm - -lc -lgcc hello.o -o hello.out
2、查看链接生成的程序
$objdump -h hello.out
六、执行hello.out
$./hello.out
bash: ./test.out: /lib/ld64.so.1: bad ELF : 没有那个文件或目录
解决方案见:/lib/ld64.so.1: bad ELF : 没有那个文件或目录 , 因为这个问题不太好处理 , 所以单独分了一篇文章 , 记录下解决问题的过程 。
七、gcc能做的事:预处理、编译、汇编、链接
上面预处理、编译、汇编、链接 , 我们分别使用了cpp、cc、as、ld 。
其实 , 预处理、编译、汇编、链接这四个过程 , gcc自己就能干完了 。
$gcc -E hello.c -o hello.i
$gcc -S hello.i -o hello.s
或者使用如下命令:
$gcc -S hello.c -o hello.s
$gcc -c hello.s -o hello.o
或者使用gcc命令从C源代码文件开始 , 经过预编译、编译和汇编直接输出目标文件( File):
$gcc -c hello.c -o hello.o
备注:
gcc -c hello.c -o hello.o小写的-c才是仅仅汇编 , 
gcc -C hello.c -o hello.o如果是大写的-C , 会进行链接的 。
$gcc hello.o -o hello.out或者$gcc hello.o -o hello
[dev1@localhost test01]$ gcc --help用法:gcc [选项] 文件...选项:-pass-exit-codes在某一阶段退出时返回最高的错误码--help显示此帮助说明--target-help显示目标机器特定的命令行选项--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]显示特定类型的命令行选项(使用‘-v --help’显示子进程的命令行参数)--version显示编译器版本信息-dumpspecs显示所有内建 spec 字符串-dumpversion显示编译器的版本号-dumpmachine显示编译器的目标处理器-print-search-dirs显示编译器的搜索路径-print-libgcc-file-name显示编译器伴随库的名称-print-file-name=