从源代码到可执行文件(代码片段)

东皇※太一 东皇※太一     2022-11-19     549

关键词:

请简述程序从源代码到可执行程序的过程,面试经常会被问到!

这是一个屡见不鲜的问题,总而言之就如下四个过程:

预处理

比如有test.c源文件,内容如下:

#include <stdio.h>
/*主函数*/
int main(void)

	printf("hello world\\n");//打印hello world!

	return 0;

 用预处理指令将其生成*.i文件

gcc -E -o test.i test.c // 将源文件test.c文件预处理生成test.i
                        // GCC的选项-E使GCC在进行完预处理后即停止
                        // GCC的选项-o是指定输出的文件名称

然后cat test.i查看文件的内容

这是截取test.i文件的部分内容,对比test.i与test.c文件,我们可以看出

预处理主要干了如下这些事

①展开宏#define,处理条件编译,如#if #ifdef #else #elif #endif等

②处理#include,讲其包含的文件插入到该预编译指令的位置

③删除所有的注释"//"和“/* */”

④添加行号和文件标识,方便调试时使用

编译

编译命令如下:

gcc -S -o test.s test.i // 将预处理生成的test.i文件编译生成汇编程序test.s
                        // GCC的选项-S使GCC在执行完编译生成汇编程序后停止
                        // GCC的选项-o是指定输出的文件名称

 展开test.s文件,我们可以看到,只要稍微懂点汇编语法,确实将文件转换成了汇编文件

汇编

汇编指令如下:

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

经过这一步就得到了ELF格式的可重定向的目标文件,这个文件中的内容我们是无法看懂的

链接

链接指令如下:

gcc -o test test.o

经过这一步就得到了最终的可执行程序,如:./test

一个c++源文件从文本到可执行文件经历的过程(代码片段)

一个C++源文件从文本到可执行文件经历的过程以HelloWorld为例进行说明首先我们编写一个cpp源程序test.cpp#include<iostream>usingnamespacestd;intmain()cout<<"helloworld"<<endl;return0;使用g++编译命令时g++-otesttest.cppGcc编 查看详情

从源代码到可执行文件(代码片段)

请简述程序从源代码到可执行程序的过程,面试经常会被问到!这是一个屡见不鲜的问题,总而言之就如下四个过程:预处理比如有test.c源文件,内容如下:#include<stdio.h>/*主函数*/intmain(void) printf("h... 查看详情

从源代码到可执行程序:四个步骤与详解(代码片段)

"helloworld"可以说是所有程序员闭着眼睛都能写出来的代码:#include<stdio.h>intmain()printf("helloworld");return0;编译运行一气呵成。而每当有人问起:从源码到可执行程序有哪些步骤,大多数程序员面对这个问题也能脱口而出:预处... 查看详情

源代码到可执行程序的过程详解:预编译编译汇编链接(代码片段)

1、gcc编译过程分解(1)首先是将.c源文件和.h头文件经过预编译(cpp是预编译器),得到.i文件,主要是进行的一些替换工作;(2)将.i文件经过编译器(gcc)处理,得到.s汇编文件,现在文件内容已经从C语言编程了汇编... 查看详情

从程序到进程

...p://www.civilnet.cn/bbs/browse.php?topicno=78426 本文以《从代码到可执行文件》为基础,阅读本文前确保你熟悉了《从代码到可执行文件》中提到的概念,本文中的示例程序仍是《从代码到可执行文件》中的gemfield.c。代码如下:********... 查看详情

源文件如何转换到可执行文件

...p;1)计算机只能运行本地代码(机器语言)由cpu进行解析源代码(构成源文件.c/.java)-------(翻译)---------本地代码   2)本地代码:例如Windows下的.exe文件的内容---------(Dump)-----------2位16进制的数  3)高级... 查看详情

c/c++-从代码到可执行程序的过程

(1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下:删除所有的#define,展开所有的宏定义。处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。处... 查看详情

使sym链接到可执行文件(代码片段)

我有一个shell脚本compileRun,它编译并执行C源文件。#!/bin/shgccbar.c-o./bar./bar我真正希望实现的是我们何时ln-scompileRunbar.c./bar.c我希望bar.c能够编译和执行。我感谢任何帮助。答案我理解OP想要什么。只有当源文件显式存储在与符号链... 查看详情

使用 CMake 将资源(例如,着色器代码;图像)嵌入到可执行文件/库中

】使用CMake将资源(例如,着色器代码;图像)嵌入到可执行文件/库中【英文标题】:Embedresources(eg,shadercode;images)intoexecutable/librarywithCMake【发布时间】:2012-08-0212:54:50【问题描述】:我正在用C++编写一个应用程序,它依赖于我... 查看详情

计算机系统-概述(代码片段)

...的唯一方法:根据字节序列的上下文2.编译过程从源文件到可执行目标文件,执行:gcc-ohellohello.c分为四个阶段:预处理阶段:预处理器(cpp)修改原来的C程序,得到hello.i文件编译阶段:编译器(ccl)将hello.i文件翻译成hello.s文... 查看详情

静态库中的符号有时会链接到可执行文件,有时不会

】静态库中的符号有时会链接到可执行文件,有时不会【英文标题】:symbolsinstaticlibrarysometimesgotlinkedintoexecutable,sometimesnot【发布时间】:2019-01-1010:27:59【问题描述】:我有一个静态库,它是使用g++从linux上的许多cpp文件生成的。... 查看详情

mysql提权的几种方式(代码片段)

...在DLL文件中;在编译时,编译器不会把函数的机器码复制到可执行文件EXE中,而是在EXE执行文件中说明索要调用的函数在哪个DLL文件中,程序在执行时会自动从DL 查看详情

#从源码到可执行程序

从源码到可执行程序从源码到可执行程序1.概述2.预编译3.编译4.汇编5.链接1.概述  很多编译型语言的源码都需要被编译之后才可以正常的运行,如常用的c语言,它需通过编辑器的编译把它变成0101序列的机器语言才可以在... 查看详情

将多个背景图像文件添加到可部署项目中(代码片段)

我看了,没有看到解决我问题的答案。我有一个使用随机文件作为背景图像的应用程序。我目前将这些图像存储在本地计算机上的文件夹中,然后遍历文件夹以将图像文件名加载到ArrayList中,该工作正常。但是,当我将应用程序... 查看详情

第20课链接过程简介(代码片段)

...链接: 静态链接就是将库文件或者目标文件直接加入到可执行文件当中。Linux下静态库的创建和使用: 静态库示例程序:20-1.c1#include<stdio.h>23externchar*name();4externintadd(inta,intb);56 查看详情

php从php文件执行数据库备份查询(代码片段)

查看详情

c程序(代码片段)

...的库文件(.so等)链接成最终的可执行文件(executablefile)xxx.c源代码xxx.i预处理后的代码xxx.s汇编代码xxx.out链接器输出DirectiveMeaning#include包括一个源文件#define定义宏#undef取消定义一个宏  查看详情

动态库和静态库(代码片段)

...的打包与使用使用动静态库的基本原理我们知道从源文件到可执行程序需要如下经历4个步骤预处理:完成头文件展开、去注释、宏替换、条件编译等,形成xxx.i文件。编译:完成词法分析、语法分析、语义分析、符号... 查看详情