linux进程-从文件到二进制

本文详细介绍了Linux下gcc编译过程,包括预处理、编译、汇编和链接。讲解了静态链接库和动态链接库的区别,动态链接库的工作原理,如PLT(过程链接表)和GOT(全局偏移量表)的角色。通过实例展示了如何使用gcc命令创建和使用静态及动态链接库。
摘要由CSDN通过智能技术生成

linux进程-从文件到二进制

gcc命令
gcc [option] file1 file2  //不加入参数,则按照默认参数依次执行编译、汇编和链接操作,生成可执行的文件名a.out
编译的过程
  1. 预处理
  2. 编译
  3. 汇编
  4. 链接

参数

新建一个hello.c文件

#include<stdio.h>

int main()
{
   
		printf("hello world!");
}
  • -E

    只执行预处理操作,宏展开,将头文件嵌入到正文中

    gcc -E hello.c -o hello.i
    

    执行之后生成hello.i文件,打开文件我们会发现stdio.h包被展开了

  • -S

    只激活预处理和编译,就是把文件编译成汇编代码

    gcc -S hello.c  #生成hello.s文件
    

    查看一下hello.s文件

    gcc_s

  • -c

    只激活预处理,编译和汇编,也就是它把程序做成obj文件。最终编译成.o文件,这是**ELF(**Executeable and Linkable Format , 可执行与可链接文件) 的第一种类型,可重定位文件

    gcc -c hello.c  #生成hello.o文件  
    
  • 链接

    生成可运行的hello文件

    gcc hello.o -o hello 
    

    使用 nm 查看hello.o

    0000000000000000 T main
                     U printf
    

    发现printf并没有被分配地址,此时就体现了链接的作用,接下来 使用nm hello<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值