首页 > 其他分享 >day10 10.1 C语言基础之编译器安装

day10 10.1 C语言基础之编译器安装

时间:2023-07-25 22:56:44浏览次数:51  
标签:10.1 可执行文件 文件 Windows C语言 编译器 MinGW 动态链接库

【一】学习C语言的原因

  • 一般公司的apk
    • 基于Java实现的加密
    • jadx反编译java,分析代码
  • NB公司的的apk,基于Java+C语言实现加密(JNI开发)
    • 加密一般使用C语言开发,在安卓项目中使用Java调用C语言开发的动态链接库文件
    • jadx反编译java,分析代码
      • 看不到加密
    • ida反编译c语言,分析代码
      • 能看到用C语言写的加密

【二】c语言动态链接库so文件反编译工具

【1】动态链接库文件介绍

  • Windows:
    • xx.dll
  • Linux/Mac/安卓:
    • xx.so
  • 使用c语言写的代码,可以编译成 xx.exe 可执行文件,也可以编译成 xx.so/xx.dll
  • 动态链接库文件(Dynamic Link Library,DLL)是一种在多个程序中共享的可执行代码和数据的文件格式。

  • 动态链接库文件通常是使用C语言编写的代码经过编译生成的二进制文件。

    • 与静态链接库不同,动态链接库在应用程序运行时可以被加载到内存中并被多个程序共享使用。
  • 使用动态链接库可以实现代码的模块化和重用,提高开发效率和便捷性。

    • 通过将常用的函数和资源封装在动态链接库中,可执行文件只需包含对动态链接库的引用,而不需要将完整的代码和数据包含在自身中。
    • 这样可以减小可执行文件的体积,提高系统资源利用率,并且方便进行库文件的升级和维护。
  • 在使用动态链接库时

    • 可执行文件在运行时需要加载动态链接库,并通过动态链接以及符号表解析的方式来获取库文件中的函数和数据,并在必要时调用和使用它们,完成整个项目的功能。
  • 总结来说

    • 动态链接库文件是一种可在多个程序之间共享的二进制文件格式
    • 通过将常用的代码和数据封装在库文件中,实现了代码的模块化和重用,降低可执行文件的体积,提高开发效率和系统资源利用率。
    • 它在应用程序运行时可以被加载到内存中,并通过动态链接和符号表解析的方式实现对库文件功能的调用和使用。

【2】为什么会有动态链接库文件

  • 可以保证我们可执行文件不会过大
  • 后期打开可执行文件后,再加载动态链接库,完成整个项目的功能
  • 代码模块化和重用:

    • 使用动态链接库可以将代码分割成独立的模块,提高代码的可管理性和重用性。

    • 不同的模块可以分别编写、测试和维护,使整个项目更加灵活和可扩展。

  • 减小可执行文件体积:

    • 动态链接库允许将一些常用的函数和资源从可执行文件中分离出来,以库的形式提供。

    • 这样可以降低可执行文件的体积,减少资源占用并提高加载速度。

    • 同时,由于多个程序可以共享同一个动态链接库,节省了系统存储空间。

  • 系统更新和维护:

    • 动态链接库允许在系统运行时对库进行更新和替换,而无需重新编译整个应用程序。

    • 这样可以方便地修复漏洞、改进功能和提高性能,同时减少用户的等待时间。

  • 动态加载和延迟加载:

    • 动态链接库具有动态加载的特性,意味着它们可以在运行时按需加载到内存中。
    • 这种灵活性使得应用程序在需要时才加载所需的功能,减少了启动时间和内存占用。
  • 总之
    • 动态链接库文件的存在可以实现代码模块化、重用和动态加载
    • 带来了诸多好处,包括减小可执行文件体积、方便系统更新和维护
    • 同时提高了应用程序的灵活性和性能。

【3】动态链接库文件反编译

  • 在C语言中,生成的可执行文件或共享库(.so文件)可以被反汇编和反编译,以还原源代码或了解其实现细节。
  • 下面是一些常用的C语言so文件反编译工具:
    • IDA Pro:
      • IDA Pro是一款强大的逆向工程工具,支持多种平台和架构,包括C语言。
      • 它提供了反汇编、反编译、调试等功能,能够帮助你还原C语言so文件的源代码。
      • 但需要注意的是,IDA Pro是商业软件,需要购买授权。
    • Ghidra:
      • Ghidra是一款由美国国家安全局(NSA)开发的开源逆向工程工具。
      • 它支持多种平台和架构,并提供反汇编、反编译、脚本编写等功能,可以用于分析和还原C语言so文件的代码。
    • Radare2:
      • Radare2是一个开源的逆向工程框架,提供了反汇编、反编译、调试等功能。
      • 它可以用于分析和还原C语言so文件的源代码,支持多种平台和架构。
    • Hopper Disassembler:
      • Hopper Disassembler是一款反汇编工具,支持多种平台和架构。
      • 它可以将C语言so文件反汇编为汇编代码,并提供可视化界面和一些高级分析功能。

【三】编译器安装

  • C语言是编译型语言,编写好代码之后,需要由编译器编译后成不同平台的可执行文件才能执行,常见的编译器GCC、MSVC、Clang

【1】mac,linux:

  • 默认自带gcc,不需要额外安卓,mac如果没有就去直接安装xcode。

xcode: https://developer.apple.com/xcode/

【2】win:

(1)MinGW介绍

  • MinGW
    • 全称为Minimalist GNU on Windows(Windows下的微型GNU)
    • 是将经典的开源C语言编译器GCC(GNU Compiler Collection)移植到Windows平台下的项目。
    • 它提供了在Windows环境中进行C语言开发和编译的工具链,包括编译器、链接器和调试器等。
  • MinGW是一种在Windows平台上使用GCC编译器的工具集合
    • 它使得开发者能够进行C语言开发
    • 并产生与Windows兼容的可执行程序。
  • 此外
    • MinGW还提供对Win32API和一些Linux开发工具的支持
    • 为开发者提供广泛的功能和灵活性。
  • 全称为:Minimalist GNU on Windows.

  • 将经典的开源C语言编译器GCC移植到了Windows平台下,并且包含了Win32API

  • 因此可以将源代码编译为在Windows中运行的可执行程序

  • 而且还可以使用一些Windows不具备的,Linux平台下的开发工具。

  • 概括来讲:MinGW 是GCC的Windows版本

(2)MinGW的主要特点

  • 移植的GCC:

    • MinGW使用了由GNU开发的GCC编译器,可以将C语言源代码编译为适用于Windows平台的可执行程序。
    • 这使得开发者能够在Windows上编写和调试高效的C语言代码,并生成与Windows兼容的可执行文件。
  • Win32API支持:

    • MinGW还包含了Windows 32位应用程序接口(Win32API),使开发者能够直接访问和使用Windows操作系统提供的功能和资源。
    • 这样可以轻松地编写与操作系统交互的程序,并实现各种Windows应用的功能。
  • Linux工具支持:

    • 除了提供Windows开发所需的工具链,MinGW还允许在Windows环境下使用一些Linux平台下常见的开发工具。
    • 例如,它支持使用GNU工具集中的一些命令行工具,如make和grep等,为开发者带来更多便利。

(3)MinGW-w64与MinGW的区别:

  • MinGW只能编译生产32位可执行程序;
  • MinGW-w64可以编译成64bit或者32bit可执行程序

【四】MinGW-w64安装

参考博客:Windows下MinGW-w64的安装 - 知乎 (zhihu.com)

【1】MinGW-w64下载

(1)懒人模式(百度云直接下载)

链接: https://pan.baidu.com/s/1aMyeF4iUl0Bfn-P8ILGliQ

提取码: mcv9

(2)官方下载

第一步:官方地址

官方地址:http://www.mingw-w64.org/doku.php

选择Downloads下载

第二步:选择SourceForge,进入下载页面。

第三步:看到如下页面,选择MinGW-W64-install.exe下载

地址:https://sourceforge.net/project

(3)MinGW-w64安装

第一步:双击MinGW-W64-install.exe

第二步:选择安装信息

  • Version:
    • 指的是 gcc 的版本,如果没有特殊的需求,一般选择最高的版本号即可。
    • 最高版本是8.1.0 ,选中它即可
    • 选默认
  • Architechture:
    • 电脑系统是 64位的,选择 x86_64;
    • 如果是 32位 系统,则选择 i686
    • 选x86_64
  • Threads:
    • 如果是 Windows ,选择 win32
    • 如果是 Linux、Unix、Mac OS 等其他操作系统要选择 posix
    • 选win32
  • Exception
    • seh 是新发明的,而 sjlj 则是古老的。
    • seh 性能比较好,但不支持 32位。
    • sjlj 稳定性好,支持 32位。
    • 建议64位操作系统选择seh
    • 选seh

第三步:最终选择如下:

第四步:一路下一步

第五步:如下

(4)配置环境变量

属性

高级系统设置

环境变量

将安装路径中的bin文件路径添加到系统环境变量中

  • 将之前安装的的 MinGW-w64 的 bin 文件夹地址,复制到新增的空白变量位置里,即可完成 MinGW-w64 的配置工作

(5)验证安装成功

  • 打开cmd窗口,输入gcc -v并按回车键,如下图即安装成功

【五】MinGW安装

【1】下载

下载地址:https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/

备用地址:https://sourceforge.net/projects/mingw/files/latest/download

【2】安装

install

continue

安装中

continue

安装所有的库

Apply Changes

Apply

安装成功 - close

添加系统环境变量

命令行测试

【六】IDEA安装

  • 我们使用jetbrains公司的CLion作为IDE

【1】下载

下载地址:https://www.jetbrains.com/clion/download/other.html

【2】安装

  • 一路下一步

【3】使用

新建项目

选择 C Executable

选择解释器

运行项目

【4】小问题 - clion中文乱码问题

解决方案一

  • 按住 Ctrl+Shift+Alt+/ 选中Registry...
找到Registry

取消 run.process.with.pty

解决方案二

打开 settings - File Encodeings

直接修改文件编码

Conert

【七】Hellow World

【1】新建文件

  • main.c
# include <stdio.h>

int main(int argc, char const *argv[]) {
    
    printf("hello world\n");
    
    return 0;
}

【2】编译文件

gcc main.c 
  • 产生新文件 a.exe(win下) a.out(mac/lin下)

  • 直接运行

标签:10.1,可执行文件,文件,Windows,C语言,编译器,MinGW,动态链接库
From: https://www.cnblogs.com/dream-ze/p/17581235.html

相关文章

  • C语言之函数
    函数一个c语言项目只能有一个main函数函数是什么?函数是一段可重复使用的代码块,用于执行特定的任务。它接受输入参数,执行一系列操作,并返回一个值。在C语言中,函数由函数头和函数体组成。函数头包含函数的返回类型、函数名和参数列表。函数体包含函数的具体实现代码。通过调......
  • C语言分支与循环(8)--- 练习题(1)
    一.练习1.编写一段代码计算n的阶乘提示:如5的阶乘就是5*4*3*2*1以此类推例如以下代码:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<windows.h>intmain(void){ intn; intret=1; printf("请输入n的值:"); scanf("%d",&n); for(inti=1;i<......
  • 解决C语言编程常见问题,轻松提高编程水平!
    遇到错误时应该如何处理   当遇到错误时,不要惊慌失措。首先要查看错误提示信息,如果是中文提示就直接阅读,如果是英文提示则进行翻译理解。根据错误提示定位到错误发生的代码行数,通常错误就在该行的上下几行代码中。不要偷懒,马上向他人询问问题,这样对自己负责任。成长需要经历......
  • 初识C语言——7扫雷(低配)
    主程序——text.c:#define_CRT_SECURE_NO_WARNINGS1#include"game.h"game(){ charHide[ACRS][COLS]={'0'}; charShow[ACRS][COLS]={'0'}; //数组初识化 Initialize(Hide,ACRS,COLS,'0'); Initialize(Show,ACRS,......
  • C语言分支与循环(7)--- do...while()循环
    一.do语句的语法do循环语句;while(表达式);我们可以发现do后面的循环语句一定会被执行一次,随后再去执行while()循环语句,去判断表达式,如果为真则返回do语句继续执行,若为假则不进入do语句循环,如以下代码:#include<stdio.h>intmain(void){ inti=0; do { printf("%d",i);......
  • 我真的想知道,AI编译器中的IR是什么?
    随着深度学习的不断发展,AI模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对AI框架的持续迭代。AI编译器就成了应对以上问题广受关注的技术方向,让用户仅需专注于上层模型开发,降低手工优化性能......
  • 我的第五次C语言练习
    今天写书上的练习。//第一章练习//intmain(void)//{// intinch;// floatcm;// inch=0;// scanf("%d",&inch);// cm=2.54*inch;// printf("cm=%f\n",cm);// return0;//}发现之前第一章还有练习没写,是将英尺转换为厘米,因为inch乘了个2.54,所以cm是小数,用的是flo......
  • 简单理解:C语言中的分支和循环语句
    一、C语言中的循环语句while循环while(//条件语句){//语句块}执行的逻辑:在执行到while()这一行时,会根据条件语句的真和假来判断是否继续进行循环,若条件语句为真则继续循环,如果条件为假则结束循环。dowhile循环do{//语句块}while(条件语句);执行的逻辑:和while类似,但是要注......
  • C语言指针的常见问题
    1值传递下面看一个列子,student结构体中包含该学生的各种信息,我们在change函数中对其进行部分修改,再在主函数中输出其结果#include<stdio.h>#include<string.h>#defineformat"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3]......
  • C语言模拟银行排队叫号系统(链队)
    一.队列队列是一种具有先进先出(FIFO)特性的线性数据结构,它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾(rear),另一端称为队头(front)。新元素总是插入在队列的队尾,而从队列中删除元素时则总是删除队头元素。由于队列具有FIFO特性,因此队列通常用于需要按照顺序处理数据的场......