导航:首页 > 源码编译 > 编译连接器连接时间硬盘

编译连接器连接时间硬盘

发布时间:2022-06-08 13:01:41

‘壹’ C语言编译连接后生成那么多文件是什么

不要把保存目录设为桌面,应该设置成一个单独的文件夹
在一开始创建的时候它会问你保存路径
一项工程有两种生成文件的方式:
一是DEBUG
这种文件可以方便调试,可以在具体行中设置断知点,运行时对程序中各种变量进行观测
二是RELEASE
这种文件只能用来运行,不能用来调试
DEBUG文件夹所占硬盘存储空间大,开发过程中一般选择生成DEBUG文件
RELEASE文件夹占道用空间小,最终开放版本给用户时选择用这种方式生成

‘贰’ 捆绑器的编译器捆绑法

暂时不知用什么名字来形容,所以只能用这个来代替。这种方法相当的阴险。是将要捆绑的文件转换成16进制保存到一个数组中。像这样muma:array[0..9128] of Byte=(D,A,....);然后用时再用API函数CreateFile和WriteFile便可将文件还原到硬盘。这里稍稍学过编程的都知道。代码中的数组经过编译器、连接器这么一搞。连影都没了。哪还能有什么文件是吧?所以就这种方法而言,目前还没有可以查杀的方法。这种方法可以利用编程辅助工具jingtao的DcuAnyWhere或Anskya的AnyWhereFileToPas来实现。
最最毒辣的一种。因为暂时用的人较少,且危害性及查杀难度太大。[一个被杀的病毒直接捆绑就能免杀]所以就不公布了。此法查杀方法通用性极差。如果流行,估计大家连动画都不敢下着看了。 可以利用一些第三方工具将硬盘和注册表监视起来以后再运行那些你不确定是否被捆绑的程序。这样,一旦硬盘出现变化,或有文件新建,或有文件改变都会被记录在案。就算是查找起来也方便一点。

‘叁’ 连接:将目标程序与库文件连接形成EXE的过程

(注:link一般翻译成“链接”,join等可以翻译成“连接”。)
库文件是已经被编译的目标代码文件,通过链接过程进行代码的定位以执行这些代码。链接可以分为静态链接和动态链接,前者是在编译期完全确定所需要的执行的代码集合,通过程序中编译并链接(链接器链接.lib、.a等静态库文件和.obj、.o等其它目标文件)的目标代码指令定位调用代码,比较直接,时间效率通常较高,但生成的可执行文件可能会很大,且非常不方便在运行期共享目标代码;后者是程序在运行期载入动态库文件(例如.dll、.so)然后定位需要的代码,优点是共享目标代码方便,可执行文件体积可以很小,缺点是技术较复杂,平台相关性大导致跨平台性差,移植可能比较困难,此外动态库文件的依赖性和版本管理可能会非常麻烦(比如“dll地狱”)。
对于库文件,可以通过编译程序中的归档程序(生成静态库文件;例如lib.exe、ar)和动态库生成程序(可能是编译器和链接器)生成,当然实现的编译还是要通过编译器(例如cl.exe、gcc)。高级的用法可以使用make工具(例如VC++的NMake,GCC配套的GNU make等)来管理的这些源文件和目标文件的依赖性。一般IDE中建立专门类型的工程可以简化或者不使用命令行操作,在全编译时同时产生可执行文件和库文件(也可以不产生可执行文件)。
====
[原创回答团]

‘肆’ 自编译的openwrt x86固件需要多少时间和多少磁盘空间

您好,很高兴为您解答。

去官方下载一个镜像生成器,直接把需要的组件打包进去,编译一次才几分钟。

如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!

~ O(∩_∩)O~

‘伍’ android studio编译时间长 中端电脑瓶颈是机械硬盘还是cpu 固态硬盘对速度提升大吗

这个速度和机械硬盘的读取速度有关,固态硬盘的写入速度别HDD快多了,一般在70MB/S 以上吧

‘陆’ C语言编译好后怎么链接

在绝大多数C/C++的集成开发环境(如VC6、VS、TC、QT)中,编译和链接都可以通过一个按键解决。以VC6为例,你可以通过build按钮(快捷键F7)一步完成编译和链接,当然你也可以先编译(compile 快捷键Ctrl+F7),后点击build按钮,效果是一样的。

编译和链接,其实就是编译型编程语言(解释性编程没有这个步骤)的生成可执行文件的两个步骤。
编译,是为了将源代码生成目标文件(也叫中间文件);链接,是将目标文件生成最终的可执行文件。
通常,在命令行编译模式下,你都需要执行两个命令来分别完成编译和链接,但在集成开发环境中,这不是必要的,完全可以一键完成。
之所以分两步,主要的设计目的,就是用不同的连接器可以生成在不同平台和不同环境下使用的可执行文件。但这个在同一个图形化的IDE界面中并没有什么意义。

‘柒’ C文件如何成为可执行文件(编译、链接、执行)——摘自《程序员的自我修养》

本文算是我阅读《程序员的自我修养》(俞甲子等着)相关章节的笔记,文中直接引用了原书中的叙述,强烈建议大家去看原书,本文只做概要介绍而用。——注:文中有很多引用图的地方,请大家自己去找原书看,支持正版!我遇到一个问题,linux C编程中的问题:.. char *p; unsigned int i = 0xcccccccc; unsigned int j; p = (char *) &i; printf("%.2x %.2x %.2x %.2x\n", *p, p[1], p[2], p[3]); memcpy(&j, p, sizeof(unsigned int)); printf("%x\n", j); ... Output: ffffffcc ffffffcc ffffffcc ffffffcc 0xcccccccc My questions are: 1. Why it prints "ffffffcc ffffffcc ffffffcc ffffffcc"? (if p is unsigned char* then it will print correctly "cc cc cc cc") 2. Why pointer to char p copied to j correctly, why not every member in p overflow? since it is a signed char. 这是别人在邮件列表中提出的问题,在试图回答这个问题的过程中,突然发现,自己对连接器的工作并不熟悉,因此拿来好书《程序员的自我修养》来看,并做如下汇报,强烈推荐《程序员的自我修养》!!!写好的C语言文件,最终能够执行,大致要经过预处理、编译、汇编、链接、装载五个过程。预编译完成的工作: (1)将所有的"#define"删除,并展开所有的宏定义 (2)处理所有条件预编译指令 (3)处理#include预编译指令,将被包含的文件插入到预编译指令的位置,这个过程是递归进行的。 (4)删除所有的注释 (5)添加行号和文件名标识,以便调试 (6)保留所有的#pragma编译器命令,因为编译器需要使用它们。编译完成的工作: (1)词法分析 扫描源代码序列,并将其分割为一系列的记号(Token)。 (2)语法分析 用语法分析器生成语法树,确定运算符号的优先级和含义、报告语法错误。 (3)语义分析 静态语义分析包括生命和类型的匹配,类型的转换;动态语义分析一般是在运行期出现的与语义相关性的问题,如除0错。 (4)源代码生成 源代码级优化器在源代码级别进行优化:如将如(6+2)之类的表达式,直接优化为(8)等等。将语法书转换为中间代码,如三地址码、P-代码等。 (5)代码生成 将源代码转换为目标代码,依赖于目标机器。 (6)目标代码优化汇编完成的工作: 将汇编代码变成机器可以执行的指令链接完成的工作: 链接完成的工作主要是将各个模块之间相互引用的部分处理好,使得各个模块之间正确衔接。链接过程包括:地址和空间分配、符号决议和重定位。 首先讲静态链接,基本的静态链接如下: 我们可能在main函数中调用到定义在另一个文件中的函数foo(),但是由于每个模块式单独编译的,因此main并不知道foo的地址,所以它暂时把这些调用foo的指令的目标地址搁置,等到最后链接的时候让连接器去修正这些地址(重定位),这就是静态链接最基本的过程和作用;对于定义在其他文件中的变量,也存在相同的问题。具体过程如下: (1)空间和地址分配 1)空间与地址分配:扫描所有输入目标文件,获得各个段的属性、长度和位置,并且将目标文件中的符号表中所有的符号定义和符号引用收集起来,放到一个全局符号表中。 2)符号解析和重定位:使用第一步收集到的信息,读取输入文件中段的数据、重定位信息,并进行符号解析与重定位、调整代码中的地址等。 动态链接的过程更为复杂,但是完成的工作类似。 动态链接的初衷是为了解决空间浪费和更新困难的问题,把链接过程推迟到运行时进行 首先介绍一个重要的概念——地址无关代码。为了解决固定装载地址冲突的问题,我们希望对所有绝对地址的引用不作重定位,而把这一步推迟到装载的时候再完成,一旦模块装载地址确定,即目标地址确定,那么系统对程序中所有的绝对地址引用进行重定位。同时我们希望,模块中共享的指令部分在装载时不需要因为装载地址的改变而改变,所以把指令中那些需要被修改的部分分离出来,跟数据放在一起,这样指令部分就可以保持不变,而数据部分可以在每个进程中拥有一个副本,这种方案目前被称为地址无关代码(PIC,Position-independent Code)。 我们需要解决如下四种引用中的重定位问题: 1)模块内部调用或者跳转:这个可以用相对地址调用或者基于寄存器的相对调用,所以不需要重定位2)模块内部数据的访问:用相对寻址的方法,不过链接器实现得十分巧妙: call494 <__i686.get_pc_thunk.cx> add$0x188c, %ecx mov$0x1, 0x28(%ecx) //a=1 调用一个叫做__i686.get_pc_thunk.cx的函数,把call的下一条指令的地址放到ecx寄存器中,接着执行一条mov指令和一个add指令3)模块间数据的访问:在数据段里建立一个指向全局变量的指针数组,也成全局便宜表(GOT),当要引用全局变量时,可以通过GOT相对应的项间接引用: GOT是做到指令无关的重要的一环:在编译时可以确定GOT相对于当前指令的偏移,根据变量地址在GOT中的偏移就可以得到变量的地址,当然GOT中哪个每个地址对应于哪个变量是由编译器决定的。4)模块间的调用、跳转:采用上面类似的方法,不同的是GOT中相应的项存储的是目标函数的地址,当模块需要调用目标函数时,可以通过GOT中的项进行间接跳转。 地址无关代码小结: 现在,来看动态链接中的另一个重要问题——延迟绑定(PLT)。当函数第一次被用到时才进行绑定,否则不绑定。PLT为了实现延迟绑定,增加了一层间接跳转。调用函数并不是通过GOT跳转的,而是通过一个叫PLT项的结构进行跳转的,每个外部函数在PLT中都有对应的项,如函数bar,其在PLT对应的项的地址记为bar@plt,实现方式如下: bar@plt: jmp* (bar@GOT) pushn pushmoleID jump_dl_runtime_resolve 链接器的这个实现至为巧妙: 如果在连接器初始化阶段,已经正确的初始化了bar@GOT,那么这个跳转指令的结果正是我们所期望的,但是,为了实现PLT,一般在连接器初始化时,将"pushn"的地址放入到bar@GOT中,这样就直接跳转到第二条指令,相当于没有进行任何操作。第二条指令“pushn”,n是bar这个符号引用在重定位表“.rel.plt”中的下标。接着将模块的ID压栈,跳转到_dl_runtime_resolve完成符号解析和重定位工作,然后将bar的地址填入到bar@GOT中。下次再调用到bar时,则bar@GOT中存储的是一个正确的地址,这样就完成了整个过程。 在链接完成之后,就生成了你要的可执行文件了,如ELF文件,至于这个文件的详细的信息,可以参考相关的文档。 现在,你要运行你的可执行文件,这是如何做到的呢? 我们从操作系统的角度来看可执行文件的装载过程。操作系统主要做如下三件事情:(1)创建一个独立的虚拟地址空间,但由于采用了COW机制,这里只是复制了父进程的页目录和页表,甚至不设置映射关系(参考操作系统相关书籍)。(2)读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。(3)将CPU的指令寄存器设置成可执行文件的入口地址,启动运行。我们来看一下执行过程中,进程虚拟空间的分布。 首先我们来区分Section和Segment,都可以翻译为“段”,那么有什么不同呢?从链接的角度来讲,elf文件是按照Section存储的,从装载的角度讲,elf文件是按照Segment存储的。”Segment”实际上是从装载的角度重新划分了ELF的各个段,将其中属性相似的Section合并为一个Segment,而系统是按照Segment来映射可执行文件的。

‘捌’ 关于交叉编译工具链的问题

核心转储是崩溃报告的一个过程,他只是把当前崩溃的信息转存出来方便差错。而且这个核心转储几个字也不过是个提示输出信息。这个提示不会给与任何与错误相关的内容,必须看其他的错误信息或者他转储出来的东西来分析。
不过核心转储,应该是程序运行出错而崩溃。这种问题出现在你正在运行的程序,而不是编译过程出现的编译错误(也就是说,出现核心转储应该就是 GCC 或者他调用的程序自己崩溃了)。出现这个问题的原因很多。

如果是因为没有找到某些 header 文件,不应该是核心转储错误,而是编译器或者某个过程提示错误信息后退出,他会输出错误信息告诉你问题所在。

至于你编译的这些东西版本都比较老,我建议还是尝试降级整个系统来编译、运行你现在的这些东西。或者升级你这个交叉编译工具链到当前主流的版本来用。

至于交叉工具连当中的 GCC 和你当前本机的 GCC,完全是两个互相独立的 GCC 。
只是他们编译输出的二进制程序针对的指令集不同而已。相对的 binutils 和 glibc 和 kernel-header 都是一样的意思,针对目标而输出的相关程序。当然 glibc 和 kernel-header 主要是以“数据”方式存在,gcc 和 binutils 主要是以可以运行的程序方式存在(当然不是绝对的,比如 gcc 还会提供几个 lib 相关的内容,不过大部分情况下你可以这么理解更直观了解他们的作用)。
一般说来 GCC 是编译器,binutils 是连接器,glibc 是标准 C 库(主要是连接时,连接器必须有目标的函数库文件,也就是 .so 文件,对应 Windows 是 .dll 文件。连接器把函数调用正确的挂接到对应的函数入口上)。linux header 就是 C 语言常见的 C header 文件和相关的开发数据。一般主要用来编译 glibc ,glibc 作为中间层来提供内核相关调用。当然程序有些时候也会直接调用内核函数,这样这些程序在编译时也需要 kernel 的 header 。

这两套东西一个输出你当前 PC 的程序,一个输出 ARM 的程序。两个 GCC 套装之间不能互相替换。只能自己输出属于自己的程序。
但是这两套程序虽然输出的程序不同,但可以运行的部分,却都是在你的计算机上运行。而且你本机的 GCC 因为可以输出本机的程序。所以你需要用他来输出在你本机运行,但是却输出 ARM 程序的 GCC 套装。

这就好比两个锤子,一个锤子用来打铁,一个锤子用来打锡。用途不同,但这两个锤子都是铁做的。
你作这个交叉编译工具链,就是用你手里已经有的打铁的锤子,打出一个用铁制作的用来打锡的锤子。这个打锡的锤子是不能打铁的,同样这个打铁的锤子是不能用来打锡的。

‘玖’ 在VS2010的VC++中如何编译、链接、运行、调试程序

在vc2010中看不到像VC6.0显式的编译、连接按钮了。只有工具栏(启动调试)和菜单栏(测试)

这些功能包含编译、链接、运行(调试)所有步骤,都一键完成。

实际上这些功能是编译器使用以下工具实现的:

编译器CL.EXE,将.c/.cpp源代码编译成目标代码.obj,

连接器LINK.EXE,将目标代码和库连接生成最终文件;

资源编译器RC.EXE(.rc)将资源编译,最终通过连接器存入最终文件.

注意编译准备:VCVARS32.bat拷贝到当前的workspace下在cmd下执行之后就可以

直接使用这些编译工具在cmd下编译.

-----------------------------------------------------------

例子:记事本编辑hello.c,在按照上面要求拷贝到当前目录下,打开cmd

CL.EXE /c hello.c只编译不连接

LINK.EXE hello.obj 用到的库文件,生成可执行文件.如:

LINK.EXE hello.obj user32.lib

RC.EXE Hello.rc

-----------------------------------------

CL.EXE,LINK.EXE,vcvars32.bat所在目录:假定VS2010使用默认安装路径

C:Program FilesMicrosoft Visual Studio 10.0VCin

rc.exe所在路径:

C:Program FilesMicrosoft SDKsWindowsv7.1ABin

注意:

(1)这些EXE文件在vs2010下可能存在多个不同路径,但都是一样的,可以通用

(2)如果电脑上安装了不同的VS版本,这些文件会不同,注意区分。使用同一VS版本下的文件。

‘拾’ 简述一下编译器和链接器的作用

1、编译器:
编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。
2、链接器:
当链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定义表,对其中记录的地址进行重定向(加上一个偏移量,即该编译单元在可执行文件上的起始地址)。
然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实现地址。最后把所有的目标文件的内容写在各自的位置上,再作一些另的工作,就生成一个可执行文件。

阅读全文

与编译连接器连接时间硬盘相关的资料

热点内容
算法的两要素是什么和什么 浏览:772
如何创建服务器多用户 浏览:654
javaonlinejudge编译错误 浏览:65
命令与征服3泰伯利亚战争升级 浏览:690
投标工具需要加密锁吗 浏览:503
苏州阿里云服务器服务电话 浏览:783
怎么知道app专属流量 浏览:62
单片机模拟动画教程 浏览:735
linux解压镜像 浏览:164
c语言可以在哪编译 浏览:127
如何对spl的密码加密 浏览:73
oppoa59s如何添加应用加密 浏览:514
比特币asic算法 浏览:175
查看服务器外网访问地址 浏览:856
魔兽争霸地图最新加密 浏览:685
畅捷云APP怎么l发票 浏览:211
黑马程序员与传智播客 浏览:519
geany不能编译中文吗 浏览:523
和平精英怎么开启新服务器 浏览:541
单片机的典型应用 浏览:378