首页 > 其他分享 >c语言的编译和链接

c语言的编译和链接

时间:2023-01-02 11:45:22浏览次数:60  
标签:gcc 语言 int 编译 add main 链接 math

隐藏的细节:编译与链接

编译:将源代码翻译成机器代码

在编译过程中使用gcc -c main.c 先编译main.c文件

然后使用gcc -c math.c 编译math.c 文件

在编译后会生成2个扩展为.o 的文件 main.o 和 math.o

.o文件是目标文件,该类型的文件在Linux通用格式是ELF,在windows下是PE, 这2个格式虽不兼容,但是结构类似,都是对二进制代码的封装

//main.c
#include <stdio.h>
int add(int a,int b); //一句声明
int main(){
    printf("Hello");
    int result = add(1,4); //在编译main.c的过程中不知道add函数具体是什么,但是有定义了声明,编译不会错
    return result;
}

//math.c
int add(int a,int b){
    return a+b;
}

可以使用一些命令查看elf的内容

readelf -h main.o 查看文件头

readelf -S main.o 查看段信息

objdump -s -d main.o 查看汇编指令

objdump -r main.o 查看重定位表

在编译main.c文件,编译器将add函数和printf函数的跳转地址暂时设置0,在后面的链接过程中修改

main.o里面有2个需要被重定位的函数printf和add

使用gcc main.o math.o -o main 链接得到可执行文件main

链接就是将编译好的目标文件连同用到的静态库、运行时库组合拼装成一个独立可执行的文件,包括将函数的跳转地址修正成正确的

如果你使用gcc main.o -o mian, 链接器找不到add函数的实现,报错undefined reference

makefile

makefile其实是构建一颗依赖树,使用make main命令执行

all: main
main: main.o math.o
		gcc main.o math.o -o main
main.o: main.c
		gcc -c main.c
math.o: math.c
		gcc -c math.c
clean:
		rm main main.o math.o

image-20230102111916966

标签:gcc,语言,int,编译,add,main,链接,math
From: https://www.cnblogs.com/cyfuture/p/17019637.html

相关文章

  • C 语言编译预处理
    一、编译预处理概念1、编译预处理不是C语言本身的内容,是C编译系统提供的功能。在通常的编译之前,编译系统要预先对这些命令进行处理,之后才对C程序进行编译,生成目标代......
  • C语言学生成绩管理程序[2023-01-02]
    C语言学生成绩管理程序[2023-01-02]题目一、学生成绩管理程序(学号后三位139-390的选做)任务:利用C语言中相关知识(包括文件,结构体数组等)设计学生成绩管理程序,要求如下:任意......
  • 计算机编程基础-编程语言,计算机基础
    计算机编程基础目录计算机编程基础1.编程语言1.1编程1.2计算机语言1.3编程语言1.4翻译器2.计算机基础2.1计算机组成2.1计算机组成2.2数据存储2.3数据存储单位2......
  • C语言中的单目运算符
    !逻辑反操作 - 负值+ 正值&取地址sizeof操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置--、后置--++前置++、后置++*  间接访问操作符(解引......
  • 安语未新版平台链接发布(持续更新)
    ID官网链接1​2​3开源中国​4Github​​https://github.com/mo3408/​​5简书​​https://www.jianshu.com/u/ad5d848cc749​​6Gitcode​​https://gitcode.net/mo3408​......
  • android链接器命名空间源码分析
    二代壳加壳apk在实现函数抽取的时候需要选择合适的时机进行抽取代码的回填,一般选择在LoadMethod函数中即函数被加载前。所以需要通过inlinehooklibart.so的LoadMethod函......
  • android的链接器命名空间
    android7.0加入了对私有系统so库API调用的限制,android8.0引入了projectTreble实现框架与供应商解耦合,这都需要依赖链接器命名空间机制。这里主要关注的重点是链接器命名......
  • Go语言微服务框架go-micro(入门)
    Micro用于构建和管理分布式系统,是一个工具集,其中go-micro框架是对分布式系统的高度抽象,提供分布式系统开发的核心库,可插拔的架构,按需使用简单示例编写protobuf文件:synt......
  • C语言:打印乘法口诀表。
    #include<stdio.h>intmain(){inti=0;for(i=1;i<=9;i++){intj=1;for(j=1;j<=i;j++){printf("%d*%d=%-2d",i,j,i*j); } printf("\n"......
  • 超链接标签
    ​   <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body>......