c语言透视和linux C编程一站式的ELF内容


在这里插入图片描述

一· 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。根据以上信息可以描绘出整个目标文件的布局

链接和可执行文件

重定位是将符号引用与符号定义进行链接的过程。因此链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(一般是虚拟内存地址)的过程。
静态链接过程主要是把可重定位文件依次读入,分析各个文件的文件头,进而依次读入各个文件的节区,并计算各个节区的虚拟内存位置,对一些需要重定位的符号进行处理,设定它们的虚拟内存地址等,并最终产生一个可执行文件或者是动态链
接库。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值