gcc命令使用_c调用cmd并执行命令

gcc命令使用_c调用cmd并执行命令gcc命令基本操作Hello基本操作编译汇编链接ELF文件分析Hello基本操作准备工作#include<stdio.h>//此程序很简单,仅仅打印一个HelloWorld的字符串。intmain(void){printf(“HelloWorld!\n”);return0;}hello.i文件编译汇编将编译生成的hello.s文件汇编生成目标文件hello.oGCC的选项-c使GCC在执行完汇编后停止,生成目标文件

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Hello基本操作

准备工作

#include <stdio.h> //此程序很简单,仅仅打印一个 Hello World 的字符串。 
int main(void) { 
    
printf("Hello World! \n"); 
return 0; 
}

在这里插入图片描述
预处理基本操作

  1. 将所有的#define 删除,并且展开所有的宏定义,并且处理所有的条件预编 译指令,比如#if #ifdef #elif #else #endif 等。
  2. 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
  3. 删除所有注释“//”和“/* */”。
  4. 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  5. 保留所有的#pragma 编译器指令,后续编译过程需要使用它们。
    在这里插入图片描述
    hello.i文件
    在这里插入图片描述

编译

将预处理生成的 hello.i 文件编译生成汇编程序 hello.s 在这里插入图片描述在这里插入图片描述

汇编

汇编过程调用对汇编代码进行处理,生成处理器能识别的指令,保存在后缀为.o 的目标文件中。
在这里插入图片描述

将编译生成的 hello.s 文件汇编生成目标文件 hello.o
GCC 的选项-c 使 GCC 在执行完汇编后停止,生成目标文件

链接

  1. 静态链接:
    静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行 文件会比较大。
    在这里插入图片描述
    text链接静态库,代码尺寸变得极大
    在这里插入图片描述
    没有链接动态库

  2. 动态链接:
    动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统 中把相应动态库加载到内存中去。
    gcc hello.c -o hello
    在这里插入图片描述
    在这里插入图片描述
    链接了许多其他的动态库,主要是linux系统glibc 动态库

ELF文件分析

链接器链接后生成的最终文件为 ELF 格式可执行文件,一个 ELF 可执行文件通常 被链接为不同的段,常见的段譬如.text、.data、.rodata、.bss 等段

.text:已编译程序的指令代码段。
.rodata:ro 代表 read only,即只读数据(譬如常数 const)。
.data:已初始化的 C 程序全局变量和静态局部变量。
.bss:未初始化的 C 程序全局变量和静态局部变量。
.debug:调试符号表,调试器用此段的信息帮助调试。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

反汇编ELF

由于 ELF 文件无法被当做普通文本文件打开,如果希望直接查看一个 ELF 文件包 含的指令和数据,需要使用反汇编的方法
在这里插入图片描述
在这里插入图片描述
使用 objdump -S 将其反汇编并且将其 C 语言源代码混合显示出来:
在这里插入图片描述
在这里插入图片描述

gcc命令基本操作

简单编译

在这里插入图片描述

  1. 预处理:
    gcc -E test.c -o test.i 或 gcc -E test.c
    gcc 的-E 选项,可以让编译器在预处理后停止,并输出预处理结果
  2. 编译为汇编代码
    gcc -S test.i -o test.s
    在这里插入图片描述
    gcc 的-S 选项,表示在程序编译期间,在生成汇编代码后,停止,-o 输出汇编代码文件。
  3. 汇编
    gcc -c test.s -o test.o
  4. 链接
    gcc 连接器是 gas 提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生 成可执行文件。附加的目标文件包括静态连接库和动态连接库。
    gcc test.o -o test
    在这里插入图片描述

多个程序文件的编译

在这里插入图片描述
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test

  1. 检错
    a. gcc -pedantic illcode.c -o illcode
    -pedantic 选项能够帮助程序员发现一些不符合 ANSI/ISO C 标准的代码,但不是全部,事实上只有 ANSI/ISO C 语言标准中要求进行编译器诊断的 那些情况,才有可能被 GCC 发现并提出警告
    b. gcc -Wall illcode.c -o illcode
    使用它能够使 GCC 产生尽可能多的警告信息

总结

静态库链接时搜索路径顺序:

  1. ld 会去找 GCC 命令中的参数-L
  2. 再找 gcc 的环境变量 LIBRARY_PATH
  3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初 compile gcc 时写在程序内的

动态链接时、执行时搜索路径顺序:

  1. 编译目标代码时指定的动态库搜索路径
  2. 环境变量 LD_LIBRARY_PATH 指定的动态库搜索路径
  3. 配置文件/etc/ld.so.conf 中指定的动态库搜索路径
  4. 默认的动态库搜索路径/lib
  5. 默认的动态库搜索路径/usr/lib
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182494.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • currentstyle 织梦_织梦DEDE栏目高亮channel属性currentstyle采用详解[通俗易懂]

    currentstyle 织梦_织梦DEDE栏目高亮channel属性currentstyle采用详解[通俗易懂]织梦DEDECMScms被点击的栏目高亮显示办法详解,织梦DEDE栏目高亮channel属性currentstyle采用详解,废话不多说直接举例说明:织梦DEDEchannel属性currentstyle的例子:{dede:channeltype=’self’currentstyle=”~typename~”}[field:typename/]{/dede:channel}看例子样式,通过对当…

  • Redis雪崩效应的解决方案(转)[通俗易懂]

    Redis雪崩效应的解决方案(转)[通俗易懂]1、可以使用分布式锁单机版的话本地锁当突然有大量请求到数据库服务器时候,进行请求限制。使用所的机制,保证只有一个线程(请求)操作。否则进行排队等待(集群分布式锁,单机本地锁)。减少服务器吞吐量,效率低。保证只能有一个线程进入实际上只能有一个请求在执行查询操作也可以在此处进行使用限流的策略~2、缓存标记publicobjectGetProductListNew()…

  • 不能复制文字的网页文字复制怎么办_html循环粘贴

    不能复制文字的网页文字复制怎么办_html循环粘贴网页无法复制文字怎么办?当我们在电脑上需要复制某个网页上的文字时,发现我们不能选择复制粘贴文字,那这种情况该怎么解决呢,网页无法复制文字怎么办,怎么解决网页无法复制粘贴文字情况,下面就和小编一起来看看吧!1.可以使用谷歌浏览器扩展程序AllowCopy解决问题,打开谷歌浏览器的网上应用店,搜索【AllowCopy】;2.然后找到SimpleAllowCopy,点击【添加至Chrome】将其…

  • QT之QFile[通俗易懂]

    QT之QFile[通俗易懂]1、QFile::QFile()构造一个没有名字的QFile对象2、QFile::QFile(constQString&name)构造一个以name为文件名的QFile对象。注:也可以QFile::QFile(),然后调用setName()方法来实现类似动作。3、bootQFile::atEnd()const[虚函数]如果已经到达文件末尾则返回TR

  • bfs是什么意思_bfs轮

    bfs是什么意思_bfs轮Rubik 先生在发明了风靡全球的魔方之后,又发明了它的二维版本——魔板。这是一张有 8 个大小相同的格子的魔板:1 2 3 48 7 6 5我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列 (1,2,3,4,5,6,7,8) 来表示,这是基本状态。这里提供三种基本操作,分别用大写字母 A,B,C 来表示(可以通过这些操作改变魔板

  • 一条语句改变进度条颜色及去掉进度条边框

    一条语句改变进度条颜色及去掉进度条边框 一、        改变进度条颜色 在VC里想改变进度条颜色,在网上找了很多方法,都很麻烦,觉得很郁闷。后来想起在用VB做时,增经用API实现过,很简单。后来再一查,原来是SendMessage这个函数,几经试验,终于成功,高兴,与大家分享!!!!      代码如下:          m_Progress1.SendMessage(PBM_SETBKCOLOR,0,R

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号