linux 编程基础知识小结

本文详细介绍了Linux环境下C语言程序的编译流程,包括预处理、编译、汇编和链接四个步骤,并列举了一些常用的GCC编译选项,如-Wall、-Werror、-g、-static和-shared。此外,还提供了几个用于分析ELF文件和调试的Linux命令。
摘要由CSDN通过智能技术生成

linux 编程基础知识小结

一.编译

linux .c文件编译成可执行文件,需要经过预处理,编译,汇编,链接的过程,我们现在分别介绍每个过程,我们一般说的编译就是这四个过程的统称。

1.预处理

命令:gcc -E test.c -o test.i

在源文件中,我们把以#开头的叫做预处理命令,也就是说预处理就是处理文件中#开头的一些命令,他包括头文件包含#include,宏定义#define,条件编译,在linux开发过程这一步我们可以做许多应用。
检查功能宏的定义,没有定义可以让预处理阶段就报错报,或者检查某段代码有没有被编译进去。

#include <stdio.h>
#include <stdlib.h>

//#define BUILD_TEST

int main(int argc, const char *argv[])
{
        int i = 0;

#ifndef BUILD_TEST
        #error not define BUILD_TEST!!!!
#endif
#ifdef BUILD_TEST
        printf("this is test \n");
#endif
        return 0;
}

在这里插入图片描述
从代码可以看出没有定义功能宏,预处理就报错了,或者检查某段代码有没有编译进去直接代码中添加#error即可。

2.编译

命令:gcc -S test.c -o test.s
编译的过程就是将.i 翻译汇编语言
在这里插入图片描述

3.汇编

命令: gcc -c test.c -o test.o
将第二步代码翻译成机器能够认识的机器代码,最终生成的elf文件(obj文件)
在这里插入图片描述

4.连接

命令: gcc -o file
将上一步的obj文件 系统的库文件 编译生成的库文件连接起来,最终生成平台可以支持的可执行文件(平台,注意使用该平台的交叉编译工具链编译)
在这里插入图片描述
上面的整个过程就是c编译的过程。

二.常用编译选项

1.-Wall
这个编译选项可以打印出代码中所有的警告信息
在这里插入图片描述
2.-Werror
在实际程序开发中,一般我们是不允许警告的存在,我们需要把警告当错误处理
在这里插入图片描述
上面二者的区别在于 警告可以生成可执行程序,错误不能生成可执行程序

3.-g
我们应用程序调试中,经常需要遇到gdb调试,所有我们如果要生成的可执行程序支持gdb调试,必须要加入-g 选项编译。
下面我们对比下加-g与不加-g的区别
在这里插入图片描述
带不带-g 因为可执行程序中带有调试信息,所以文件大小有个很大的区别
在这里插入图片描述

4.-static
用静态库来编译这个文件
下面我们比较下带与不带的区别
在这里插入图片描述
文件大小有个明显的区别,因为我们知道如果使用静态库,我们需要把依赖的函数等编译到可执行程序中,所以造成文件很大。

5.-shared
用于生成动态库
在这里插入图片描述
生成静态库的方法,先编译生成.o文件,后使用
在这里插入图片描述
下面比较下.a 与.so文件
在这里插入图片描述

三.常用的linux命令

1.file 命令
查询文件类型,上面多次应用了

2.readelf
读取elf文件头
在这里插入图片描述
3.strings
查找elf中的字符串
在这里插入图片描述

4.ldd
查看连接的动态库
在这里插入图片描述
5.nm
查看符号表 -主要是新增加的函数与全局变量有没有编译进去
查找main函数
在这里插入图片描述
6.sum md5sum
文件校验相关,比较文件是否有变化
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值