一· Vim
1.把 C 语言输出为 html
命令模式下的 TOhtml 命令可把 C 语言输出为 html 文件,结合 syntax把 Vim 打造成源代码编辑器
15on ,可产生比较好的网页把代码发布出去。
2.全局替换某个变量名
如发现变量命名不好,想在整个代码中修改,可在命令模式下用%s#old_variable#new_variable#g 全局替换。替换的时注意变量名是其他变量一部分的情况。如果希望将变量"abc"全部替换成"xyz"又不希望把"abcd"错误替换成"xyzd",则可以在查找时指定边界: %s#<old_variable>#new_variable#g
3.把缩进和 TAB 键都替换为空格
可考虑设置 expandtab ,即 set et ,如果要把以前编写的代码中的缩进和 TAB 键都替换掉,可以用 retab 。
4.关键字自动补全
输入一部分字符后,按下 CTRL+P 或者 CTRL+N 即可。比如先输入prin ,然后按下 CTRL+P/N 就可以补全了。
二·Gcc 编译的背后
预处理
C 语言编译器对
各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。这三类的指令很常见,主要有 #define , #include 和#ifdef … #endif ,要特别地注意它们的用法。
在命令行定义宏
编译
语法检查
如果仅仅希望进行语法检查,可以用 gcc 的 -fsyntax-only 选项;如果为了使代码有比较好的可移植性,避免使用 gcc 的一些扩展特性,可以结合 -std和 -pedantic (或者 -pedantic-erros )选项让源代码遵循某个 C 语言标准的语法。
编译器优化
生成汇编语言文件
$ gcc -S hello.c # 默认输出是hello.s,可自己指定,输出到屏幕-o -
,输出到其他文件-o file
汇编
ELF文件初步
可重定位文件
Linux 可重定位文件 ELF结构
摘自https://blog.csdn.net/jltxgcy/article/details/39157599
int printf( const char* format, ... );
int global_init_var = 84;
int global_uninit_var;
void func1( int i )
{
printf( "%d\n", i );
}
int main(void)
{
static int static_var = 85;
static int static_var2;
int a = 1;
int b;
func1( static_var + static_var2 + a + b );
return a;
}
共8个字节,一个是0x00000054,十进制是84;一个是0x0000000056,十进制是85。
补充:
从Section Header中读出各Section的描述信息,其中.text和.data是我们在汇编程序中声明的Section,而其它Section是汇编器自动添加的。Addr是这些段加载到内存中的地址(我们讲过程序中的地址都是虚拟地址),加载地址要在链接时填写,现在空缺,所以是全0。Off和Size列指出了各Section的起始文件地址和长度。比如.data段从文件地址0x60开始,一共0x38个字节,回去翻一下程序,.data段定义了14个4字节的整数,一共是56个字节,也就是0x38。根据以上信息可以描绘出整个目标文件的布局
链接和可执行文件
重定位是将符号引用与符号定义进行链接的过程。因此链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(一般是虚拟内存地址)的过程。
静态链接过程主要是把可重定位文件依次读入,分析各个文件的文件头,进而依次读入各个文件的节区,并计算各个节区的虚拟内存位置,对一些需要重定位的符号进行处理,设定它们的虚拟内存地址等,并最终产生一个可执行文件或者是动态链
接库。