Linux基础2-gcc安装&编译连接原理

安装 gcc

  • 1.打开终端:
    2.切换到root用户: su 输入密码 切换到root
    3.切换当前工作目录: cd /mnt
    mnt是一个临时挂载点 ISO镜像–>/dev 接口
    4.创建目录: mkdir dvd
    接口挂载到dvd下面
    5.挂载: mount /dev/cdrom /mnt/dvd
    mount是个命令 把cdrom里的东西挂载在dvd 相当于映射进去
    6.切换到yum的配置文件: cd /etc/yum.repos.d
    7.创建配置文件: touch yum.repo
    8.编辑配置文件: vim yum.repo
    填入以下代码:
    在这里插入图片描述
    9.寻找要装的gcc安装包: yum search gcc
    10.进行安装: yum install gcc-c++.i686 -y
    11.complete后进行验证:
    which gcc
    which g++
    which gdb
    12.退出:exit

  • yum安装有三种方式:
    本地安装: baseurl=file://
    flp安装: baseurl=flp://
    网络安装: baseurl=http://

我们用的本地安装

编译连接原理.

在这里插入图片描述

  • 1.预编译:
    删除注释
    宏替换
    预编译指令:#include #if #elif #endif

  • 2.编译:
    词法,语法,语义的解析
    代码优化
    符号汇总(数据和函数名会生成符号)

  • 3.汇编:
    将汇编指令转化为二进制
    生成各个section
    生成符号表

  • 4.链接:
    合并各个section,调整段大小及段的起始位置,合并符号表,进行符号解析
    在这里插入图片描述
    符号解析只会解析GLABAL符号,不解析LOCAL符号
    符号重定位(给所有的符号一个运行时的逻辑地址,逻辑地址是假地址)
    链接之后是一个可执行文件—>在磁盘上存储的
    在这里插入图片描述
    注意:
    只有物理地址才是真正的内存地址.操作系统将可执行文件加载到内存上后,加载位置不一定,但是可以通过虚拟内存技术将逻辑地址转化为一个物理地址,就可以直接访问.

  • 在终端进行执行:
    预编译:
    gcc-E main.c -o main.i
    编译:
    gcc -S main.i 从main.i到 main.s
    gcc -S main.c—>从main.c到 main.s
    汇编:
    gcc -c main.s
    gcc -c main.c—>main.o
    链接:
    gcc main.o–>生成一个a.out
    gcc main.c–>a.out
    gcc main.o -o main

int main(int argc,charargv[],charenvp[]);

  • .bss分为:磁盘空间和内存空间 节省的是磁盘空间

  • malloc:返回虚拟地址,指向的仅仅是一块虚拟地址空间.(在物理内存上没有申请到空间,只有当真正赋值时才会将内存分配给它----叫做惰性原理)
    malloc调用特别快.

  • new:相当于是对malloc的一次封装

内存构建

内存构建:
在这里插入图片描述
.data数据区存储: 初始化并且不为0
.bss 数据区存储: 初始化为0或者未初始化的数据,除过未初始化的普通全局变量

举例:(可以看到哪些是指令 哪些是数据)
在这里插入图片描述

gcc g++区别

gcc g++:编译连接,都能编译C也能编译C++
gcc: 默认链接C库
g++:默认链接C++库
gdb:调试

gcc g++区别:
1.g++在编译C的时候不用手动链接C库也可以用编译
如果用gcc来编译c++程序,必须手动链接 C++库

gcc -o main main.cpp -lstdc++ 正确

gcc -o main main.cpp这样就会出问题(.cpp是c++程序)

gcc -o main main.c 这样不会出问题

2.对于.c文件,gcc以C语言方式处理,g++以c++语言方式处理.
3.对于.cpp文件,gcc和g++都以C++方式处理,但是gcc不会链接STL库,必须手工链接

两个版本

1.debug版本–>开发版本,调试版本,最终的可执行文件中加入了很多调试信息,在section

gcc -o main.o main.c -g 得到一个debug版本的文件main.o

  • 分步解析:
    先编译: gcc -c main.c -g
    链接: gcc -o debug main.o
    要注意-g是加在编译过程中的,如果加在了连接过程生成的是release版本

2.release版本–>发行版本

  • gcc 默认生成release版本

调试:
gdb main.o

  • 注意:
    调试的对象是:debug版本的可执行文件 gdb main.o(这个main.o已经是debug版本的)
    控制的对象: .c文件

显示源代码:

l : 显示main函数所在的文件的源代码
list file_name:num 显示指定文指定行附近的代码
set listsize count 设置一次显示的行数
list line1,line2 显示从 line1到line2之间的代码

断点管理:
1.b line 给line行设置一个断点,但是加了断点不会显示加了
2.info b 查看断点信息
3.b file_name:line 给file_name的line行设置一个断点
4.b function_name 给函数的第一行设置一个断点
5.d bpnum 删除line行的断点
6.disable bpnum 将断点设置为无效
7.enable bpnum 将断点设置为有效
8.b line/file_name:line/function_name if 条件 添加条件断点

运行流程管理:

r 启动调试
n 执行下一步 逐过程–>遇到函数调用则直接将函数执行完成,进行下一步
s 执行下一步 逐语句–>遇到函数调用则进入函数中单步执行
finish 跳出函数–>仅仅将当前的函数执行完成,然后暂停下来
c 继续执行,直到下一个断点处
q 退出调试

查看变量:
p val_name(变量名)
p &val_name(引用)
p s_node.data(节点)
p p_s->data(指针指向的数据)
p *p_s(指针)

数组:
int arr[] = {1,2,3,4,5,6};
int *parr= arr;

查看数组:
p arr 将数组的所有元素打印出来
p parr 显示数组的首地址
p *parr 显示数组首元素的地址
p *parr@len 显示从parr地址开始到len长度的元素的值

p function(c1,c2,c3) 显示函数调用完成后返回的值
call

查看函数调用栈:

bt 到此刻为止,函数调用的过程
display val_name 每执行一步就会自动显示规定的动作
info display 显示display信息
UN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值