‘壹’ 写好的c语言是怎么在电脑上执行
这个过程是这样的。
首先你写好了C源程序,以文件的形式保存在磁盘上。
然后需要用编译器编译这个源程序,编译器可以是GCC,也可以是TC(Turbo C),也可以是别的……
编译的过程就是把C的代码转换成类汇编代码,也就是机器能直接执行的东西。初学者开始不用太关心编译的细节,这是个很麻烦、很复杂的过程,中间也有很多环节。编译后的产出是目标文件--习惯上叫obj文件,在win中名字习惯为xxx.obj,在unix中习惯用xxx.o。
上述产生的目标文件只是你自己写的,还要把里面使用的一些系统库连接上,比如printf,strcmp这些函数。不太恰当的比喻就是粘在一起。
当然,也有的程序不用连接其他的库。连接之后,根据平台的不同以及编译环境的不同,产生在某平台可以直接运行的二进制文件,win下是exe文件,linux下是elf文件。
这就是从源代码到二进制可执行文件的大概过程。
‘贰’ C语言文件的编译与执行的四个阶段并分别描述
开发C程序有四个步骤:编辑、编译、连接和运行。
任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。
1、预处理:导入源程序并保存(C文件)。
2、编译:将源程序转换为目标文件(Obj文件)。
3、链接:将目标文件生成为可执行文件(EXE文件)。
4、运行:执行,获取运行结果的EXE文件。
(2)加载elf并执行C语言扩展阅读:
将C语言代码分为程序的几个阶段:
1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。
2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。
3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。
4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。
‘叁’ C语言哪些函数语句的机器码会存储在内存中
自然不会,每一个变量(包括函数)都有自己的生命周期,程序结束后释放所有的内存,程序运行时只有被声明为inline内联函数,或者正在被调用的函数(也就是你上面收提及的第一种情况)存储在内存中(栈区),调用完毕后立即释放内存。
回答完毕,祝楼主学习进步。
‘肆’ 怎样创建真正很小的Linux下的ELF可执行文件
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发 人员,你最好熟悉并掌握它。
其实,关于ELF这个主题,网络上已经有相当多的文章存在,但是其介绍的内容比较分散,使得初学者不太容易从中得到一个系统性的认识。为了帮助大家 学习,我这里打算写一系列连贯的文章来介绍ELF以及相关的应用。这是这个系列中的第一篇文章,主要是通过不同工具的使用来熟悉ELF文件的内部结构以及 相关的基本概念。后面的文章,我们会介绍很多高级的概念和应用,比方动态链接和加载,动态库的开发,C语言Main函数是被谁以及如何被调用的,ELF格 式在内核中的支持,Linux内核中对ELF section的扩展使用等等。
‘伍’ 有关elf ,c语言编程,电子词典
ELF(Executable and Linking Format)是可执行连接格式
可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口
(Application Binary Interface(ABI)而开发和发布的。工具接口标准委
员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操
作系统之间可移植的二进制文件格式。
用linux的gcc编译器就可以生成elf文件
金山词霸里的*.dic文件是词典文件 ,估计6188也是
不过格式应该不一样的
dic估计是dictionary
‘陆’ elf文件增加一个节
则加载器将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选.
‘柒’ 自己怎么加载elf文件,并能调用里面的函数执行
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发人员,你最好熟悉并掌握它。
其实,关于ELF这个主题,网络上已经有相当多的文章存在,但是其介绍的内容比较分散,使得初学者不太容易从中得到一个系统性的认识。为了帮助大家学习,我这里打算写一系列连贯的文章来介绍ELF以及相关的应用。这是这个系列中的第一篇文章,主要是通过不同工具的使用来熟悉ELF文件的内部结构以及相关的基本概念。后面的文章,我们会介绍很多高级的概念和应用,比方动态链接和加载,动态库的开发,C语言Main函数是被谁以及如何被调用的,ELF格式在内核中的支持,Linux内核中对ELF section的扩展使用等等。
好的,开始我们的第一篇文章。在详细进入正题之前,先给大家介绍一点ELF文件格式的参考资料。在ELF格式出来之后,TISC(Tool Interface Standard Committee)委员会定义了一套ELF标准。你可以从这里()找到详细的标准文档。TISC委员会前后出了两个版本,v1.1和v1.2。两个版本内容上差不多,但就可读性上来讲,我还是推荐你读 v1.2的。因为在v1.2版本中,TISC重新组织原本在v1.1版本中的内容,将它们分成为三个部分(books):
a) Book I
介绍了通用的适用于所有32位架构处理器的ELF相关内容
b) Book II
介绍了处理器特定的ELF相关内容,这里是以Intel x86 架构处理器作为例子介绍
c) Book III
介绍了操作系统特定的ELF相关内容,这里是以运行在x86上面的 UNIX System V.4 作为例子介绍
值得一说的是,虽然TISC是以x86为例子介绍ELF规范的,但是如果你是想知道非x86下面的ELF实现情况,那也可以在中找到特定处理器相关的Supplment文档。比方ARM相关的,或者MIPS相关的等等。另外,相比较UNIX系统的另外一个分支BSD Unix,Linux系统更靠近 System V 系统。所以关于操作系统特定的ELF内容,你可以直接参考v1.2标准中的内容。
这里多说些废话:别忘了 Linus 在实现Linux的第一个版本的时候,就是看了介绍Unix内部细节的书:《The of the Unix Operating System》,得到很多启发。这本书对应的操作系统是System V 的第二个Release。这本书介绍了操作系统的很多设计观念,并且行文简单易懂。所以虽然现在的Linux也吸取了其他很多Unix变种的设计理念,但是如果你想研究学习Linux内核,那还是以看这本书作为开始为好。这本书也是我在接触Linux内核之前所看的第一本介绍操作系统的书,所以我极力向大家推荐。(在学校虽然学过操作系统原理,但学的也是很糟糕最后导致期末考试才四十来分,记忆仿佛还在昨天:))
好了,还是回来开始我们第一篇ELF主题相关的文章吧。这篇文章主要是通过使用不同的工具来分析对象文件,来使你掌握ELF文件的基本格式,以及了解相关的基本概念。你在读这篇文章的时候,希望你在电脑上已经打开了那个 v1.2 版本的ELF规范,并对照着文章内容看规范里的文字。
‘捌’ GCC amp;ELF文件格式 amp;linux内核怎么加载和启动一个可执行程序
你的问题可以这样问:为什么同样都是“程序”(C代码),同样都是GCC编译,有的成了应用程序,有的成了内核? 内核从文件的角度来看,就是一个编译好的映像,它的格式和ELF是不同的。因为前者是在没有文件的概念下,先运行起来,支撑操作系统的其...
‘玖’ 数据结构c语言怎么运行啊
任何C语言程序包括用C语言编写的数据结构程序,都必须经过,编辑、编译、链接、执行四个阶断。
1、编辑,即编写源码,可以使用任何的文本编辑器来编写源码,以windows为例,即可以使用vc、vs等专业的IDE,也可以使用记事本、editplus、以及gvim等文本编辑器来编写源码。
2、编译,即通过C语言编译器对C语言源码进行编译,比如gcc、vc等等。
3、链接,编译完成后,需要通过链接器,将所有的库、编译器输出文件,合并为一个操作系统可加载的应用程序,在Windows平台这种格式为PE格式,在Linux平台这种格式称为ELF格式。
4、运行,当链接完成后,一个可执行的C语言程序就产生了,这时候通过图形界面的双击或者控制台才可以运行程序。
‘拾’ elf可执行文件如何动态加载一个so
有三个做法:
1、在elf尾部插入shellcode,然后,修改elf文件的最后一个pt_load段头的增长该段的长度。把DT_INIT节或DT_INITARRAY的指针指向你的shellcode里,一般的加固技术也是这种做法。
2、把这个elf文件A打包到另一个elf文件B里面去,在B里干完你要干的事情后,再加载A,如果不想把A释放到文件系统里,就要自己实现一个linker。娜迦的加固也是这样做的。
3、修改elf文件里的DYNAMIC节,添加一个类型为DT_NEEDED的节点,还要把要加载的so的名字写入到DT_STRSZ节里去,由于elf文件里的里的地址都是写死的,不一定有空位置让你插一个新的结点,可能要抹掉现有的才有位置插,如果对llvm熟悉,可以利用llvm把elf文件转换成一个地址无关的lir语言,再进行修改。