编译+dll/lib
文章平均质量分 73
《计算机系统基础》作者:袁春风
《程序员的自我修养》
《深入理解计算机系统》
云中飞鸿--**峰
这个作者很懒,什么都没留下…
展开
-
程序构建工具makefile 和 打包工具NSIS区别
NSIS使用一种特定的脚本语言,允许开发者编写安装程序的行为,包括安装过程中的界面设计、文件复制、注册表操作等。NSIS的目的是为了提供一个灵活且功能强大的工具,使得开发者能够轻松地打包他们的应用程序,并提供一个用户友好的安装体验。它支持多种编译器和平台,通过编写Makefile文件,可以控制编译和链接的过程,确保生成的二进制文件正确无误。总之,Makefile和NSIS虽然都是软件开发中重要的工具,但它们各自服务于不同的目的:前者用于编译和链接源代码,后者用于创建Windows安装程序。原创 2024-09-03 10:50:48 · 330 阅读 · 0 评论 -
静态库为什么需要 头文件?编译的时候会编译引用的动/静态库吗?动静态库使用及区别
然而,当其他开发者想要使用这些库函数时,他们需要知道这些函数的接口信息,包括函数名、参数类型、返回值类型等,以便正确地调用这些函数。头文件包含了函数的声明,但不包含函数的实现代码,它主要起到描述性作用,使得多个代码文件可以共享全局变量和函数声明,避免定义冲突,并提高代码的模块化和可维护性12。因此,使用静态库编译的程序不依赖于外部库文件,可以在没有安装这些库的机器上独立运行。(如果exe引用的有动态库,将exe拷贝给客户使用的时候,必须要给动态库一起拷贝过去。,程序(exe)运行时将不再需要该静态库。原创 2024-09-03 10:21:52 · 246 阅读 · 0 评论 -
判断dll/lib是32/64位、查看lib是导入库/静态库的方法 、查看dll包含的符合、lib包含的函数
直接用记事本或者notepad++(或txt文本)打开exe文件(dll文件),会有很多乱码,不要头疼,接下来只需要在第二段中找到PE两个字母,在其后的不远出会出现d?开始-》所有程序-》Microsoft Visual studio 2010-》visual studio tools-》Visual studio 命令提示符。开始-》所有程序-》Microsoft Visual studio 2019-》点击“开发人员命令提示符”的选项。显示dll的:是导入库,显示.obj或者.o:是静态库;原创 2024-05-06 13:54:26 · 838 阅读 · 0 评论 -
静态lib文件,动态lib文件和dll文件的区别
关于lib文件的介绍-CSDN博客1.前言:出现.lib, .dll这种文件的原因:一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库;2. 用OpenCVbin文件夹里面放的都是dll文件;lib文件夹里面放的都是伴随dll文件的动态lib文件;staticlib文件夹里面放的才是真正的静态lib文件,和dll文件是独立的;原创 2024-05-06 11:25:02 · 719 阅读 · 0 评论 -
call 指令调用方式
这篇文章中,我们介绍了 call 指令的几种调用方式,举出具体代码示例说明其使用方式,并查看了相应机器码。然后通过反汇编或者直接查看机器码的方式,进一步验证了原理与实际指令布局的契合。原文链接:https://www.jianshu.com/p/55726f7e355a。原创 2024-04-30 16:15:49 · 965 阅读 · 0 评论 -
X86汇编指令大全
原文链接:https://blog.csdn.net/hbuxiaofei/article/details/131490591。原文链接:https://blog.csdn.net/hbuxiaofei/article/details/131490591。它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。七、处理机控制指令:标志处理指令。原创 2024-04-30 15:10:05 · 378 阅读 · 0 评论 -
机器码、指令、指令集、汇编语言、高级语言
在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbo1)或标号(Labe1)代替指令或操作数的地址。由于不同的硬件平台,执行同一个操作,对应的机器码可能不同,所以不同的硬件平台的同一种指令(比如mov),对应的机器码也可能不同。指令就是把机器码中特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好。用它编写的程序一经输入计算机,CPU 直接读取运行,因此和其他语言编的程序相比,执行速度最快。不同的硬件平台,各自支持的指令,是有差别的。原创 2024-04-30 14:54:48 · 744 阅读 · 0 评论 -
x86汇编指令集中:指令分析、offset、标号
(其中 ModRM, SIB, displacement, immediate 可选。字节长的调用指令(机器码+操作数)e8 00 00 00 00。那么,指令编码中,0x11223344 是按小端序存放。是:0x11223344。假如 call 指令。原创 2024-04-30 14:51:14 · 178 阅读 · 0 评论 -
汇编指令和机器码对应关系
从400FF2跳转到405000,但是机器码是E9 09400000(4009)E9是操作码,操作数是4009,其实这样一个对应关系:4009+EIP(400FF2)+5=405000,数字5代表这个跳转操作占据5个字节;从4010FA跳转到40110E,同样,操作码是EB,操作数12,对应关系:12+EIP(4010FA)+2=40110E ,数字2代表跳转操作占据2个字节。操作码是E8,操作娄是00000003,对应关系:3+EIP(401000)+5=401008,5是占用5个字节。原创 2024-04-30 14:42:49 · 265 阅读 · 0 评论 -
反汇编:OllyDBG/objdump分析
反汇编中的第四列:是强大的od反汇编工具为我们提供的注释功能,能看到一些windows api,或是一些可读的信息。反汇编中的第三列:是我们研读的目标了,它是我们需要学习型的汇编语言;ALT+F9:执行到用户代码,可以快速地从系统领空返回到程序领空。CTR+F9:执行到返回,会在第一个遇到的RET指令暂停。F2:在光标处设置断点,再按一次删除光标处的断点。F8:单步步过,遇到CALL等函数会跳过,不进入。反汇编中的第二列:是所谓的汇编语言中的操作码;反汇编中的第一列:是指令在内存中存放的地址;原创 2024-04-29 15:04:51 · 453 阅读 · 0 评论 -
程序链接步骤2:重定位
确定新节中所有的符号定义在虚拟地址空间中的地址。例如,为函数确定首地址,进而确定每条指令的地址,为变量确定首地址。在main.o和swap.o的重定位条目中有重定位信息,反映符号引用的位置、绑定的符号名、重定位类型。链接步骤2“重定位”: 将引用符号的地址“重定位”为相关联的符号定义的地址。需要用到 .rel.text 和 .rel.data节中保存的重定位信息。E中有main.o和swap.o两个模块,D中有所有定义的符号。修改.text节和.data节中对每个符号的引用(地址)① 首先进行符号解析。原创 2024-04-27 17:40:07 · 421 阅读 · 0 评论 -
程序链接步骤1:符号解析(符号 和 符号表)
2. 链接器的局部符号 不是指程序中的局部变量(分配在栈中的临时性变量),链接器不关心这种局部变量;2.2 什么是符号的定义,什么是符号的引用?符号的定义:就是程序中变量名、函数名的。符号的引用:就是程序中变量名、函数名的。(位于定义位置的 变量名、函数名);(不在定义位置的 变量名、函数名);,它包含了在m中定义和引用的符号,有。,不会在过程外被引用,因此。有哪些,各自有什么特点?符号:就是其实程序中的。2.4 符号表是什么?2.1 什么是符号?不在符号的类型中;原创 2024-04-27 11:20:54 · 656 阅读 · 1 评论 -
目标文件(.o/.obj) 分为几种形式?
但是这种可重定位的目标文件还不可以直接执行,原因是这些指令和数据中往往引用其他模块(目标文件)中的符号。这种操作成为“重定位”,因此这种目标文件成为“可重定位的目标文件”的后缀名通常是.o。所不同的是,这种文件已经经过了链接操作,和所有的模块(目标文件)都产生了联系。这时,每个目标文件中引用其他目标文件中的符号都已经得到了解析和重定位。3、共享目标文件:这是一种特殊类型的可定位目标文件,可以在需要它的程序运行或者加载时,动态地加载到内存中运行。目标文件分为可执行目标文件,可重定位目标文件和共享目标文件。原创 2024-04-26 21:37:45 · 488 阅读 · 1 评论 -
变量的内存分配 及 储存位置
栈主要保存函数的局部变量和参数以及返回值。首先要知道,我们在应用程序中所使用的地址均是虚拟内存地址,在32位操作系统中,每一个进程所占用的虚拟内存是4G,4G的虚拟内存又分为1G的内核空间和3G的用户空间,内核空间是当前主机中所有进程共有的,用户空间是当前进程私有的,下面讲解的内存区域的划分,指的是用户空间的划分。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,所以静态区又分为两个段(data、bss后文详细解释)。转载 2024-04-26 13:54:22 · 383 阅读 · 0 评论 -
(3)C程序可执行文件的生成过程
如图,可见,如果jmp L0 和 sub C之间加入了新的指令,则只要重新确定sub C指令的地址,再填入L0即可。编译过程就是将预处理后得到的预处理文件(如hello.i)进行词法分析、语法分析、语义分析、优化后,生成汇编代码文件。经过预编译处理后,得到的是预处理文件(如,hello.i),它还是一个可读的文本文件,但不包含任何宏定义。汇编的结果是一个可重定位目标文件(如,hello.o)其中包含的是不可读的二进制代码。经过编译后,得到的汇编代码文件(如,hello.S)还是一个可读的文本文件。原创 2024-04-27 17:52:29 · 488 阅读 · 0 评论 -
(2)编译过程:一个.cpp文件到一个exe会经过哪些步骤
比如我们main函数所在的.obj文件上述了是需要使用taolaoda.obj文件中的函数,且在mian函数所在的.obj中声明了,链接器会去找其他.obj文件中找找到那个函数,然后将多个.obj文件中的东西复制到一个exe可执行文件中,我们需要使用其他文件中的函数和变量,这个就是链接器去找的,找到了虽有需要找到然后缝缝补补成一exe。看我们引用其他文件中的一个外部变量 a,但是我在其他文件中没有定义,然后链接的时候就找到了,然后就给了一个链接错误。原创 2024-04-23 16:17:28 · 1283 阅读 · 0 评论 -
(1)一个程序是 如何执行的?
然后程序执行一系列指令来加载可执行的 hello 文件,这些指令将 hello 目标文件中的代码和数据从磁盘复制到内存。一旦目标文件 hello 中的代码和数据被加载到内存,处理器就开始执行 hello 程序 的 main 程序中的机器语言指令。程序初始时等待我们输入一个命令,当在键盘上输入一个字符串“/hello”后,程序将字符逐一读入寄存器。将文本文件hello.s翻译成机器语言指令,变成二进制文件hello.o。与某些库链接,得到可执行文件,hello.o变成了hello,可以放到内存中执行。原创 2024-04-26 14:27:33 · 161 阅读 · 0 评论 -
计算机是怎么认识代码并执行的?
计算机的执行过程是一个高度协调的、分阶段的操作。从二进制表示到逻辑门、ALU和控制单元的协同工作,计算机内部通过电子信号进行信息传递和操作。指令集架构定义了计算机可以执行的操作,编译器将高级代码转化为机器码,控制单元根据指令操控其他组件来实现你编写的功能。尽管这个过程对于计算机来说是机械性的,但正是这个过程使得计算机能够成为我们日常生活中不可或缺的工具。转载 2024-04-26 16:36:47 · 57 阅读 · 0 评论 -
由于找不到**dll,无法继续执行代码,如何解决?
另一个视图显示所需文件的最小集合,以及每个文件的详细信息,包括文件的完整路径、基址、版本号、计算机类型、调试信息等。Dependency Walker可以检测许多常见的应用程序问题,例如缺少模块、模块无效、导入/导出不匹配、循环依赖性错误、模块的机器类型不匹配以及模块初始化失败。打开软件后,直接将要我们想要查看依赖关系的exe程序或者dll文件拖拽到窗口中灰色区域,拖拽后软件可能会卡顿一段时间,此时软件正在快速分析依赖关系,耐心等待即可,时间长短与依赖关系复杂程度相关。1、问题与 应用场景1。转载 2024-04-23 16:35:06 · 606 阅读 · 0 评论 -
如何查看Dll中包含了哪些函数
如何查看Dll中包含了哪些函数原创 2023-04-23 15:26:07 · 6826 阅读 · 0 评论