程序员的自我修养——笔记
2013-10-14 13:17
288 查看
1.当我们无法判断宏定义是否正确或头文件包含是否正确时,可以查看预编译后的文件来确定问题。
2.利用gcc的一些选项,我们可以查看到预处理,编译等过程的中间结果,在这里,我们一定要搞清楚预处理,编译,汇编,链接这几个步骤的功能,需要用到的处理工具,及处理结果的形式!
比如下面的程序
在用以下命令
处理后的结果如下
3.现代的编译器有着很多层次的优化,往往在源代码级别会有一个优化过程,这个级别的优化是与机器无关的
源码级优化——直接在语法树上作优化比较困难,所以源代码优化器往往将整个语法树转换成中间代码,它是语法树的顺序表示,其实它已经非常接近目标代码了,但是它一般跟目标机器和运行是环境是无关的,比如它不包含数据的尺寸,变量地址和寄存器的名字等。
中间代码使得编译器可以被分为前端和后端。编译器前端负责产生及其无关的中间代码,编译器后端将中间代码转换成目标机器代码。这样对于一些跨平台的编译器而言,他们可以针对不同的平台使用同一个前端和针对不同机器平台的数个后端
4.用file命令查看linux中的几种与可执行文件相关的文件类型,分别以未链接的目标文件hello.o,可执行文件hello.out,动态链接库文件libc-2.17.so为例说明
5.创建共享库非常简单,最关键的是使用gcc的两个参数,即“-shared”和“-fPIC",”-shared“表示输出结果是共享库类型的;”-fPIC“表示使用地址无关代码技术来产生输出文件。另外还有一个参数是”-Wl“参数,这个参数可以将指定的参数传递给连接器,比如当我们使用”-Wl,-soname,mysoname"时,gcc会将“-soname mysoname”传递给链接器,用来指定输出共享库的soname,我们一般用下面的命令来创建共享库(libzion.so.0是我指定的一个soname)
该命令生成一个共享库文件libzion.so.1.0.0,该共享库文件的soname是libzion.so.1,然后用ldconfig,即可发现在/usr/lib/目录下生成了一个软链接libzion.so.1指向libzion.so.1.0.0
如果不使用-soname来指定共享库的soname,那么该共享库默认就没有soname,即使用ldconfig更新soname的软链接时,对该共享库也没有效果,即不会生成相应的软链接
6.出现/bin/ld: cannot find -lzion的错误
在/usr/lib64下面已经存在了libzion.so.0.0.1和指向该共享库的软链接libzion.so.1(这个软链接由ldconfig自动生成,指向该共享库的最新版本)
我们还需要创建一个名字为libzion.so的软链接指向libzion.so.0或指向libzion.so.0.0.1
7.To have the linker find a library specified using the option -l<name> the name of the libray shall be lib<name>.[a|so] and the parameter to -L should point the path were the library is located.
2.利用gcc的一些选项,我们可以查看到预处理,编译等过程的中间结果,在这里,我们一定要搞清楚预处理,编译,汇编,链接这几个步骤的功能,需要用到的处理工具,及处理结果的形式!
-E选项 查看预处理的结果 -S选项 查看编译后的结果(汇编代码)
比如下面的程序
#include<stdio.h> //This is a comment and just used for test #define max 100 int main() { printf("Hello World\n"); printf("%d\n",EOF); printf("%d\n",max); while(1){} }
在用以下命令
gcc -S hello.c -o hello.s
处理后的结果如下
.file "hello.c" .section .rodata .LC0: .string "Hello World" .LC1: .string "%d\n" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi call puts movl $-1, %esi movl $.LC1, %edi movl $0, %eax call printf movl $100, %esi movl $.LC1, %edi movl $0, %eax call printf .L2: jmp .L2 .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.8.1 20130603 (Red Hat 4.8.1-1)" .section .note.GNU-stack,"",@progbits
3.现代的编译器有着很多层次的优化,往往在源代码级别会有一个优化过程,这个级别的优化是与机器无关的
源码级优化——直接在语法树上作优化比较困难,所以源代码优化器往往将整个语法树转换成中间代码,它是语法树的顺序表示,其实它已经非常接近目标代码了,但是它一般跟目标机器和运行是环境是无关的,比如它不包含数据的尺寸,变量地址和寄存器的名字等。
中间代码使得编译器可以被分为前端和后端。编译器前端负责产生及其无关的中间代码,编译器后端将中间代码转换成目标机器代码。这样对于一些跨平台的编译器而言,他们可以针对不同的平台使用同一个前端和针对不同机器平台的数个后端
4.用file命令查看linux中的几种与可执行文件相关的文件类型,分别以未链接的目标文件hello.o,可执行文件hello.out,动态链接库文件libc-2.17.so为例说明
file hello.o(注意relocatable) hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped file hello.out(注意executable) hello.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xb57ae9522d8f21e9ce5651cb4ed00d719eae3dd0, not stripped file /usr/lib64/libc-2.17.so(注意shared object) /usr/lib64/libc-2.17.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), BuildID[sha1]=0x2aec7cf412e09d686aa7ebd899a07ee1f203ea6a, for GNU/Linux 2.6.32, not stripped
5.创建共享库非常简单,最关键的是使用gcc的两个参数,即“-shared”和“-fPIC",”-shared“表示输出结果是共享库类型的;”-fPIC“表示使用地址无关代码技术来产生输出文件。另外还有一个参数是”-Wl“参数,这个参数可以将指定的参数传递给连接器,比如当我们使用”-Wl,-soname,mysoname"时,gcc会将“-soname mysoname”传递给链接器,用来指定输出共享库的soname,我们一般用下面的命令来创建共享库(libzion.so.0是我指定的一个soname)
gcc -shared -fPIC -Wl,-soname,libzion.so.1 -o libzion.so.1.0.0 libzion.c
该命令生成一个共享库文件libzion.so.1.0.0,该共享库文件的soname是libzion.so.1,然后用ldconfig,即可发现在/usr/lib/目录下生成了一个软链接libzion.so.1指向libzion.so.1.0.0
如果不使用-soname来指定共享库的soname,那么该共享库默认就没有soname,即使用ldconfig更新soname的软链接时,对该共享库也没有效果,即不会生成相应的软链接
6.出现/bin/ld: cannot find -lzion的错误
在/usr/lib64下面已经存在了libzion.so.0.0.1和指向该共享库的软链接libzion.so.1(这个软链接由ldconfig自动生成,指向该共享库的最新版本)
我们还需要创建一个名字为libzion.so的软链接指向libzion.so.0或指向libzion.so.0.0.1
7.To have the linker find a library specified using the option -l<name> the name of the libray shall be lib<name>.[a|so] and the parameter to -L should point the path were the library is located.
相关文章推荐
- 一道关于排序的算法题
- 【笔试or面试】阿里巴巴2014校招笔试(哈尔滨)
- 【笔试or面试】腾讯2014校园招聘(广州站)
- 【笔试or面试】美团2014校园招聘
- 【笔试or面试】人人2014校园招聘笔试题(广州站)
- 【笔试or面试】3G门户校园招聘
- 3G门户笔试+面试
- 常见面试题排序算法(二)
- 程序员眼中的中国传统文化-王阳明《传习录》20
- 2013阿里巴巴实习生面试小结
- 百度2014校园招聘算法题--在数组中查找指定的元素t
- [剑指offer][面试题21]包含min函数的栈
- 二叉树 面试
- [剑指offer][面试题20]顺时针打印矩阵
- 面试中常见的二叉树问题_world
- 面试中常见链表问题_world
- 找个IT男做老公吧(请转给你的女友)
- “你最喜欢的程序员漫画”精选
- 工作那些事(十一)谈谈码农与农民工区别和发展之路
- Java程序员必知的8大排序